Gas

理解一條氣體為 0x00 的 EVM 呼叫指令

  • December 4, 2018

我試圖理解從這裡生成的以下 EVM 呼叫指令:https ://ethervm.io/decompile

memory[temp3:temp3 + 0x00] = address(msg.sender).call.gas(0x00).value(var1)(memory[temp3:temp3 + memory[0x40:0x60] - temp3]);

所以基本上gas指定為發送者願意支付多少gas來將錢發送到“msg.sender”,對吧?但我對gas(0x00). 契約不能發送任何東西,對嗎?

所以基本上gas被指定為發送者願意支付多少gas來將錢發送到“msg.sender”

這種說法是不正確的。

要了解發生了什麼,您需要對如何執行低級呼叫有一個基本的了解(黃皮書本文)是很好的起點。

本質上,當執行呼叫時(隱式地,但也有例外,例如委託呼叫),發送者是正在執行的智能合約。它提供其部分記憶體的副本作為輸入,並隨著消息發送一定數量的錢。此外,發送者有權指定被呼叫者可支配的用於可能執行的氣體量。

最後,在呼叫之後,根據退出狀態,在堆棧頂部放置一個標誌。

回答

在您的情況下,執行契約只是將var1Wei 發送到msg.sender. 它msg.sender有 0 個氣體單位可供使用,因此無法執行操作。這意味著即使接收者包含回退函式,也不允許執行。

使用 0 氣體重現程式碼

一個使用(不推薦的低級)呼叫指令的簡單範例:

int var1 = 12;
msg.sender.call.gas(0).value(var1)();

您可以在此問題的答案中找到有關發送和傳輸功能的更多詳細資訊(提供有限數量的氣體,可安全防止重入但仍允許程式碼執行)。

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