OpenZeppelin 合約昇級插件 9/9 OpenZeppelin 提供給 Truffle 的 API
函數 deployProxy 和 upgradeProxy 會返回 Truffle 合約的實體,并要求以 Truffle 合約類別(由 artifacts.require取回)做為參數。
(補充:本篇的 migrate 跟 deploy 以原文書寫,以免混淆)
deployProxy
透過傳入一個 Truffle 合約類別做為功能合約,來建立代理合約,會返品代理合約的實體地址和程式介面。在 migrate 時代理合約地址將存放在功能合約的 artifact 裡面(補充,artifact 這裡面包括介面,二進制的合約,及其他資訊), 所以可以用 deployed() 來載入。
如果參數 args 是一個集合,在代理合約 deploy 時,可以做為參數來調用 initialize 函數。
這個函數的 opts 參數如下
initializer: 調用不同的初始化函數
deployer: 設定在 Truffle migrate 期間不同的 deployer
unsafeAllowCustomTypes:允許在功能合約中使用 struct 和 enum 等自定義類型,因為存儲兼容性驗証[1]不處理自定義類型,所以確定引入的改變是安全的。
unsafeAllowLinkedLibraries:允許在 deployment 時,使用外部程式庫連結到功能合約,因為插件還不支持外部程式庫[2]
async function deployProxy( Contract: ContractClass, args: unknown[] = [], opts: { deployer: Deployer, initializer: string, unsafeAllowCustomTypes: boolean, unsafeAllowLinkedLibraries: boolean } = {}, ): Promise
upgradeProxy
將一個代理合約內指到功能合約的地址,昇級成新的功能合約地址,並且返回該功能合約的實體,包括代理合約地址,新功能合約的程式介面。
opts 參數如下
deployer: 設定在 migtate 期間 deployer 的地址
unsafeAllowCustomTypes: 允許在功能合約中使用 struct 和 enum 等自定義類型,因為存儲兼容性驗証[1]不處理自定義類型,所以確定引入的改變是安全的。
unsafeAllowLinkedLibraties: 允許在昇級時使用外部程式庫連結到功能合約,因為插件還不支持外部程式庫[2]
async function upgradeProxy( proxyAddress: string, Contract: ContractClass, opts: { deployer: Deployer, unsafeAllowCustomTypes: boolean, unsafeAllowLinkedLibraries: boolean } = {}, ): Promise
prepareUpgrade
驗証和 deploy 一個新的功能合約,並且返回該合約的地址。使用這個方法來準備一個由管理者地址執行的昇級,這個昇級不能直接由 Truffle 運行或是你不能直接控制的。
opts 參數如下
deployer: 設定在 migtate 期間 deployer 的地址
unsafeAllowCustomTypes: 允許在功能合約中使用 struct 和 enum 等自定義類型,因為存儲兼容性驗証[1]不處理自定義類型,所以確定引入的改變是安全的。
unsafeAllowLinkedLibraties: 允許在昇級時使用外部程式庫連結到功能合約,因為插件還不支持外部程式庫[2]
admin.changeAdminForProxy
改變指定的代理合約的管理者地址。接收要改變的合約地址和新管理者地址。
async function changeAdminForProxy( proxyAddress: string, newAdmin: string, ): Promise
admin.transferProxyAdminOwnership
改變指定的代理管理合約的擁有者地址,這個管理合約地址是所有代理合約預設有昇級權限的管理者。
async function transferProxyAdminOwnership( newAdmin: string, ): Promise
補充,本篇有另一篇雙胞胎文章,環境為 buidler ,其中API函數相同,只有參數名稱、類型略有不同,所以不再重寫一次。請參考[3]
參考
[1]https://docs.openzeppelin.com/upgrades-plugins/1.x/faq#what-does-it-mean-for-an-implementation-to-be-compatible
[2]https://docs.openzeppelin.com/upgrades-plugins/1.x/faq#why-cant-i-use-external-libraries
[3]https://docs.openzeppelin.com/upgrades-plugins/1.x/api-buidler-upgrades