Solidity

如果兩個公共 getter 函式返回相同類型的輸出並且兩者都未初始化但他們為什麼要收取不同的氣體

  • July 12, 2022

我有一個有兩個 uint256 的可靠程式碼,而呼叫公共 getter 函式時,兩者都收取不同數量的氣體,為什麼會這樣?

ps 兩者都未初始化

在合約執行期間,有一個“switch”語句會跳轉到正確的函式。

例如,在虛擬碼中它可能如下所示:

mySelector = msg.data[0:4]

if (mySelector == 0x11111111) {
   // execute first function
} else if (mySelector == 0x22222222) {
   // execute second function
} else {...}

執行第一個函式時,它停在第一個if. 相反,在執行第二個函式時,它必須檢查兩個方程,這意味著它要經過更多的操作碼,消耗更多的氣體。

這是因為程式碼在乙太坊虛擬機中的執行方式:

看看我的例子,這裡我們有一個帶有兩個公共狀態變數的智能合約,編譯器會生成兩個 getter 函式

contract TestStorage{
 uint256 public b;
 uint256 public a;
}

這裡我們有我的智能合約的一部分操作碼

在此處輸入圖像描述

對於這兩種情況,要執行的程式碼是相同的,如您所見,它將首先載入值 0xDBE671F(第一個 getter 的函式選擇器)並將其與發送的值進行比較,如果值相等,它將跳轉到該函式的操作碼所在的目的地,如果值不相等,它將繼續按照您在圖像中看到的順序執行操作碼,直到找到載入第二個函式選擇器的操作碼:0x4DF7E3D0(第二個getter)這意味著當您嘗試讀取第二個狀態變數時,它會花費更多的氣體

所以總而言之,程式碼是按順序執行的,它需要一一比較函式選擇器,直到找到正確的

這就是為什麼這兩個功能收費不同的原因

觀看此影片以了解更多資訊

您可以在此處閱讀有關如何在混音中調試程式碼的資訊

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