Solidity
伊斯坦布爾更新後 transfer() 仍然安全嗎?
換句話說,使用
transfer()
安全嗎?function transfer(address contractB) public { contractB.transfer(1000); //balances[msg.sender] -= 1000; }
怎麼用
call.gas
?function transfer2(address receiver) public { receiver.call.gas(20000).value(1000)(); }
transfer()
並且send()
應該避免(因為它們通過轉發固定數量的 gas:2300 來嚴重依賴 gas 成本)。
call{gas: ..., value: ...}("")
還應避免使用特定於氣體的程式碼 ( )。
call{value: ...}("")
應該使用,例如:contractB.call{value: 1000}("")
確保通過在之前進行所有狀態更改來防止重入也是至關重要的
call{value: ...}("")
。https://diligence.consensys.net/blog/2019/09/stop-using-soliditys-transfer-now解釋了有關最佳實踐更改的更多資訊。
應避免使用任何特定於 gas 的程式碼,因為 gas 成本可以而且將會改變。
例如,SLOAD 的 gas 成本在 2016 年從 50 提高到 200,在EIP 1884中再次提高,其中一些影響描述在: https ://chainsecurity.com/istanbul-hardfork-eips-increasing-gas-costs-and -更多的/
UNGAS是一個刪除
GAS
操作碼的想法,智能合約不會有任何 gas 概念。(Gas 仍然在協議中,但不在 EVM 中。)
上面的答案是完美的,只需注意最新版本的 Solidity 中的語法變化。
someAddress.call{value: 1 ether}('');