Solidity

如果從 EOA (msg.sender) 獲取氣體,傳輸和發送如何防止重入?

  • December 12, 2019

我猜轉移和發送只是允許 2300 氣體,但沒有從契約中提取氣體?換句話說,如果一個錢包用一百萬個wei gas呼叫這個函式:

function sending() public payable
{
contract.transfer(1 ether);
balance[someone] = 0;
}

這足以阻止重入嗎?既然EOA用百萬gas發2300gas也會阻止回調?

但是,這不會阻止它,因為允許的將是 30,000+?

function sending() public payable
{
contract.call.value(1 ether)();
balance[someone] = 0;
}

傳輸和發送如何防止重入

EVM 正在扣留氣體以使攻擊者挨餓。這嚴重限制了他們在他們之前可以做的事情return

既然EOA用百萬gas發2300gas也會阻止回調?

是的,這是一種糟糕的形式,但氣體刺激應該保護這個結構不佳的功能。被呼叫的合約將沒有足夠的 gas 來改變它的狀態,或者根本沒有。

然而,這不會阻止它

這會將所有(99% 的)未用完的 gas 傳遞給被呼叫的合約(攻擊者),並且它可以使用呼叫者的不一致狀態來啟動壞事。呼叫者很容易受到攻擊,因為狀態不一致。它還沒有更新應該更新的數據。

send()、transfer() 和 call() 將流控制移交給另一個合約,函式呼叫也是如此,例如 otherContract.doSomething(args)。如果另一個合約是不受信任的,這意味著你不是自己編寫的(許多系統包含多個不同關注點的合約),那麼重要的是先整理狀態,然後將流量控制轉移到另一個合約。

天然氣津貼(2300 天然氣)是在某些時候保護一些不良契約的一種手段。這比你一直簽訂好的契約要好得多。

  1. 檢查可接受的輸入 - 允許交易?
  2. 執行效果 - 更新所有應該更新的東西。
  3. 安全地與不受信任的合約互動 - 發送、轉移、呼叫等。

希望能幫助到你。

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