Openzeppelin-Sdk
zeppelinOS 將參數添加到 initialize()
我在這里關注 zeppelinOS 文件並總結了您執行的操作:
zos init my-project #init zeppelinOS zos add MyContract #register zos session --network local --expires 3600 #open session zos push #update code zos create MyContract --init initialize --args 42,hitchhiker #deploy and call initialize() which can all be done just once
現在它已部署,您可以添加/更改功能並再次呼叫
zos update MyContract #redeploy under same address and call initialize(42, "hitchhiker")
但現在想像一下這個案例。添加了一個新變數 foo。將 foo 添加到 initialize() 方法是有意義的。但是我現在如何呼叫 initialize() 來分配 foo=bar?
我當然打電話
zos push #problem: doesn't know default of new parameter zos update MyContract
問題:不知道新參數的預設值並忽略它
什麼不起作用:
#does not work because contract address changes zos create MyContract --init initialize --args 42,hitchhiker,bar #I guessed that command. First seems to work but does not. It reverts... zos update MyContract --init initialize --args 42,hitchher,bar #manually calling via truffle console because can only be called once myContract.initalize(42,"hitchhiker","bar")
我懷疑由於您的代理已經通過 Initializable.sol 進行了初始化,私有狀態變數“initialized”設置為 true,因此您不能在此特定代理實例中再次呼叫 initialize。
如果您創建一個新代理,連結到具有 3 個參數的邏輯合約,它應該可以工作,但不適用於已經初始化的代理。因此,我會 (1) 將帶有 3 個參數的新初始化程序添加到您的邏輯合約中,以防您想要創建新代理,以及 (2) 添加一個單獨的函式來使用新的 foo 變數升級代理,確保這也可以只能呼叫一次,例如:
upgrade(uint _foo) { require(foo === 0); foo = _foo; }
更多資訊在https://github.com/zeppelinos/zos/issues/417
您可以在https://github.com/zeppelinos/zos/blob/master/packages/lib/contracts/Initializable.sol看到 Initializable 合約的原始碼