Openzeppelin-Sdk

zeppelinOS 將參數添加到 initialize()

  • July 18, 2019

我在這里關注 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 合約的原始碼

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