Beitrag
Teile dein Wissen.
Wie kann ich unautorisierte Upgrades eines Move-Pakets durchführen?
Ich versuche, diesen Aspekt des Sui-Netzwerks zu verstehen, weil ich entweder etwas entwickle, debugge oder bereitstelle, 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
14Um unbefugte Upgrades eines Move-Pakets auf Sui zu verhindern, ist das upgrade_cap-Objekt der Schlüsselmechanismus. Dieses Objekt fungiert als On-Chain-Funktion, die die ausschließliche Befugnis zum Upgrade eines bereitgestellten Pakets gewährt. Ohne den Besitz von upgrade_cap kann niemand das Paket aktualisieren und es somit vor unbefugten Änderungen schützen.
Wenn Sie ein Paket mit der Sui CLI veröffentlichen:
sui client publish --path. /mein_paket --gas-budget 10000
Das System erstellt ein upgrade_cap-Objekt und gibt dessen Objekt-ID zurück. Dieses Objekt muss in jeder Upgrade-Transaktion wie folgt enthalten sein:
sui client upgrade --package. <upgrade_cap_object_id>/neues_paket --upgrade-cap --gas-budget 10000
Um dein Paket zu sichern:
-
Schützen Sie das upgrade_cap: Bewahren Sie es sicher in einer Hardware-Wallet oder Multisig-Wallet auf, um sicherzustellen, dass nur autorisierte Stellen Upgrade-Transaktionen signieren können.
-
Verwenden Sie Multisig-Wallets als Upgrade-Autorität: Binden Sie das upgrade_cap in ein Multisig-Wallet-Objekt ein. Dies erfordert mehrere Signaturen, bevor die Upgrade-Transaktion akzeptiert wird, was eine zusätzliche Sicherheitsebene darstellt.
-
Implementieren Sie behördliche Kontrollen außerhalb der Kette: Koordinieren Sie Upgrades mit Off-Chain-Genehmigungsprozessen, um böswillige Upgrades zu vermeiden.
-
Teilen Sie das upgrade_cap nicht mit Unbefugten und setzen Sie es nicht in unsicheren Umgebungen aus.
-
Verwenden Sie umgebungsspezifische Zugriffskontrollen: Beschränken Sie beispielsweise Upgrade-Vorgänge auf bestimmte Bereitstellungsumgebungen oder IP-Whitelists in Ihrer Betriebsinfrastruktur.
-
Upgrade-Transaktionen überprüfen: Überwachen Sie die Blockchain auf unautorisierte oder unerwartete Upgrade-Aufrufe, um umgehend reagieren zu können.
Wenn Sie die Kontrolle über das upgrade_cap verlieren, kann Ihr Paket von jedem, der es besitzt, aktualisiert werden, was die Integrität Ihres Vertrags beeinträchtigt. Umgekehrt gilt: Wenn Sie das upgrade_cap vollständig verlieren und kein Backup haben, können Sie das Paket nicht mehr aktualisieren, wodurch sein Status quasi eingefroren wird.
Im Gegensatz zu den Proxy-Upgrade-Mustern von Ethereum, bei denen die Aktualisierbarkeit in der Vertragslogik kodiert ist, verwendet Sui ein explizites Capability-Objekt. Dieses Design erhöht die Sicherheitstransparenz, indem die Upgrade-Autorität direkt an ein Objekt auf der Kette gebunden wird, das Sie kontrollieren.
In Ihrem Move-Code wird upgrade_cap nicht angezeigt, da Upgrade-Berechtigungen außerhalb der Vertragslogik verwaltet werden. Bei Bereitstellungs- und Upgrade-Transaktionen über CLI oder SDK ist dies jedoch von entscheidender Bedeutung.
Beispiel zur Überprüfung der Upgrade-Fähigkeit Ihres Pakets:
sui client get-package <package_id>
Dadurch werden Paketmetadaten einschließlich des upgrade_cap-Objekts angezeigt.
Indem Sie diese Praktiken befolgen, stellen Sie sicher, dass Paket-Upgrades streng kontrolliert werden. Dadurch wird das Risiko unbefugter Änderungen minimiert und das Vertrauen der Benutzer in Ihre Smart Contracts gewahrt.
Unautorisierte Upgrades im Sui Network (Move)
Um unautorisierte Upgrades eines Move-Pakets im Sui-Netzwerk zu verhindern, müssen Sie sicherstellen, dass nur vertrauenswürdige Entitäten oder Adressen Upgrades durchführen dürfen. Dies erfolgt über den upgrade_cap
****-Mechanismus und indem sorgfältig kontrolliert wird, wer die Möglichkeit hat, Ihr Paket zu aktualisieren.
Wichtige Konzepte:
*** upgrade_cap
**: Eine Funktion, die einschränkt, wer ein Paket aktualisieren kann. Sie können das upgrade_cap
während der Vertragsbereitstellung festlegen und überprüfen.
*Prozess zur Vertrags-Upgrade: Sobald Sui-Verträge bereitgestellt wurden, können sie aktualisiert werden. Sie müssen jedoch kontrollieren, wer diese Upgrades auslösen kann.
Schritte zur Verhinderung nicht autorisierter Upgrades:
upgrade_cap
Set: Definieren Sie bei der Bereitstellung Ihres Move-Pakets das,upgrade_cap
um einzuschränken, wer Ihren Vertrag upgraden kann. 2.Upgrade-Berechtigungen erteilen: Stellen Sie die Upgrade-Funktion nur vertrauenswürdigen Adressen zur Verfügung (z. B. Administratoren).
Beispiel für einen Bewegungscode:
module MyPackage {
use 0x1::UpgradeCap;
public fun initialize(owner: address) {
let cap = UpgradeCap::new(owner); // Create upgrade capability for the owner
// Store the upgrade cap in a resource or object
}
public fun upgrade(owner: address) {
// Only the owner (who has the upgrade cap) can call this function
UpgradeCap::assert_cap(&cap, owner); // Ensure the caller has the upgrade cap
// Perform the upgrade logic here
}
}
upgrade_cap
### CLI-Beispiel für die Einrichtung:
Wenn Sie ein Move-Paket veröffentlichen oder bereitstellen, können Sie die upgrade_cap
ID an den Sui-Client weitergeben:
sui client publish --gas-budget 10000 --upgrade-cap <upgrade-cap-id>
Häufige Fehler:
***Das upgrade_cap
**wurde nicht richtig zugeordnet: Wenn die Upgrade-Funktion nicht korrekt eingerichtet ist, können unbefugte Adressen versehentlich die Erlaubnis erhalten, den Vertrag zu aktualisieren.
*Falsche Adresse für das Upgrade: Stellen Sie sicher, dass nur autorisierte Adressen (diejenigen, die das Zertifikat upgrade_cap
besitzen) das Upgrade durchführen können.
Bewährte Methoden:
*Upgrade-Fähigkeit einschränken: Geben Sie das nur an vertrauenswürdige Adressen oder Administratoren upgrade_cap
weiter.
*Test auf Testnet/Localnet: Testen Sie Ihre Upgrade-Logik immer in lokalen/Testnetzwerken, um sicherzustellen, dass nicht autorisierte Upgrades verhindert werden.
*Sicher upgrade_cap
speichern: Stellen Sie sicher, dass die Adresse, an der sich die Upgrade-Funktion befindet, sicher verwaltet wird.
Indem Sie kontrollierenupgrade_cap
, wer Upgrades auslösen kann, und sorgfältig einschränken, können Sie unbefugte Upgrades vermeiden und sicherstellen, dass Ihr Vertrag auch nach der Bereitstellung sicher bleibt.
Um Upgrades eines Move-Pakets in Sui zuunautorisieren, müssen Sie das upgrade_cap
Objekt zurückziehen oder brennen**, da diese Funktion der einzige Mechanismus für die Autorisierung von Paket-Upgrades ist. Sobald das Paket upgrade_cap
zerstört ist (z. B. über public entry fun burn
in Move), wird das Paketdauerhaftigunveränderlich, da Sui eine strenge Kontrolle der Aktualisierbarkeit auf Protokollebene durchsetzt. Dies unterscheidet sich von EVM-Ketten, bei denen die Erweiterbarkeit von Proxymustern oder veränderbarem Speicher abhängt. Das Modell von Sui gewährleistet deterministische Sicherheit, indem Upgrades explizit an den Besitz der Funktionen gebunden sind. Es hat sich bewährt, einenGovernance-kontrollierten Wrapper(z. B.AdminCap
) um den programmierbaren Widerruf herum zu implementieren, anstatt ihn direkt zu verbrennen, um eine zukünftige Dezentralisierung zu upgrade_cap
ermöglichen.
Um Upgrades für ein Move-Paket im Sui-Netzwerk nicht autorisiert oder zu deaktivieren, müssen Sie das UpgradeCap
Objekt, das bei der ersten Bereitstellung des Pakets generiert wurde, zerstören oder übertragen. Das UpgradeCap
ist ein spezielles Objekt, das die Erlaubnis zum Upgrade dieses bestimmten Pakets erteilt. Ohne diese Fähigkeit sind keine zukünftigen Upgrades möglich.
Um Upgrades zu verhindern, können Sie die Datei UpgradeCap
an eine unzugängliche Adresse übertragen (wie0x0
) oder sie mithilfe einer von Ihnen gesteuerten Move-Funktion zerstören. Wenn Sie beispielsweise den Vertrag unveränderlich machen möchten, fügen Sie eine public entry fun burn_upgrade_cap(cap: UpgradeCap)
Funktion in Ihr Modul ein und rufen Sie sie nach der Bereitstellung einfach auf. Nach dem Brennen sind Upgrades dauerhaft deaktiviert.
Hier ist ein Beispiel für ein Move-Snippet zum Brennen:
public entry fun burn_upgrade_cap(cap: UpgradeCap) {
sui::package::delete_upgrade_cap(cap);
}
Wenn Sie die Bereitstellung über die CLI durchführen, können Sie diese Eingabefunktion nach der Veröffentlichung aufrufen:
sui client call \
--package <your_package_id> \
--module <your_module> \
--function burn_upgrade_cap \
--args <upgrade_cap_object_id>
Das Deaktivieren von Upgrades ist unerlässlich, wenn Sie Ihre Smart-Contract-Logik aus Sicherheits- oder Verwaltungsgründen dauerhaft sperren möchten. Sobald die Kappe zerstört oder an eine Adresse ohne privaten Schlüssel verschoben wurde, ist das Paket vollständig unveränderlich.
Um unbefugte Upgrades eines Move-Pakets in Sui zu verhindern, können Sie die Zugriffskontrolle für den Upgrade-Prozess implementieren. Insbesondere können Sie die upgrade_cap
(Upgrade-Funktion) verwenden und sicherstellen, dass sie sicher von einer vertrauenswürdigen Entität oder einem vertrauenswürdigen Konto kontrolliert wird.
Wichtige Konzepte:
upgrade_cap
*Upgrade-Funktionen: Steuern Sie, wer das Move-Paket aktualisieren kann, indem Sie es einer vertrauenswürdigen Adresse zuordnen.
*Zugriffskontrolle: Erlauben Sie nur dem Konto, das über die Upgrade-Funktion verfügt, ein Upgrade auszulösen.
Bewährte Methoden:
1.Sicherer upgrade_cap
Besitz: Gewähren Sie Upgrade-Rechte nur vertrauenswürdigen Adressen (z. B. dem Bereitstellerkonto).
2.Signaturen verwenden: Implementieren Sie eine Logik zur Überprüfung des Unterzeichners während des Upgrade-Vorgangs, um sicherzustellen, dass nur autorisierte Benutzer das Upgrade ausführen können.
Beispielcode:
module MyModule {
use sui::object::{Object, upgrade_cap};
public fun upgrade(beneficiary: &signer) {
let cap = upgrade_cap::get_cap(beneficiary);
assert!(cap.is_some(), 0); // Ensure the signer is authorized
// Logic for upgrading the contract
}
}
CLI-Verwendung:
Verwenden Sie die Sui CLI, um Upgrades sicher zu veröffentlichen und zu verwalten:
sui client publish --upgrade --package <package-id> --capability <upgrade-cap-id>
Häufige Fehler, die es zu vermeiden gilt:
upgrade_cap
*Loose Access Control: Vermeiden Sie die Zuweisung zu Konten, die nicht vertrauenswürdig sind.
*Statusinkompatibilität: Stellen Sie sicher, dass das Upgrade bestehende Objektstatus oder Datenstrukturen nicht beschädigt. Testen Sie immer zuerst auf localnet/testnet.
So verhindern Sie unautorisierte Upgrades eines Move-Pakets:
####1. Machen Sie das Paket unveränderlich
// During publishing, set `UpgradePolicy` to `immutable`
let upgrade_cap = package::claim_and_keep(otw);
package::make_immutable(upgrade_cap); // 🔐 Burn upgrade capability
-Effekt: Keine weiteren Upgrades erlaubt (wie EVM-Verträge).
####2. UpgradeCap
Sicher verwalten
Falls Upgrades erforderlich sind:
-Übertragung upgrade_cap
auf ein MultiSIG/DAO:
transfer::transfer(upgrade_cap, @multisig_address);
-Benutzerdefinierte Authentifizierungslogik verwenden:
public entry fun upgrade(
_: &AdminCap, // Requires admin permission
upgrade_cap: &mut UpgradeCap,
new_package: vector<u8>
) { package::upgrade(upgrade_cap, new_package); }
####CLI-Beispiel (Unveränderlich veröffentlichen)
sui client publish --gas-budget 100000000
# Then call `make_immutable` with the returned `upgrade_cap` ID
###Hauptunterschiede zu EVM
UpgradeCap
-Sui: Die Erweiterbarkeit ist optional (via) möglich.
-EVM: Verträge sind standardmäßig unveränderlich (kein systemeigener Upgrade-Mechanismus).
###Häufige Fallfälle
upgrade_cap
Verlieren: Übertragungen an eine tote Adresse = irreversibel. 2.Überprivilegierte Upgrades: Vermeiden Sie es, EOAs Upgrade-Rechte zu gewähren.
UpgradeCap
Um sicherzustellen, dass niemand ein Move-Paket im Sui-Netzwerk aktualisieren kann — auch Sie selbst — müssen Sie die mit dem Objekt des Pakets verknüpfte Autorität widerrufen. Dies ist das Objekt, das die Genehmigung für zukünftige Upgrades steuert. Wenn Sie dieses Objekt löschen oder unzugänglich machen, wird das Paket unveränderlich und kann nie wieder geändert werden.
Sie können dies sicher tun, indem Sie die sui::package::delete_upgrade_cap
Funktion in Ihrem Move-Code verwenden. Hier ist ein einfaches Beispiel, das Sie Ihrem Modul hinzufügen können:
use sui::package;
use sui::package::UpgradeCap;
public entry fun lock_package(cap: UpgradeCap) {
package::delete_upgrade_cap(cap);
}
Sobald Sie das Paket bereitgestellt haben, führen Sie diese Funktion in einer Transaktion mit der Sui-CLI oder dem SDK aus:
sui client call \
--package <your_package_id> \
--module <your_module_name> \
--function lock_package \
--args <upgrade_cap_object_id> \
--gas-budget 100000000
Auf diese Weise UpgradeCap
wird das verbrannt, was bedeutet, dass es nicht mehr in der Kette existiert und niemand ein weiteres Upgrade autorisieren kann. Dies ist eine bewährte Methode, wenn Sie die Unveränderlichkeit des Codes sicherstellen möchten — insbesondere für produktionsreife DeFi-Verträge, NFT-Standards oder jede Logik, bei der Benutzer auf vertrauenswürdiges, gesperrtes Verhalten angewiesen sind.
Für den architektonischen Kontext: Im Gegensatz zu EVM, bei dem intelligente Verträge standardmäßig unveränderlich sind, ermöglicht Sui aktualisierbare Pakete, was Flexibilität bietet, aber auch zu einer Komplexität der Verwaltung führt. Um Upgrades zu „unautorisieren“, müssen Sie den Schlüssel, der sie zulässt, explizit löschen.
Lesen Sie mehr in der offiziellen Sui-Paket-Upgrade-Dokumentation hier: https://docs.sui.io/build/packages-and-upgrades#making-packages-immutable
Um unautorisierte Upgrades eines Move-Pakets in Sui zu verhindern,zerstören oder sperren Sie das upgrade_cap
Objektnach der Veröffentlichung.
Das upgrade_cap
(von0x2::package::UpgradeCap
) ist ein erstklassiges Objekt, das Upgrade-Berechtigungen gewährt. Wenn es in der Adresse des Herausgebers verbleibt, kann jeder, der Zugriff darauf hat, das Paket aktualisieren.
Bewährte Methoden:
-Für unveränderliche Verträge: Verbrennen Sie die Fähigkeit:
public entry fun burn_upgrade_cap(cap: package::UpgradeCap) {
package::discard(cap); // Destroys the capability
}
-Für kontrollierte Upgrades: Übertragung upgrade_cap
auf ein Multisig- oder DAO-Modul, anstatt es in einem einzigen Konto zu speichern.
- Stellen Sie es niemals
upgrade_cap
bei öffentlichen Veranstaltungen ohne Zutrittskontrolle aus.
CLI-Prüfung:
sui client object --id [PACKAGE_ID] # Look for associated UpgradeCap object
Sobald das upgrade_cap
zerstört ist, wird das Paketdauerhaft unveränderlich— das entspricht Suis Äquivalent zum „Sperren“ eines Vertrags (wie bei den Upgrade-Mustern von EVM).
Dieser Mechanismus ist einzigartig in Suis objektzentriertem Modell: Die Upgrade-Genehmigung wird durch das Eigentum am Objekt durchgesetzt, nicht durch Administratorrollen oder die Logik innerhalb des Vertrags.
Um nicht autorisierte Upgrades in Sui zu verhindern:
1.Verbrenne UpgradeCap
das— Zerstöre es nach dem Einsatz, um Unveränderlichkeit zu gewährleisten.
2.Lock init
in— Geben Sie die Obergrenze nicht weiter, wenn eine dauerhafte Unveränderlichkeit erforderlich ist.
###Beispiel für einen Umzug:
public fun lock_forever(cap: UpgradeCap) {
sui::package::make_immutable(cap) // Burns cap
}
Wichtige Hinweise:
✔ Ohne UpgradeCap
sind keine Upgrades möglich.
✔ Im Gegensatz zu EVM ermöglicht Sui eine reversible Unveränderlichkeit.
CLI-Alternative:
sui client call --function lock_forever --args <CAP_ID>
- (Warnung: Dauerhaft, es sei denn, Sie planen die Wiederherstellungsmethoden im Voraus. ) *
Um unbefugte Upgrades eines Move-Pakets auf Sui zu verhindern, ist der Kernmechanismus das Objekt upgrade_cap. Dieses Funktionsobjekt gewährt die ausschließliche Befugnis, ein bereitgestelltes Paket zu aktualisieren. Ohne die Eigenschaft upgrade_cap kann niemand das Paket aktualisieren, sodass die Sicherheit gewährleistet ist.
Wenn Sie ein Paket über Sui CLI veröffentlichen:
sui client publish --path. /mein_paket --gas-budget 10000
Ein upgrade_cap-Objekt wird erstellt und zurückgegeben. Diese Objekt-ID muss beim Upgrade des Pakets angegeben werden:
sui client upgrade --package. <upgrade_cap_object_id>/neues_paket --upgrade-cap --gas-budget 10000
Um den Upgrade-Prozess abzusichern:
-
Bewahren Sie das upgrade_cap sicher auf, z. B. in einer Hardware-Wallet oder Multisig-Brieftasche.
-
Verwenden Sie ein Multisig-Wallet, um das upgrade_cap aufzubewahren, sodass für Upgrades mehrere Signaturen erforderlich sind.
-
Vermeiden Sie es, die upgrade_cap-Objekt-ID weiterzugeben oder öffentlich zugänglich zu machen.
-
Implementieren Sie eine Off-Chain-Governance, um Upgrades vor der Ausführung zu genehmigen.
-
Schränken Sie den Upgrade-Zugriff mit Umgebungskontrollen oder einer Whitelisting für die Infrastruktur ein.
-
Überwachen Sie Blockchain-Transaktionen, um unbefugte Upgrade-Versuche zu erkennen.
-
Erstellen Sie ein sicheres Backup für upgrade_cap, um zu vermeiden, dass die Upgrade-Fähigkeit verloren geht.
-
Denken Sie daran, dass der Verlust von upgrade_cap bedeutet, dass Sie Ihr Paket nicht mehr aktualisieren können.
-
Im Gegensatz zu EVM-Proxys wird die Upgrade-Steuerung von Sui von einem eigenen Objekt verwaltet, nicht von einer Vertragslogik.
-
Der Move-Code selbst enthält keine Upgrade-Logik; er wird extern über das upgrade_cap verarbeitet.
-
Das upgrade_cap ist an die Metadaten des Pakets gebunden und sichtbar, wenn Paketinformationen abgefragt werden:
Sui-Client Get-Package <package_id>
-
Vergewissern Sie sich immer, dass Sie der Besitzer von upgrade_cap sind, bevor Sie ein Upgrade durchführen.
-
Beim Upgrade bleibt die Paket-ID konstant; nur der Code ändert sich.
-
Der unbefugte Besitz der upgrade_cap ermöglicht böswillige Upgrades.
-
Verwenden Sie Zugriffskontrollmechanismen in Ihrer Betriebsumgebung, um Upgrade-Transaktionen zu schützen.
-
Entwerfen Sie Ihre CI/CD-Pipeline so, dass für Upgrades manuelle Genehmigungsschritte erforderlich sind.
-
Verfolgen Sie, wer in Ihrem Team oder Ihrer Organisation die Upgrade_Cap in Bezug auf die Rechenschaftspflicht hält.
-
Sie können das upgrade_cap-Objekt bei Bedarf auf ein anderes Konto übertragen, aber gehen Sie dabei vorsichtig vor.
-
Sorgen Sie dafür, dass Modernisierungstransaktionen gaseffizient bleiben, indem Sie angemessene Gasbudgets angeben.
-
Die Kombination von On-Chain-Upgrade_Cap-Kontrolle mit Off-Chain-Governance ist die beste Methode für sichere Paket-Upgrades auf Sui.
To prevent unauthorized upgrades of a Move package on Sui, the core mechanism is the upgrade_cap object. This capability object grants exclusive authority to upgrade a deployed package. Without possessing the upgrade_cap, no one can upgrade the package, ensuring security.
When you publish a package via Sui CLI:
sui client publish --path ./my_package --gas-budget 10000
An upgrade_cap object is created and returned. This object ID must be provided when upgrading the package:
sui client upgrade --package ./new_package --upgrade-cap <upgrade_cap_object_id> --gas-budget 10000
To secure the upgrade process:
Store the upgrade_cap securely, such as in a hardware wallet or multisig wallet.
Use a multisig wallet to hold the upgrade_cap so multiple signatures are required for upgrades.
Avoid sharing the upgrade_cap object ID or exposing it publicly.
Implement off-chain governance to approve upgrades before execution.
Restrict upgrade access with environment controls or infrastructure whitelisting.
Monitor blockchain transactions to detect unauthorized upgrade attempts.
Back up the upgrade_cap securely to avoid losing upgrade ability.
Remember that losing the upgrade_cap means you cannot upgrade your package anymore.
Unlike EVM proxies, Sui’s upgrade control is managed by a distinct object, not contract logic.
The Move code itself does not hold upgrade logic; it's handled externally via the upgrade_cap.
The upgrade_cap is tied to the package’s metadata and visible when querying package info:
sui client get-package <package_id>
Always verify the upgrade_cap ownership before attempting upgrades.
When upgrading, the package ID remains constant; only the code changes.
Unauthorized possession of the upgrade_cap allows malicious upgrades.
Use access control mechanisms in your operational environment to protect upgrade transactions.
Design your CI/CD pipeline to require manual approval steps for upgrades.
Track who holds the upgrade_cap in your team or organization for accountability.
You can transfer the upgrade_cap object to another account if needed, but do so cautiously.
Keep upgrade transactions gas-efficient by specifying appropriate gas budgets.
Combining on-chain upgrade_cap control with off-chain governance is the best practice for secure package upgrades on Sui.
###1. Kernsicherheitsmechanismus
UpgradeCap
Sui verwendetupgrade caps(), um die Veränderlichkeit von Paketen zu kontrollieren. Im Gegensatz zu den unveränderlichen Verträgen von EVM erlaubt Sui Upgrades, allerdings mit strengen Eigentumsbeschränkungen.
####Wichtigste Eigenschaften
Funktion | Beschreibung |
---|---|
UpgradeCap | Übertragbares Objekt, das Upgrade-Rechte gewährt |
Richtlinien | Bitflags, die zulässige Änderungen definieren (abwärtskompatibel, additiv, störend) |
Digest-Überprüfung | Stellt sicher, dass der Bytecode dem erwarteten Hash entspricht |
###2. Implementierungsmuster
####Grundlegendes unveränderliches Paket
module my_pkg::governance {
use sui::package;
use sui::transfer;
use sui::tx_context;
// Burn upgrade cap at initialization
public fun init(ctx: &mut TxContext) {
let (upgrade_cap, _) = package::claim_upgrade_cap(ctx);
package::burn_upgrade_cap(upgrade_cap); // Permanent immutability
}
}
####DAO-gesteuerte Upgrades
module my_pkg::dao {
use sui::voting;
use sui::package;
struct DaoCap has key, store {
id: UID,
upgrade_cap: UpgradeCap,
threshold: u64
}
public entry fun authorize_upgrade(
dao: &mut DaoCap,
proposal_id: ID,
policy: u8,
digest: vector<u8>,
ctx: &mut TxContext
) {
assert!(voting::is_approved(proposal_id, dao.threshold), EACCESS_DENIED);
package::authorize_upgrade(&mut dao.upgrade_cap, policy, digest);
}
}
###3. CLI-Durchsetzung
####Als unveränderlich bereitstellen
sui client publish --gas-budget 1000000000 --with-upgrade-capability false
####Unveränderlichkeit überprüfen
sui client object <UPGRADE_CAP_ID> --json | grep "burned"
# Expected: "burned": true
###4. Bewährte Methoden zur Sicherheit
####Richtlinienmatrix aktualisieren
| Richtlinien-Markierung | Zulässige Änderungen | Empfohlen für |
| -----------------------------| -----------------|
| 0x1
(KOMPATIBEL) | Nur Fehlerbehebungen | Stabile Protokolle |
| 0x3
(ADDITIV) | Neue Funktionen | Sich entwickelnde Systeme |
| 0x7
(BREAKING) | Vollständige Änderungen | Frühe Entwicklung |
####Multi-Sig-Schutz
module my_pkg::multisig {
struct UpgradeVault has key {
id: UID,
cap: UpgradeCap,
required: u8,
approvals: vector<address>
}
public entry fun approve(
vault: &mut UpgradeVault,
signer: &signer
) {
let addr = signer::address_of(signer);
assert!(!vector::contains(&vault.approvals, &addr), EALREADY_APPROVED);
vector::push_back(&mut vault.approvals, addr);
if (vector::length(&vault.approvals) >= vault.required) {
package::authorize_upgrade(&mut vault.cap, POLICY_ADDITIVE, digest);
}
}
}
###5. Angriffsvektoren und Abwehrmaßnahmen
| Bedrohung | Lösung | Beispiel für einen Umzug |
| ------------------| --------------|
struct TimedCap { unlock_epoch: u64 }
|Stolen Cap| Time-Lock-Upgrades | |
assert!(digest == expected_digest, EINVALID)
|Bösartiges Upgrade| Digest-Überprüfung erforderlich | |
required = 5/7
|Übernahme der Regierung| Fortschreitende Dezentralisierung | Beginnen Sie mit Multisig |
###6. Teststrategien
####Localnet Dry-Run
sui client publish --upgrade-policy 1 --dry-run
# Verify no upgrade cap is created
####Negativer Testfall
#[test(expected_failure = "EUPGRADE_NOT_AUTHORIZED")]
fun test_unauthorized_upgrade() {
let (_, publisher) = package::claim_upgrade_cap(ctx);
package::authorize_upgrade(&mut cap, 0x7, digest); // Should fail
}
###7. Überwachung und Wiederherstellung
####On-Chain-Verifizierung
// TypeScript SDK check
const isImmutable = await client.getObject({
id: upgradeCapId,
options: { showContent: true }
}).then(obj => obj.data?.content?.type === '0x2::package::UpgradeCap');
####Notfallfrost
public entry fun freeze_forever(cap: UpgradeCap) {
transfer::freeze_object(cap); // Makes cap non-transferable
}
###Wichtige Unterscheidungsmerkmale von EVM | Aspekt | Sui | EVM | -------------| | -----| |Upgrade-Mechanismus| Objektzentriert | Proxy-Muster | |Granularität| Steuerung pro Paket | Alles-oder-Nichts | |Überprüfbarkeit| On-Chain-Upgrade-Verlauf | Undurchsichtige Proxy-Admins |
Für Produktionssysteme:
UpgradeCap
Im Kühlhaus lagern- Implementieren SieMulti-Sig mit Zeitverzögerungen
- Verwenden SieSui Explorer, um Upgrade-Vorschläge zu überwachen
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.

- ... SUIMatthardy+2095
- ... SUIacher+1666
- ... SUIjakodelarin+1092
- ... SUIChubbycheeks +1081
- ... SUITucker+1047
- ... SUIKurosakisui+1034
- ... SUIzerus+890
- Warum benötigt BCS eine genaue Feldreihenfolge für die Deserialisierung, wenn Move-Strukturen benannte Felder haben?65
- Fehler bei der Überprüfung mehrerer Quellen“ in den Veröffentlichungen des Sui Move-Moduls — Automatisierte Fehlerbehebung55
- So maximieren Sie Ihre Gewinnbeteiligung SUI: SUI Staking vs Liquid Staking414
- Sui-Transaktion schlägt fehl: Objekte sind für eine andere Transaktion reserviert49
- Sui Move Error - Transaktion kann nicht verarbeitet werden Keine gültigen Gasmünzen für die Transaktion gefunden316