Solidity

伊斯坦布爾更新後 transfer() 仍然安全嗎?

  • October 17, 2021

換句話說,使用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}('');

引用自:https://ethereum.stackexchange.com/questions/78124