Solidity

為什麼編譯後的字節碼比 Solidity 程式碼大 10 倍?

  • January 26, 2022

我正忙於優化我的 Solidity 合約,但我注意到一些我不理解的行為。

當我添加以下兩個 getter 函式時:

function getBaseReward() external view returns (uint256) {
 return _baseReward;
}

function getMaxBonuses() external view returns (uint256) {
 return _maxBonuses;
}

編譯後的合約大小增加了 0.12kb,函式本身的文本大小為 0.16kb。它們並沒有太大的不同。

但是,當我添加此功能時:

function burn(uint256 amount) external {
 onlyOwner();
 _burn(msg.sender, amount);
}

編譯後的合約大小增加了 0.87kb,但函式的文本大小僅為 0.08kb。這大約是 10 倍,它只是呼叫了兩個內部函式。為什麼尺寸增加如此不成比例?

我假設您正在為onlyOwnerand_burn功能擴展現有的代幣合約。

當你不使用繼承自合約的函式時,Solidity 編譯器不會將這些字節碼包含到你的合約中。因此,如果您只引用自己的變數,則字節碼onlyOwner不會_burn出現在最終合約的字節碼中。但是一旦您使用/引用這些,就會添加字節碼(包括這些函式使用的所有字節碼)。因此,您需要查看從庫中引用的函式包含哪些程式碼。

一般評論:將字元串大小與字節碼大小進行比較並不是一個好的比較,因為函式名稱和許多其他語法糖並沒有真正增加字節碼的大小。

編輯:

一些參考資料:

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