Beitrag
Teile dein Wissen.
Was ist die Rolle von upgrade_cap in Sui-Paketen?
Ich versuche, diesen Aspekt des Sui-Netzwerks zu verstehen, weil ich entweder etwas baue, debugge oder implementiere, das diesen Bereich betrifft. Ich benötige eine detaillierte Erklärung, wie dieser Mechanismus oder diese Funktion funktioniert, zusammen mit der relevanten CLI-Verwendung, der Move-Codestruktur oder den Architekturkonzepten. Mein Ziel ist es, genügend Klarheit zu gewinnen, um dieses Wissen in einem echten Projekt anzuwenden — egal, ob es sich um einen benutzerdefinierten Smart Contract, ein NFT-System, eine Wallet-Integration oder ein DeFi-Tool handelt. Das Sui-Netzwerk hat im Vergleich zu EVM-Ketten einzigartige Funktionen, daher bin ich besonders daran interessiert, was es auszeichnet und wie sich das auf bewährte Entwicklungspraktiken auswirkt. Es wäre hilfreich, Beispielcode, Befehlszeilenbeispiele oder typische Fehler zu haben, auf die Sie achten sollten, insbesondere wenn Sie die Sui CLI, das SDK oder die Bereitstellung auf localnet/testnet verwenden. Letztlich möchte ich häufige Fehler vermeiden, die besten Sicherheitsprinzipien befolgen und sicherstellen, dass sich die Funktionen, an denen ich gerade arbeite, unter realistischen Bedingungen wie erwartet verhalten.
- Sui
- Transaction Processing
- Move
Antworten
12Das upgrade_cap in Sui-Paketen ist ein spezielles Objekt, das die Berechtigung zum Upgrade eines veröffentlichten Move-Pakets steuert. Wenn Sie ein Paket auf Sui veröffentlichen, erstellt das System ein upgrade_cap-Objekt, das mit diesem Paket verknüpft ist. Dieses Objekt befindet sich im Besitz des Herausgebers oder der benannten Behörde und ist erforderlich, um zukünftige Upgrades oder Änderungen am Paketcode durchzuführen. Ohne upgrade_cap wird das Paket unveränderlich, was bedeutet, dass Sie seine Module nicht ändern oder ersetzen können. Dieses Design sorgt für sichere, kontrollierte Upgrades und verhindert unbefugte Änderungen. Dies ist entscheidend für die Aufrechterhaltung des Vertrauens und der Stabilität der eingesetzten intelligenten Verträge.
Aus Sicht der CLI erhalten Sie, wenn Sie ein Paket mit sui client publish veröffentlichen, die Paket-ID und die upgrade_cap-Objekt-ID. Für das Upgrade müssen Sie eine Transaktion signieren, die auf das aktuelle upgrade_cap verweist. Anschließend gibt das System eine neue Version des Pakets zusammen mit einem neuen upgrade_cap-Objekt aus. Im Move-Code manipulieren Sie das upgrade_cap nicht direkt, aber Ihre Bereitstellungsskripte oder die Off-Chain-Logik müssen es sicher handhaben.
Architektonisch verkörpert upgrade_cap die Eigentums- und Berechtigungskontrolle für das Paketlebenszyklusmanagement und unterscheidet das Paketmodell von Sui von den unveränderlichen Verträgen oder Proxys von Ethereum. Es hat sich bewährt, das upgrade_cap sicher offline oder in einer Multisig-Brieftasche aufzubewahren, um eine Gefährdung zu verhindern. Außerdem sind vor dem Upgrade eine sorgfältige Versionsverwaltung und Tests erforderlich, da sich dies je nach Paket auf alle Benutzer auswirkt.
Zu den typischen Fehlern gehören der Verlust von upgrade_cap, wodurch Sie von Upgrades ausgeschlossen sind, oder die falsche Verwaltung der Berechtigungen, was zu Sicherheitsrisiken führt. Mithilfe der Sui CLI können Sie den aktuellen Wert von upgrade_cap für ein Paket abfragen oder Upgrade-Transaktionen einreichen, die das Paket verbrauchen und erneut ausgeben.
Zusammenfassend lässt sich sagen, dass upgrade_cap der kryptografische Schlüssel zur Paketentwicklung auf Sui ist. Er ermöglicht kontrollierte, genehmigte Upgrades bei gleichzeitiger Wahrung der Dezentralisierung und Sicherheit. Die ordnungsgemäße Verwaltung ist für die produktionsbereiten Workflows für die Entwicklung und Bereitstellung intelligenter Sui-Verträge unerlässlich.
In Sui upgrade_cap
wird verwendet, um die Erweiterbarkeit intelligenter Verträge zu verwalten, sodass Entwickler Verträge aktualisieren können, ohne Daten zu verlieren. Es erteilt die Erlaubnis zur Durchführung von Vertrags-Upgrades und gehört in der Regel einer vertrauenswürdigen Adresse.
Wichtige Punkte:
*Control-Upgrade: upgrade_cap
stellt sicher, dass nur autorisierte Adressen Upgrades auslösen können.
*Move-Code: Wird in Move-Modulen zur Durchführung von Upgrades verwendet.
*CLI-Beispiel:
sui client publish --upgrade --package <package-id> --capability <upgrade-cap-id>
Bewährte Methoden:
- Testen Sie Upgrades auf localnet/testnet.
- Sichern Sie das, um unbefugten Zugriff
upgrade_cap
zu verhindern.
Die Rolle von upgrade_cap
in Sui Network
Zweck: Steuert, wer einen intelligenten Vertrag oder ein Modul aktualisieren kann.
*Was es macht: Gewährt bestimmten Adressen (normalerweise Administratoren) Upgrade-Berechtigungen. Es stellt sicher, dass nur autorisierte Stellen bereitgestellte Verträge ändern können.
Wichtige Konzepte:
*Move-Sprache: upgrade_cap
ist in Move für ein sicheres Vertragsmanagement implementiert.
*Bereitstellung: Wird während der Vertragsbereitstellung angegeben, damit zukünftige Upgrades nur durch autorisierte Adressen möglich sind.
CLI-Beispiel:
sui client publish --gas-budget 10000 --upgrade-cap <upgrade-cap-id>
Beispiel für einen Bewegungscode:
public fun grant_upgrade_cap() {
let upgrade_cap = UpgradeCap::new();
// Assign cap to authorized address
}
Häufige Probleme:
*Berechtigungsfehler: Eine nicht autorisierte Adresse versucht, ein Upgrade durchzuführen.
upgrade_cap
*Fehlende Funktionen: Stellen Sie sicher, dass sie während der Bereitstellung korrekt eingestellt sind.
Bewährte Methoden:
upgrade_cap
Einschränken: Beschränken Sie den Zugriff auf vertrauenswürdige Adressen. *Test in Localnet/Testnet: Stellen Sie vor der Bereitstellung im Mainnet das richtige Verhalten sicher.
Das upgrade_cap
****in Sui dient als Autorisierungsmechanismus für Paket-Upgrades und fungiert als einzigartiges Funktionsobjekt, das seinem Inhaber Upgrade-Rechte gewährt. Im Gegensatz zu EVM-Ketten, bei denen Verträge unveränderlich sind, erfordert das Upgrade-System von Sui dieses Objekt, um veröffentlichte Pakete zu modifizieren, was eine kontrollierte Veränderbarkeit gewährleistet und gleichzeitig die Sicherheit gewährleistet. upgrade_cap
Der Inhaber von sui client upgrade
kann Upgrades über den package::authorize_upgrade
CLI-Befehl oder programmgesteuert über die Funktion von Move autorisieren. Zu den bewährten Methoden gehören die sichere Speicherung upgrade_cap
(oft in einem Versioned``AdminCap
OP-Wrapper) und die Implementierung geeigneter Eigentümerkontrollen, da ein Verlust der Daten die Aktualisierbarkeit dauerhaft einschränkt und gleichzeitig die Gefahr unberechtigter Änderungen birgt.
Im Sui-Netzwerk upgrade_cap
spielt das eine entscheidende Rolle dabei, sichere und kontrollierte Upgrades von Move-Paketen nach ihrer ersten Bereitstellung zu ermöglichen. Wenn Sie ein Paket auf Sui veröffentlichen, UpgradeCap
wird ein Objekt dieses Typs erstellt und zurückgegeben. Dieses Objekt ist diealleinige Autorität, die zukünftige Aktualisierungen des Pakets ermöglicht. Es fungiert quasi als Schlüssel, der die Erlaubnis erteilt, den Code zu ändern.
Sie müssen das Eigentum daran behalten, upgrade_cap
wenn Sie Ihr Paket später aktualisieren möchten. Wenn Sie es an eine andere Adresse übertragen oder brennen (z. B. indem 0x0
Sie es an senden), sind keine weiteren Upgrades möglich. Dieses Design erzwingt Unveränderlichkeit, sofern der Paketersteller nicht ausdrücklich zugestimmt hat.
Warum UpgradeCap wichtig ist
Das objektzentrierte Modell von Sui führt dieses Konzept ein, um zwischen unveränderlichen und aktualisierbaren Paketen zu unterscheiden. upgrade_cap
Pakete ohne Zugriff auf sie gelten als dauerhaft unveränderlich. Dies steht im Gegensatz zu EVM-Ketten, bei denen Verträge nur dann veränderbar sind, wenn delegatecall
Proxys oder aktualisierbare Muster manuell erstellt werden.
Beispiel für einen Upgrade-Workflow
Wenn Sie ein Paket veröffentlichen:
sui client publish --path . --gas-budget 100000000
Die Ausgabe beinhaltet:
- Paket-ID
- UpgradeCap-Objekt-ID
Um später zu aktualisieren:
sui client upgrade \
--package <original_package_id> \
--module-upgrade-path <new_module_path> \
--upgrade-cap <upgrade_cap_id> \
--gas-budget 100000000
UpgradeCap in Move verwenden
In Ihren Move-Modulen können Sie Upgrades oder sensible Übergänge mithilfe des Capability-Objekts schützen:
public entry fun secure_upgrade(upgrade_cap: &UpgradeCap, ctx: &mut TxContext) {
// logic that uses upgrade_cap as proof of authority
}
Oder zerstöre es, wenn du das Paket finalisieren willst:
transfer::public_transfer(upgrade_cap, @0x0);
Dadurch wird Ihre Fähigkeit, das Paket zu aktualisieren, dauerhaft aufgehoben.
Bewährte Methoden
*Bewahren Sie das upgrade_cap
in einer sicheren Wallet oder einem Governance-Modulauf, wenn Sie zukünftige Upgrades planen.
*Verbrennen Sie upgrade_cap
den, wenn Sie möchten, dass Ihr Paket unveränderlich ist, was bei Finanzkontrakten oder NFTs üblich ist, um das Vertrauen der Benutzer aufzubauen.
*Verpacken Sie die Upgrade-Logik in Governance, sodass ein DAO oder Multisig Upgrades anstelle eines einzelnen privaten Schlüssels genehmigt.
*Vermeiden Sie die Weitergabe des upgrade_cap
Ausweises, da Besitz in Sui Autorität bedeutet.
Häufige Fehler
*Fehlt upgrade_cap
beim Upgrade→ Führt zu der Fehlermeldung „Zugriff verweigert“.
*Versehentliche Übertragung auf Null→ Ihr Paket wird für immer gesperrt.
*Es wird versucht, das Upgrade für unveränderliche Pakete aufzurufen. → Das System lehnt die Transaktion ab.
Mehr erfahren
- Dokumente: https://docs.sui.io/concepts/packages
- Upgrade-Beispiele: https://docs.sui.io/build/upgrade
- CLI-Referenz: https://docs.sui.io/reference/cli/client
Letztlich upgrade_cap
steht das für Suis Bekenntnis zu ausdrücklicher Autorität und feinkörniger Kontrolle über die Entwicklung von Staat und Code. Zu verstehen, wie man Daten verwendet, speichert und widerruft, ist der Schlüssel zum Aufbau sicherer und wartbarer intelligenter Verträge im Sui-Ökosystem.
Die Rolle von upgrade_cap
in Sui-Paketen
Das upgrade_cap
ist einCapability-Objekt, das die Upgrade-Berechtigungen für Pakete im objektzentrierten Upgrade-System von Sui steuert. Im Gegensatz zu EVM-Ketten, die Proxy-Muster verwenden, wickelt Sui Upgrades auf Paketebene über dieses dedizierte Capability-Objekt ab.
Kernmechanik
Beim Veröffentlichen eines Pakets:
sui client publish --gas-budget 100000000 --path ./move_package
Die Transaktion gibt Folgendes zurück:
- Paket-ID (unveränderlicher Bezeichner)
upgrade_cap
Objekt (0x2: :package: :upgradeCap)
Dieses Capability-Objekt:
- Ist einerstklassiges Sui-Objekt, das in Besitz genommen, übertragen oder geteilt werden kann
- Muss bei jeder Upgrade-Transaktion als Eingabe angegeben werden
- Enthält die Paket-ID, für die Upgrades autorisiert werden
Wichtige technische Details
1.Sicherheitsmodell:
- Nur der Besitzer des
upgrade_cap
kann das Paket aktualisieren - Folgt dem Objektbesitzmodell von Sui (keine Autorisierung durch Unterzeichner)
- Kann in Multisig-Verträgen oder Timelocks verwaltet werden
2.Upgrade-Vorgang:
sui client upgrade --package [PACKAGE_ID] \
--upgrade-cap [UPGRADE_CAP_ID] \
--gas-budget 200000000 \
--path ./updated_package
3.Kritische Bewegungsmuster:
// Storing upgrade_cap in a publisher struct
struct Publisher has key {
id: UID,
upgrade_cap: package::UpgradeCap,
}
// Upgrading (must use &mut reference)
public entry fun upgrade(
publisher: &mut Publisher,
new_package: vector<u8>,
new_modules: vector<vector<u8>>,
ctx: &mut TxContext
) {
package::upgrade_package(
&mut publisher.upgrade_cap,
new_package,
new_modules,
ctx
)
}
Sui-spezifische Vorteile gegenüber EVM
-Keine Proxy-Muster erforderlich: Upgrades erfolgen auf Paket-Ebene, nicht auf Vertragsebene
-Abwärtskompatibilität: Bestehende Objekte behalten auch nach Upgrades ihre Gültigkeit
-Funktionsbasierte Sicherheit: Verwendet das Objektbesitzmodell von Sui anstelle von Administratorrollen
upgrade_cap
-Transparente Verwaltung: Sie können in Multisigs- oder DAO-Schatzkammern eingesetzt werden
Häufige Fehler und Lösungen
| Fehler | Ursache | Korrigieren |
| --------------| -----|
| UpgradeCap not found
| Fehlendes Funktionsobjekt | Stellen Sie sicher, dass Sie die richtige upgrade_cap-ID verwenden |
| Package ID mismatch
| Falsches upgrade_cap verwenden | Prüfen Sie, ob package: :id (&cap) mit dem Zielpaket übereinstimmt |
| Insufficient gas
| Für das Upgrade wird mehr Gas benötigt | Erhöhen Sie das Gasbudget (Upgrades kosten das 2-3-Fache der regulären Steuern) |
| Module compatibility error
| Wichtige Änderungen in der neuen Version | Stellen Sie sicher, dass die Strukturlayouts kompatibel bleiben |
Bewährte Methoden
- Für die Produktion: Übertragung
upgrade_cap
in eine Multisig-Wallet - Für unveränderliche Verträge: Brennen Sie die Funktion nach der Veröffentlichung
- Überprüfen Sie immer, ob Sie die Fähigkeiten besitzen:
object::is_owner(&cap, tx_context::sender(ctx))
- Ereignisse bei Upgrades ausgeben:
event::emit(UpgradeEvent { package_id, version })
upgrade_cap
Dies verkörpert das objektorientierte Sicherheitsmodell von Sui. Upgrade-Berechtigungen werden als übertragbare Ressourcen und nicht als fest codierte Administratorrollen behandelt, was flexible Verwaltungsoptionen bietet und gleichzeitig die Sicherheit gewährleistet.
Das upgrade_cap in Sui ist ein spezielles Objekt, das die Autorität zum Upgrade eines veröffentlichten Move-Pakets darstellt. Wenn Sie ein Paket mit der Sui CLI veröffentlichen, erstellt das System automatisch ein upgrade_cap-Objekt, das diesem Paket zugeordnet ist. Dieses Objekt steuert die Fähigkeit, das Paket nach seiner ersten Bereitstellung zu aktualisieren oder zu ändern. Ohne die Eigenschaft upgrade_cap kann niemand das Paket aktualisieren, sodass es unveränderlich ist.
Zum Beispiel beim Veröffentlichen eines Pakets:
sui client publish --gas-budget 10000 --path. /mein_Paket
Die Ausgabe enthält die upgrade_cap-Objekt-ID. Dieses Objekt muss in Upgrade-Transaktionen enthalten sein, um die Autorität nachzuweisen. Um das Paket zu aktualisieren, rufen Sie:
<upgrade_cap_object_id>sui client upgrade --package --upgrade-cap <new_package_path>--gas-budget 10000
Diese Transaktion verbraucht das alte upgrade_cap und gibt ein neues für das aktualisierte Paket aus. Das upgrade_cap setzt eine strenge Berechtigungskontrolle für den Paketlebenszyklus durch und stellt sicher, dass nur autorisierte Parteien den Vertragscode ändern können.
Aus Sicht von Move manipuliert der Paketcode selbst das upgrade_cap nicht direkt, da er auf Protokollebene verarbeitet wird. Entwickler müssen dieses Objekt jedoch außerhalb der Kette sicher verwalten und es in der Regel in sicheren Wallets oder Multisig-Setups speichern, um unbefugte Upgrades zu verhindern.
Ein verlorenes upgrade_cap bedeutet, dass Sie das Paket nicht erneut aktualisieren können, wodurch der Code effektiv für immer gesperrt wird. Dies unterstreicht die Bedeutung sicherer Verfahren zur Schlüsselverwaltung. Darüber hinaus wirkt sich das Upgrade eines Pakets auf alle Benutzer aus, die sich darauf verlassen. Daher sollten Upgrades vor der Bereitstellung gründlich im Testnet oder Localnet getestet werden.
Da Sui-Pakete versioniert sind, ist upgrade_cap der Schlüssel zum Wechsel zwischen Versionen. Das System garantiert atomare Upgrades, indem es die Paketversionierung an diese Fähigkeit bindet.
Sie können das mit einem Paket verknüpfte upgrade_cap mithilfe der Sui-CLI oder des SDK abfragen:
Sui Client Get-Package <package_id>
was Paketdetails einschließlich des aktuellen upgrade_cap zurückgibt. Der sichere Umgang mit upgrade_cap ist Teil der Best Practices in den Sui-Entwicklungsworkflows, um versehentliche oder böswillige Codeänderungen zu vermeiden.
Im Gegensatz zu den unveränderlichen Verträgen oder Proxy-Upgrade-Mustern von Ethereum handelt es sich bei upgrade_cap von Sui um ein explizites On-Chain-Capability-Objekt, das Upgrades steuert. Dieses Design erhöht die Transparenz und Sicherheit, indem es die Upgrade-Autorität zu einem expliziten Objekt im System macht.
Entwickler müssen das upgrade_cap-Management in ihre Bereitstellungspipelines integrieren. In der Regel erstellen sie für den Upgrade-Prozess ein Skript, um das upgrade_cap-Objekt einzubeziehen und sicherzustellen, dass es mit den richtigen Schlüsseln signiert ist.
Das upgrade_cap
In-Sui-Paket ist ein spezielles Objekt, das seinem Besitzer das exklusive Recht gibt, ein veröffentlichtes Move-Paket zu aktualisieren. Wenn Sie ein Paket im Sui-Netzwerk bereitstellen, generiert Sui ein UpgradeCap
Objekt, das mit Ihrem Konto verknüpft ist. Diese Funktion fungiert als sicherer Zugriffsschlüssel — ohne ihn kann niemand (einschließlich Ihnen) den Code dieses Pakets in Zukunft aktualisieren.
Sie verwenden denupgrade_cap
, wenn Sie die vom Systemmodul upgrade
von Sui bereitgestellte Funktion aufrufen. Mit der CLI können Sie Upgrades wie folgt durchführen:
sui client upgrade \
--package-path /path/to/your/package \
--upgrade-capability <upgrade_cap_object_id> \
--gas-budget 100000000
Sie müssen die ID des UpgradeCap
Objekts übergeben, um die Upgrade-Transaktion zu autorisieren. Wenn Sie das Paket verlieren UpgradeCap
oder es an eine Adresse übertragen, auf die nicht zugegriffen werden kann (z. B.0x0
), wird das Paket unveränderlich, da niemand ein Upgrade initiieren kann.
Wenn Sie zukünftige Upgrades bewusst deaktivieren möchten, können Sie Ihrem Paket eine Funktion hinzufügen, wie zum Beispiel:
public entry fun burn_cap(cap: UpgradeCap) {
sui::package::delete_upgrade_cap(cap);
}
Der Aufruf dieser Funktion löscht die Fähigkeit und sperrt den Code für immer. Dies wird für Pakete empfohlen, die vertrauenswürdig sein oder extern verwaltet werden müssen.
Bewährte Methode: Sichern Sie Ihre Daten immer UpgradeCap
und ziehen Sie in Betracht, sie auf ein DAO oder Multisig zu übertragen, wenn Sie an einer kollaborativen oder öffentlichen Infrastruktur arbeiten.
upgrade_cap
###Rolle von In-Sui-Paketen
Das upgrade_cap
ist einCapability-Objekt, das die Erlaubnis erteilt, ein Move-Paket auf Sui zu aktualisieren. Es ist eine einzigartige Sui-Funktion, die im Gegensatz zu unveränderlichen Verträgen auf EVM-Ketten diekontrollierte Veränderbarkeitfür veröffentlichte Pakete ermöglicht.
###Schlüsselkonzepte
1.Was es macht:
Publisher
- Enthält das UpgradePolicy
und immutable
(z. B., compatible``arbitrary
,).
- Erforderlich, um Paket-Upgrades zu autorisieren (z. B. Bugfixes, neue Funktionen).
2.Warum Sui einzigartig ist:
upgrade_cap
- EVM-Verträge sind nach der Bereitstellungunveränderlich; Sui ermöglicht Upgradesmit Governance(via).
- Upgrades sindgassparend(nur modifizierte Module werden erneut veröffentlicht).
3.Implikationen für die Sicherheit:
- Wer das besitzt,
upgrade_cap
kann die Logik des Pakets ändern. - Bewährtes Verfahren:Übertragen Sie es nach der Bereitstellung auf ein Multisig- oder DAO.
###Codestruktur verschieben
####1. upgrade_cap
Definiert init
in
module my_pkg::my_module {
use sui::package;
use sui::transfer;
// Called once during package publish
fun init(otw: &mut TxContext) {
let (upgrade_cap, publisher) = package::claim(otw);
transfer::transfer(upgrade_cap, tx_context::sender(otw)); // Give cap to deployer
}
}
####2. Ein Paket aktualisieren
module my_pkg::upgrader {
use sui::package;
// Requires the UpgradeCap
public entry fun upgrade(
upgrade_cap: &mut UpgradeCap,
new_package: vector<u8>,
otw: &mut TxContext
) {
package::upgrade(upgrade_cap, new_package, otw);
}
}
upgrade_cap
in Sui ist einSchlüsselobjekt, das Paket-Upgrades steuert.
###Wichtige Punkte:
1.Administratorrechte— Nur der upgrade_cap
Inhaber kann das Paket aktualisieren.
2.Sicherheit— Verhindert unbefugte Änderungen (im Gegensatz zu den unveränderlichen Verträgen von Ethereum).
3. sui client upgrade
CLI-Nutzung— Erforderlich für.
###Beispiel für einen Umzug:
struct UpgradeCap has key, store { id: UID }
###Bewährte Methoden:
✔ Sicher speichern (z. B. Multisig).
✔ Testen Sie die Upgrades localnet
zuerst.
Warum einzigartig: Sui ermöglicht Upgrades (im Vergleich zur EVM-Unveränderlichkeit).
- (Verlieren
upgrade_cap
= keine Upgrades mehr!) *
###1. Kernkonzept
Das upgrade_cap
ist einprivilegiertes Objekt, das Paket-Upgrades in Sui steuert. Im Gegensatz zu EVM-Ketten, bei denen Verträge unveränderlich sind, ermöglicht Sui eine kontrollierte Veränderbarkeit durch dieses auf Fähigkeiten basierende System.
###2. Wichtigste Eigenschaften
Immobilie | Beschreibung |
---|---|
Besitzer | Nur der Inhaber kann Upgrades autorisieren |
Übertragbar | Kann an andere Adressen gesendet werden |
Brennbar | Option zur dauerhaften Unveränderlichkeit |
###2. Implementierung verschieben ####Grundstruktur
module my_pkg::admin {
use sui::package;
use sui::transfer;
use sui::tx_context;
// Generated during initial publish
struct UpgradeCap has key, store {
id: UID
}
// Initialize and transfer cap
public fun init(ctx: &mut tx_context::TxContext) {
let (upgrade_cap, publisher) = package::claim_upgrade_cap(ctx);
transfer::transfer(upgrade_cap, tx_context::sender(ctx));
}
}
####Upgrade-Ablauf
module my_pkg::upgrader {
use sui::package;
use sui::upgrade_cap;
public entry fun upgrade(
cap: &mut upgrade_cap::UpgradeCap,
policy: u8,
digest: vector<u8>,
ctx: &mut tx_context::TxContext
) {
package::authorize_upgrade(cap, policy, digest);
let new_pkg = package::make_upgrade_ticket(cap, policy, digest);
// ... complete upgrade
}
}
###3. CLI-Workflow ####Erste Veröffentlichung
sui client publish --gas-budget 1000000000
# Output includes UpgradeCap object ID
####Upgrade autorisieren
sui client call \
--package <UPGRADE_CAP_PKG> \
--module admin \
--function authorize_upgrade \
--args <UPGRADE_CAP_ID> 1 0x<COMPILED_PACKAGE_DIGEST> \
--gas-budget 1000000000
####Upgrade ausführen
sui client upgrade --upgrade-capability <UPGRADE_CAP_ID> \
--gas-budget 1000000000
###4. Sicherheitsmuster ####Capability Nesting
struct AdminCap has key {
id: UID,
upgrade_cap: UpgradeCap // Delegatable
}
####Upgrades mit Zeitblockierung
module my_pkg::timelock {
struct TimedUpgradeCap has key {
cap: UpgradeCap,
unlock_epoch: u64
}
public fun upgrade_when_ready(
cap: &mut TimedUpgradeCap,
ctx: &mut TxContext
) {
assert!(tx_context::epoch(ctx) >= cap.unlock_epoch, ELOCKED);
package::authorize_upgrade(&mut cap.cap, ...);
}
}
###5. Häufige Fallfälle
Fehler | Lösung |
---|---|
MissingUpgradeCap | Speichern Sie die Cap-ID in Ihren Bereitstellungsdokumenten |
UnauthorizedUpgrade | transfer::freeze_object Zum Sperren von Großbuchstaben verwenden |
DigestMismatch | Mit identischen Abhängigkeiten neu kompilieren |
###6. Richtlinien aktualisieren
// Bitflags determining upgrade flexibility
const POLICY_COMPATIBLE: u8 = 0x1; // Backwards-compatible
const POLICY_ADDITIVE: u8 = 0x2; // New functions only
const POLICY_BREAKING: u8 = 0x4; // Full changes
###7. Teststrategie ####Localnet Dry-Run
sui client publish --upgrade-policy 7 --dry-run
####Simulation aktualisieren
#[test_only]
module test {
fun test_upgrade() {
let (cap, _) = package::test_upgrade_cap();
package::authorize_upgrade(&mut cap, ...);
assert!(package::test_is_authorized(cap), 0);
}
}
###Architektonische Auswirkung 1.Dezentrale Regierung:
- DAOs können Upgrade-Obergrenzen einhalten
shared
- Multi-SIG-Schemata über Objekte
2.Einsatzbereitschaft:
- Schrittweise Rollouts mit Richtlinien-Markierungen
- Sperrfunktionen für Notfälle
3.DevEx-Vorteile:
- Behebung von Fehlern nach der Bereitstellung
- Gaseffiziente Speichermigrationen
Für Produktionssysteme:
UpgradeCap
Im Kühlhaus lagern- Implementieren Sie Upgrade-Wahlmechanismen
- Überwachen Sie den Monitor über den Upgrade-Tab von Sui Explorer
In Sui gibt upgrade_cap
es ein spezielles Objekt, das Ihnen das Recht gibt, ein veröffentlichtes Move-Paket zu aktualisieren. Wenn Sie ein Paket mit bereitstellen--upgradeable
, erhalten Sie automatisch ein UpgradeCap
Objekt, das damit verknüpft ist. Dieses Objekt verhält sich wie ein Genehmigungsschein — ohne ihn können Sie keine Upgrades auf dieses Paket übertragen. Wenn Sie den Code aktualisieren möchten, müssen Sie dieses Objekt gedrückt halten und mit ihm signieren. Das macht ihn zu einem leistungsstarken Zugriffskontrollmechanismus für die On-Chain-Entwicklung.
Dieses Design unterscheidet Sui von EVM-Ketten, bei denen die Upgrade-Logik häufig über Proxy-Verträge und separate Administratorrollen abgewickelt wird. In Sui ist die Upgrade-Berechtigung im Objektsystem verankert. Wenn Sie eine NFT-Sammlung, einen DeFi-Vertrag oder ein System erstellen, das zukünftige Updates benötigt, UpgradeCap
stellt dies sicher, dass nur der vertrauenswürdige Entwickler (oder Multisig) mit dieser Obergrenze diese Änderungen vornehmen kann, wodurch die Wahrscheinlichkeit unbefugter Upgrades verringert wird.
Verwenden Sie die Sui-CLI, um ein aktualisierbares Paket zu erstellen:
sui client publish --path . --gas-budget 100000000 --with-unpublished-dependencies --upgradeable
Nach der Veröffentlichung sehen Sie upgrade_cap
in der Ausgabe Folgendes:
"createdObjects": [
{
"objectType": "0x2::package::UpgradeCap",
"objectId": "0xabc123...",
...
}
]
Um das Paket später zu aktualisieren, kompilieren Sie es in einen .json
Digest und führen Sie Folgendes aus:
sui client upgrade --package-id <PACKAGE_ID> --module <PATH_TO_COMPILED_MODULE> --upgrade-capability <CAP_OBJECT_ID> --gas-budget 100000000
Stellen Sie sicher, dass die Objekt-ID --upgrade-capability
mit der ID übereinstimmt, die Sie bei der ersten Veröffentlichung erhalten haben. Wenn Sie dieses Objekt verlieren oder vergessen, es zu schützen (z. B. durch Übertragung auf eine Multisig-Wallet), kann jeder, der es erhält, Ihren Vertrag ändern.
Zu den häufigsten Fehlern gehören das Vergessen, das zu speichernupgrade_cap
, die Verwendung eines ungültigen Digest oder der Versuch, ein nicht aktualisierbares Paket zu aktualisieren. Es hat sich bewährt, die Daten upgrade_cap
vor allem in der Produktion sicher aufzubewahren und bei Audits genau zu überwachen.
Weitere Informationen zu upgrade_cap
Paket-Upgrades und deren Sicherung finden Sie in den offiziellen Dokumenten von Sui:
https://docs.sui.io/build/package-upgrades
Weißt du die Antwort?
Bitte melde dich an und teile sie.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Verdiene deinen Anteil an 1000 Sui
Sammle Reputationspunkte und erhalte Belohnungen für deine Hilfe beim Wachstum der Sui-Community.
- Warum benötigt BCS eine genaue Feldreihenfolge für die Deserialisierung, wenn Move-Strukturen benannte Felder haben?53
- Fehler bei der Überprüfung mehrerer Quellen“ in den Veröffentlichungen des Sui Move-Moduls — Automatisierte Fehlerbehebung43
- Sui-Transaktion schlägt fehl: Objekte sind für eine andere Transaktion reserviert25
- Wie interagieren Fähigkeitsbeschränkungen mit dynamischen Feldern in heterogenen Sammlungen?05