Sui V0.31版本重要特性:Package可更新

Sui智能合約是由一系列Move模塊組成的package objects構(gòu)成,packages具有不可篡改的特性,保證交易可以在沒有達到完全共識(快速通道交易)的情況下,也能在智能合約上安全的運行。如果有人更改了packages,對應(yīng)的objects信息將會被共享,并要求在交易完成前達成共識。(關(guān)于更多「共享」內(nèi)容,可參閱:https://docs.sui.io/learn/objects#shared)
然而,考慮到代碼需不斷開發(fā)迭代,package objects的不可篡改就變成一個棘手的問題。開發(fā)者需要更新他們的代碼并提交代碼變更的同時想從快速通道交易中獲益。Sui network提供了一個既可以保留packages原有不可篡改屬性的同時,又可以升級packages的方法,成功解決了這一難題。
本文將介紹如何使用Sui Client CLI升級packages,Move開發(fā)者可以參考package module documentation文檔(https://github.com/MystenLabs/sui/blob/main/crates/sui-framework/docs/package.md),了解代碼在升級packages過程中所做的處理。
要求#
在升級之前,您的packages需要滿足以下幾點要求:
升級前,要準備需要升級package的UpgradeTicket,當(dāng)發(fā)布package時會生成UpgradeCap,這時你可以作為UpgradeCap所有者發(fā)布UpgradeTicket,Sui Client CLI可以自動處理這些請求。
您升級前后的版本代碼結(jié)構(gòu)必須相互兼容:
現(xiàn)有的public函數(shù)簽名和結(jié)構(gòu)體字段需要保持一致;
您可以增加新的結(jié)構(gòu)體和函數(shù);
您可以向現(xiàn)有結(jié)構(gòu)添加功能;
您可以從現(xiàn)有(公共或其他)刪除函數(shù)中泛型約束;
您可以調(diào)整函數(shù)的運行方式;
您可以更改非public函數(shù)的簽名,包括friend和entry函數(shù)簽名。
注意:如果您的package包含依賴項,且該依賴項也已升級,則您的package不會根據(jù)新版本自動更新,您必須明確的顯示升級后的package來指向新的依賴項。
升級#
使用sui client upgrade指令升級packages可以滿足上述要求,同時為以下參數(shù)提供值:
— gas-budget:最大gas預(yù)算。
— cap:UpgradeCap的ID,發(fā)布指令后將收到此ID。
使用Move代碼升級packages的開發(fā)者,可以通過定義訪問類型和函數(shù)來自定義升級策略。例如,一個Move開發(fā)者或許想要在未經(jīng)所有者同意時駁回packages升級,make_immutable函數(shù)(https://github.com/MystenLabs/sui/blob/main/crates/sui-framework/docs/package.md#0x2_package_make _immutable)可以滿足其需求,還有更多類型的高級策略可以使用,如使用UpgradeTicket和Upgrade Receipt指令也可以實現(xiàn)這個功能。詳情請見GitHub上的自定義升級策略(https://github.com/MystenLabs/sui/issues/2045)。
當(dāng)你使用Sui Client CLI,upgrade指令會在處理后生成升級簽名摘要,同時使用UpgradeCap授權(quán)升級可以獲取UpgradeTicket,并在升級成功后使用UpgradeReceipt更新UpgradeCap。要了解更多有關(guān)升級過程的信息,請參閱?package module(https://github.com/MystenLabs/sui/blob/main/crates/sui-framework/docs/package.md)。
示例#
您將開發(fā)一個名為sui_package的package,基本信息如下:
package準備完畢并發(fā)布:
隨后會收到如下響應(yīng):
此面板展示了Object修改的部分,其中包含升級所需的兩條信息,一個是UpgradeCap ID,另一個是package ID。
你可以在響應(yīng)中使用Object.objectType值來識別不同的objects:輸入UpgradeCap,得到一個String(“0x2::package::UpgradeCap”)值,輸入objectType ,從中讀取String(“<PACKAGE-ID>::sui_package::<MODULE-NAME>”)值。
為確保其他的package可以使用這個package作為依賴項,必須升級package配置文件(Move.toml )包含這些信息。
更新地址別名并在[package]部分添加一個新的published-at條目,兩者都指向鏈上ID:
published-at值允許Move編譯器去驗證這些packages的依賴性。
合約運行一段時間后,當(dāng)你決定要升級sui_package來增添一些所需的功能,你需要在運行upgrade指令前,再次編輯你的基礎(chǔ)信息。在[addresses]部分,你需要升級sui_package的地址使其以0x0開頭,這可以保證驗證器為升級的package發(fā)布一個新的地址。當(dāng)然,你可以保留published-at值不變,因為它僅在發(fā)布依賴型package時由工具鏈讀取。保存的信息現(xiàn)在大概有以下內(nèi)容:
當(dāng)基礎(chǔ)信息和代碼修改就位,可以使用sui client upgrade指令升級package了。將UpgradeCap ID(示例中的<UPGRADE-CAP-ID>值)傳遞給 — upgrade-capability flag。
如果package不滿足上述要求,會提醒你;如果滿足,編譯器將在發(fā)布升級的package后,返回其結(jié)果值:
顯示的結(jié)果,將是從升級后的package中獲得一個新的ID,而升級前的packages,需要將這些信息保存起來,這樣依賴sui_package的其他packages才知道如何在鏈上找到這些驗證代碼。再次編輯你的配置信息,為published-at值提供升級后的package ID ,即可在[addresses]部分返回原始sui_package ID值:
published-at值會隨著升級而不斷調(diào)整,升級后,[addresses]中的sui_package ID總是與原始的package ID相對應(yīng)。你必須將返回值調(diào)整為0x0,才能使編譯器知道在運行upgrade指令之前,為升級創(chuàng)建一個新的ID。

關(guān)于 Sui Network
Sui是基于第一原理重新設(shè)計和構(gòu)建而成的L1公有鏈,旨在為創(chuàng)作者和開發(fā)者提供能夠承載Web3中下一個十億用戶的開發(fā)平臺。Sui上的應(yīng)用基于Move智能合約語言,并具有橫向可擴展性,讓開發(fā)者能夠快速且低成本支持廣泛的應(yīng)用開發(fā)。
官網(wǎng):https://sui.io/
Twitter:https://twitter.com/SuiNetwork
Discord:https://discord.com/invite/sui
中文Medium:https://medium.com/sui-network-cn
中文電報群:https://t.me/Sui_Blockchain_Chinese?