Solidity
契約創建氣體成本取決於庫函式中的程式碼?
我有一個使用 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