Solidity
我們如何才能停止“批准”的前行
function approve(address _spender, uint256 _value) returns (bool success)
這是普通的
ERC20
approval
方法。很容易發現我們有一個搶先的問題。
Alice
給 Bob 100 個代幣。- 後來,
Alice
重新考慮她的選擇,將其更改為 50。當這種情況發生時,Bob 觀察鏈,立即以更高的 gas 價格轉移他的 100 個代幣。結果,Bob 總共獲得了 150 個代幣,而不是 50 個。
我們怎樣才能避免上述情況呢?可以
commit-reveal
幫忙嗎?如果是,how
?
照原樣使用 ERC20 標準並不能解決這個問題。有關更改 ERC20 API 以防止此問題的建議,請參閱下面的連結。
https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/edit
Commit-reveal 是針對前沿攻擊的一種解決方案,但它的使用方式略有不同。即使您送出揭示了您的問題,仍然有可能進行前沿攻擊,因為您必須在揭示中暴露數量。
您可以在 2 筆交易中完成此操作
- 首先批准零令牌,等待該交易通過
- 再次批准 50 個令牌。