Contract-Development
驗證從同一個 ERC20 到同一個合約的兩筆交易的轉賬金額
我簽訂契約以分散方式出售東西,並想使用以下方法轉移基金。
function transferToken(address token, address from, uint256 amount) internal { IERC20 token_ = IERC20(token); uint256 pBalance = token_.balanceOf(address(this)); bool transferResult = token_.transferFrom(from, address(this), amount); require(transferResult == true, "Unable to transfer"); uint256 nBalance = token_.balanceOf(address(this)); require(pBalance.add(amount) == nBalance, "Invalid transfered amount"); }
問題是合約驗證新余額是否是前一個加上最後一個轉賬。這很好用,但我有疑問。
當在同一個塊中對該方法使用相同的令牌進行兩次呼叫時會發生什麼?每個事務都按照事務索引執行?在執行第二個的時候
pBalance
會用第一個更新嗎?我希望我很清楚
謝謝!
EVM 中沒有並發。它是單執行緒的。
即使兩個或多個交易可以呼叫此方法,每個交易都使用相同的 ERC20 代幣,在同一個區塊內……在該區塊內建立了一個訂單。執行令。沒有兩筆交易同時發生。一個將在下一個開始之前完成或失敗。
鑑於此,您無需擔心。
您無需擔心並發性,因此您應該能夠安全地將其減少為:
function transferToken(address token, address from, uint256 amount) internal { IERC20 token_ = IERC20(token); require(transferResult = token_.transferFrom(from, address(this), amount), "Unable to transfer"); }
如果有幫助,ERC20 介面本身和余量存在一個已知問題。
如果使用者批准轉賬但不遵守,客戶應將配額重置為零。不太直覺的是,這是一個現有的限額並且使用者希望增加它。使用者應首先將其設置為零並在設置為新的更高值之前進行確認,否則存在可能被討厭的合約利用的安全漏洞。
希望能幫助到你;