Solidity
為什麼編譯後的字節碼比 Solidity 程式碼大 10 倍?
我正忙於優化我的 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 倍,它只是呼叫了兩個內部函式。為什麼尺寸增加如此不成比例?
我假設您正在為
onlyOwner
and_burn
功能擴展現有的代幣合約。當你不使用繼承自合約的函式時,Solidity 編譯器不會將這些字節碼包含到你的合約中。因此,如果您只引用自己的變數,則字節碼
onlyOwner
不會_burn
出現在最終合約的字節碼中。但是一旦您使用/引用這些,就會添加字節碼(包括這些函式使用的所有字節碼)。因此,您需要查看從庫中引用的函式包含哪些程式碼。一般評論:將字元串大小與字節碼大小進行比較並不是一個好的比較,因為函式名稱和許多其他語法糖並沒有真正增加字節碼的大小。
編輯:
一些參考資料: