Solidity

契約創建氣體成本取決於庫函式中的程式碼?

  • January 1, 2022

我有一個使用 fooLib 庫的契約 fooContract,呼叫 fooLib.foo(LibStruct storage param)

儘管參數未更改,但創建fooContract的交易成本似乎取決於 fooLib.foo() 函式中的程式碼。

IE。使用solidity瀏覽器fooContract創建成本3,185,059。如果我註釋掉 fooLib.foo() 中的程式碼,則 fooContract 創建成本下降到 2,816,000 。

據我了解,libs 是一種將合約功能移出的方法,因為合約對於區塊氣體限制來說太大了。

我在這裡錯過了一點嗎?

我懷疑沒有按照預期的方式使用庫來實現契約中的 gas 成本。我假設你在做什麼是這樣的:

library fooLib {
   // foo code
}

contract fooContract is fooLib {
   // foo code
}

在這種情況下,當您創建時,fooContract您必須為fooLib. 您要做的是自行部署 fooLib,指定如何通過 與庫進行互動interface,並在編譯fooContract. 通過這樣做,您將避免fooLib在部署時支付編譯成本,fooContract而只需在使用庫時支付交易費用。

以下 stackexchange 文章對此過程進行了詳細的描述:

關於此的一篇非常好的 aragon 文章:

庫中的內部函式在編譯時被拉入呼叫合約,並使用正常JUMP呼叫而不是DELEGATECALL. 來自 Solidity 文件:http ://solidity.readthedocs.io/en/v0.4.21/contracts.html#libraries

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