Sui.

Beitrag

Teile dein Wissen.

BigSneh.
Jul 30, 2025
Experten Q&A

Kann ein intelligenter Vertrag seinen eigenen Objektstatus in Sui besitzen und mutieren?

Ich versuche, diesen Aspekt des Sui-Netzwerks zu verstehen, weil ich entweder etwas baue, debugge oder implementiere, das diesen Bereich berührt. 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
  • Architecture
  • Move
7
15
Teilen
Kommentare
.

Antworten

15
Paul.
Paul4340
Jul 31 2025, 05:35

In Sui kann ein intelligenter Vertrag seinen eigenen Objektzustand nicht direkt besitzen oder mutieren. Stattdessen interagiert der Vertrag mit Objekten über das Eigentumsmodell, bei dem Objekte bestimmten Adressen gehören (z. B. der Brieftasche des Benutzers oder einem Konto). Intelligente Verträge in Sui können den Zustand von Objekten definieren und ändern, die anderen Parteien (z. B. Benutzern) gehören, aber sie können Objekte nicht selbst besitzen.

Wichtige Konzepte:

*Objekteigentum: Objekte gehören Adressen, nicht Verträgen. *Interaktion mit Objekten: Ein Vertrag kann den Status eines Objekts manipulieren, aber nur, wenn er über Eigentum oder veränderbare Referenzen Zugriff auf dieses Objekt hat.

Beispielcode:

module MyModule {
    use sui::object::{Object, move_to};

    public fun update_object_state(obj: &mut Object) {
        // Modify the state of the object owned by someone else
        obj.some_field = 42;
    }
}

CLI-Verwendung:

Bei der Bereitstellung kann der Vertrag nur Objekte bearbeiten, die zu einer Adresse gehören, nicht zu ihr selbst.

Bewährte Methoden:

  • Stellen Sie sicher, dass die Verträge das Eigentumsmodell von Sui respektieren und dass Objekte zwischen Verträgen und Benutzerkonten weitergegeben werden.
  • Verwalte deine Berechtigungen stets sicher, um unbefugten Zugriff auf den Objektstatus zu verhindern.
8
Kommentare
.
Ashford.
Jul 31 2025, 06:34

Kann ein Smart Contract seinen eigenen Objektstatus in Sui besitzen und mutieren?

Nein, in Sui könnenSmart Contracts ihren eigenen Staat nicht direkt besitzen oder mutieren. Der Besitz und die Veränderung von Ressourcen (wie Münzobjekten oder benutzerdefinierten Objekten) werden durch Benutzerkonten oder autorisierte Adressen geregelt, nicht durch den Vertrag selbst.

Wichtige Punkte:

*Eigentümer: Intelligente Verträge in Sui sind staatenlos; sie definieren Logik, besitzen oder speichern den Staat selbst aber nicht. *Ressourcenbesitz: Ressourcen (wie Münzen oder benutzerdefinierte Objekte) müssen einer Adresse oder einem Unternehmen gehören, nicht dem Vertrag.

Typischer Ablauf:

1.Kontobesitz: Eine Adresse oder ein Benutzer besitzt das Objekt (z. B. eine Münze). 2.Intelligente Vertragsausführung: Der Vertrag kann den Status von Objekten ändern, die ihm vom Eigentümer übergeben werden.

Beispiel für einen Ablauf:

1.Der Benutzer erstellt ein Objekt(z. B. eine Münze). 2.Der Benutzer übergibt das Objektan den Mutationsvertrag. 3. Der Vertrag modifiziert das Objekt, aber es gehört ihm nicht.

Beispiel für einen Move-Code:

public fun mutate_object(owner: &mut Address, coin: &mut Coin) {
    Coin::transfer(coin, &mut owner);
}

CLI-Beispiel:

Stellen Sie einen Vertrag bereit und rufen Sie eine Funktion auf, um den Zustand eines Objekts zu ändern:

sui client publish --gas-budget 10000 --module <module-path>

Häufige Fehler:

*Eigentümerverwirrung: Der Versuch, einen Staat zu ändern oder auf einen Staat zuzugreifen, der nicht Teil des Vertrags ist, führt zu Fehlern. &mut*Falsche Veränderbarkeit: Stellen Sie sicher, dass das Objekt, das an den Vertrag übergeben wird, veränderbar ist ().

Bewährte Methoden:

***Stellen Sie sicher, dass die Objekte, die an den Vertrag übergeben werden, die richtige Adresse besitzen. *Testen Sie mit Localnet/Testnet: Überprüfen Sie immer die Vertragslogik und die Statusänderungen, bevor Sie sie im Mainnet bereitstellen.

7
Kommentare
.
Benjamin XDV.
Jul 31 2025, 09:42

In Sui können Smart Contracts (Move-Pakete) aufgrund des objektzentrierten Eigentumsmodells von Sui Objekte selbstnichtdirekt besitzen oder mutieren. Objekte müssen einerAdresse,einem anderen Objektgehören oder alsgemeinsam genutzt/unveränderlichgekennzeichnet sein — Pakete enthalten nur Codelogik. Für autonome Mutationen verwenden Sie in der Regelgemeinsam genutzte Objekte(mit Konsens) oderdynamische Felder, bei denen übergeordnete Objekte untergeordnete Objekte kontrollieren. Dies unterscheidet sich grundlegend von der Vertragsspeicherung von EVM, da hier explizite Eigentumsübertragungen über Transaktionen und nicht über interne Vertragsmaßnahmen erforderlich sind. Übliche Muster beinhalten dasEinpacken von Objektenin vom Administrator gesteuerte Container oder die Verwendung vonfähigkeitsbasiertem Design, um Zustandsmutationen sicher zu verwalten.

6
Kommentare
.
theking.
Jul 30 2025, 11:13

Ja, in Sui kann ein intelligenter Vertragseinen eigenen Objektstatus mutieren, aberer kann Objekte nicht eigenständig besitzen. Im objektzentrierten Modell von Sui mussjedes Objekt entweder einer Adresse oder einem anderen Objekt gehören oder als gemeinsam genutzt markiertsein. Intelligente Verträge haben keine Adresse wie bei EVM-Ketten (z. B. Ethereum). Sie müssen sich also auf Muster des Objektbesitzes wiein Objekte verpackte Datenstrukturenodergemeinsam genutzte Objekteverlassen, um über Transaktionen hinweg bestehen zu bleiben und ihren Status zu ändern.

structUm den internen Status eines Vertrags zu aktualisieren, entwirfst du normalerweise einen key(mit der entryFähigkeit), Statusdaten zu speichern, übergibst sie an deine Funktion und führst Aktualisierungen mithilfe von Referenzen durch. Das Eigentum an dieser Struktur liegt bei einem Benutzer oder ist als gemeinsam genutzt markiert, um einen breiteren Zugriff zu ermöglichen.

Beispiel — Änderung des internen Zustands mithilfe eines eigenen Objekts

module example::counter {
    use sui::object::{Self, UID};
    use sui::tx_context::{Self, TxContext};

    struct Counter has key {
        id: UID,
        value: u64,
    }

    public entry fun create(ctx: &mut TxContext): Counter {
        Counter { id: object::new(ctx), value: 0 }
    }

    public entry fun increment(counter: &mut Counter) {
        counter.value = counter.value + 1;
    }
}

createIn diesem Beispiel wird Counterein Objekt initialisiert. incrementkann nur aufgerufen werden, indem eine veränderbare Referenz auf dieses Objekt übergeben wird. Das Eigentum liegt bei einem Benutzer oder einem anderen Objekt, nicht beim Vertrag selbst.

Gemeinsam genutzte Objekte für globalen Zugriff

sharedWenn in Ihrem Vertragmehrere Benutzer mit demselben Objekt interagierenmüssen, markieren Sie es als. Beispiele für Anwendungsfälle: DAOs, globale Zähler, On-Chain-Spiele.

public entry fun increment_shared(counter: &mut Counter) {
    counter.value = counter.value + 1;
}

Bei der Bereitstellung oder über eine explizite Funktion müssen Sie das Objekt gemeinsam nutzen:

sui client call \
  --function share_object \
  --module counter \
  --package <package_id> \
  --args <counter_id>

CLI-Tipps:

  • Um die Eigentümerschaft einzusehen: sui client object <object_id>
  • Um zu mutieren: benutze --mutFlag oder Define &mutin der Eingabefunktion
  • Für gemeinsame Mutationen: Stellen Sie sicher, dass das Objekt wie sharedvor der Mutation veröffentlicht wird

SDK-Integration (TS):

tx.moveCall({
  target: `${packageId}::counter::increment`,
  arguments: [tx.object(counterId)]
});

Bewährte Methoden:

  • Vermeiden Sie es, Objektreferenzen in anderen Objekten zu speichern, sofern dies nicht erforderlich ist.
  • Wenn Sie globale Veränderlichkeit benötigen, sindShared Objectsder richtige Ansatz.
  • Einsatz UIDund keyFähigkeit, sicherzustellen, dass Objekte transaktionsübergreifend bestehen bleiben.
  • Stellen Sie immer sicher, dass der Aufrufer das Recht hat, Änderungen vorzunehmen, insbesondere bei gemeinsam genutzten Objekten.

Häufige Fehler:

  • Cannot find mutable reference— Sie übergeben ein unveränderliches Objekt, für das veränderbar erforderlich ist.
  • Object is not shared— Du versuchst ein Objekt zu mutieren, das noch nicht geteilt wurde.
  • Type mismatch— Oft verursacht durch falsche Generika oder missbräuchliche Verwendung von Referenzen.

Mehr über Eigentum und gemeinsame Objekte erfährst du in Suis Entwicklerdokumentation.

5
Kommentare
.
SuiLover.
Jul 30 2025, 11:30

Im Sui-Netzwerk können Smart Contracts keine Objekte im traditionellen EVM-Sinne „besitzen“, da das Eigentum immer an eine Adresse oder ein anderes Objekt gebunden ist. In Move geschriebene Smart Contracts können jedoch ihre eigenen benutzerdefinierten Zustandsobjekte definieren und ändern. Dabei handelt es sich in der Regel um gemeinsam genutzte Objekte oder um eigene Objekte, die von Benutzern weitergegeben werden.

Die wichtigsten Konzepte

  1. Eigentum an Objekten in Sui: Jedes Objekt gehört:

Eine Benutzeradresse (Adresse),

Ein anderes Objekt (verschachtelter Besitz),

Geteilt (für alle zugänglich),

Unveränderlich (kann sich nach der Veröffentlichung nicht ändern).

  1. Status des intelligenten Vertrags: Um einen Vertragsstatus zu erstellen, definieren Entwickler Strukturen in Move-Modulen und veröffentlichen Instanzen dieser Strukturen als Objekte. Diese Objekte werden dann an Eingabefunktionen übergeben, wo ihr Zustand gelesen oder geändert werden kann.

  2. Mutierender Zustand: Um den Objektstatus eines Smart Contracts zu ändern, müssen Sie:

Übergeben Sie das Objekt als &mut an die Funktion.

Stellen Sie sicher, dass es veränderbar ist und je nach Bedarf im Besitz oder gemeinsam genutzt wird.

Haben Sie die richtigen Zugriffsrechte.

  1. Gemeinsam genutzte Objekte für Global State: Wenn Sie einen globalen, vertragsweiten Status wünschen, verwenden Sie gemeinsame Objekte:

struct Counter hat key, store, copy { Wert: u64, }

Fun Increment für den öffentlichen Eintrag (Zähler: &mut Counter) { Zähler.Wert = Zählerwert + 1; }

5 Gemeinsame Objekte veröffentlichen:

Gemeinsam genutzte Objekte müssen bei der Initialisierung explizit erstellt und gemeinsam genutzt werden.

Verwenden Sie move call oder Sui CLI --gas-budget und --shared-object-inputs, um mit ihnen zu interagieren.

  1. Beispiel für einen Bereitstellungsablauf:

Stellen Sie das Modul mit sui move publish bereit.

Rufen Sie eine Eingabefunktion auf, um ein gemeinsames Objekt zu erstellen:

sui Kundenaufruf
<PACKAGE_ID>--paket
--module Zähler
--function create_counter
--args 0
--Gasbudget 10000

Rufen Sie dann increment mit der Objekt-ID des gemeinsam genutzten Objekts auf.

  1. Einschränkungen:

Intelligente Verträge speichern keinen internen Status wie bei Solidity.

Sie arbeiten mit Objekten, die ihnen explizit übergeben wurden.

Im Modul gibt es keinen dauerhaften „Vertragsspeicher“.

  1. Sicherheit und Eigentum:

Sie müssen die Inhaberschaft manuell oder mithilfe von Funktionen überprüfen.

Es ist üblich, Zugriffskontrollmuster wie AdminCap oder Whitelist zu verwenden, um Mutationen zu erkennen.

  1. Bewährte Verfahren:

Vermeiden Sie unnötiges Teilen von Objekten, um den Gasverbrauch und Konflikte zu begrenzen.

Nutzen Sie Funktionen oder Adressüberprüfungen, um den Zugriff sicher zu verwalten.

Verwenden Sie den Schlüssel und speichern Sie ihn ordnungsgemäß, um die Persistenz und Veränderbarkeit von Objekten zu ermöglichen.

  1. CLI-Befehle zum Ansehen:

SUI-Client-Aufruf für Funktionsaufrufen.

SUI-Client-Objekt zur Überprüfung der Objektdaten/des Objektzustands.

Sui Move-Test zum Testen der Zustandslogik.

4
Kommentare
.
shamueely.
Jul 30 2025, 11:38

In Sui kann ein in Move geschriebener intelligenter Vertrag sein eigenes Objekt nicht wirklich „besitzen“, in dem Sinne, wie ein selbstreferenzierender EVM-Vertrag den internen Zustand autonom halten und mutieren könnte. Die objektzentrierte Architektur von Sui bedeutet, dass alle Objekte explizit an den Transaktionskontext übergeben werden müssen und dass ihr Eigentum entweder kontobasiert oder gemeinsam genutzt wird. Intelligente Verträge selbst sind staatenlos — sie definieren nur Logik. Der tatsächliche Zustand ist in Move-Objekten vorhanden, die zum Lesen oder zur Mutation an Funktionen übergeben werden müssen.

Um das Status-Objekt eines Vertrags zu ändern, müssen Sie Ihr Modul so strukturieren, dass seine Daten (normalerweise in einer has keyStruktur gespeichert) entweder:

*Gehört zu einer Benutzeradresse(nützlich für kontobezogene Logik), *Geteilt share_object()über(zur Unterstützung mehrerer Akteure wie bei DeFi, DAOs, Spielen usw.).

entryWenn Sie gemeinsam genutzte Objekte verwenden, müssen Sie Ihre Funktionen mit markieren &mutund das gemeinsame Objekt als Referenz übergeben.

Hier ist ein Beispiel für einen gemeinsamen Zustand, der mutiert werden kann:

module my_app::vault {
    use sui::object::{UID, ID};
    use sui::tx_context::TxContext;

    struct Vault has key {
        id: UID,
        balance: u64,
    }

    public fun init(ctx: &mut TxContext): Vault {
        Vault { id: object::new(ctx), balance: 0 }
    }

    public entry fun deposit(vault: &mut Vault, amount: u64) {
        vault.balance = vault.balance + amount;
    }
}

In diesem Beispiel Vaultmuss es sich um ein gemeinsam genutztes Objekt handeln, wenn Sie möchten, dass mehrere Benutzer über entryFunktionen darauf zugreifen können. Bei der Bereitstellung teilen Sie das Objekt wie folgt:

sui client call --function share_object --args <vault_id>

Einmal geteilt, entrykann jede Funktion das Objekt mutieren — vorausgesetzt, sie erhält es als Eingabe. Sui sorgt durch Eigentumsregeln und Versionierung für Sicherheit, um Rennbedingungen vorzubeugen.

Um mehr darüber zu erfahren, wie intelligente Verträge in Sui mit Objektstatus, geteiltem Zugriff und Eigentum interagieren, besuchen Sie: https://docs.sui.io/build/programming-model/object-basics

Dieser Ansatz unterscheidet Sui von EVM-Ketten. Sie ändern den internen Vertragsspeicher nicht direkt. Stattdessen mutieren Sie Move-Objekte, die explizit an Ihre Logikfunktionen übergeben werden, wodurch Parallelität und Überprüfbarkeit verbessert werden.

4
Kommentare
.
Alya.
Alya-14
Jul 30 2025, 17:29

Nein, ein intelligenter Vertrag (Move-Modul) kann seinen eigenen Objektstatus in Sui nicht direkt besitzen oder verändern.

Objekte sind erstklassige Entitäten, die Adressen oder anderen Objekten gehören oder gemeinsam genutzt werden —nichtvon Modulen. Zustandsmutation erfolgt über Funktionen, die Objekte als veränderbare Parameter verwenden, wobei Eigentumsregeln auf Transaktionsebene durchgesetzt werden.

Beispiel:

struct Counter has key { id: UID, value: u64 }
public entry fun increment(counter: &mut Counter) { counter.value = counter.value + 1 }

Die incrementFunktion kann Counternur mutieren, wenn die Transaktion eine veränderbare Referenz auf ein Objekt übergibt, das dem Absender gehört. Das Modul selbst hat keinen Status.

Verwenden Sie sharedobjects (transfer::share_object) für einen persistenten, global zugänglichen Zustand. Bestätigen Sie den Besitz immer anhand object::is_owner()linearer Typregeln und befolgen Sie diese.

4
Kommentare
.
Arnold.
Arnold3036
Jul 31 2025, 08:16

Ja, ein Sui Smart Contract (Move-Paket) kann seinen eigenen Zustand durchgemeinsame Objekteoderdynamische Objektfelderbesitzen und verändern, im Gegensatz zum zustandslosen Design von EVM.

####Wichtige Mechanismen 1.Gemeinsam genutzte Objekte:

  • Weltweit von jedem veränderbar (mit Regeln).
  • Definiert mit key + storeund gehört ihm 0x0(Paketadresse).
  struct ContractState has key, store {
      id: UID,
      value: u64,
  }

2.Dynamische Objektfelder:

  • Das Paket kann Objekte „besitzen“, indem es ihre IDs speichert.
  fun add_state(ctx: &mut TxContext) {
      let state = ContractState { id: object::new(ctx), value: 42 };
      transfer::share_object(state); // Make it globally mutable
  }

###Warum Sui einzigartig ist -Kein „msg.sender": Die Zugriffskontrolle erfolgt über das Typsystem von Move, nicht über EOAS. -Parallele Mutationen: Gemeinsam genutzte Objekte ermöglichen gleichzeitige Schreibvorgänge (im Gegensatz zu den serialisierten TXs von EVM).

###CLI-Beispiel

# Call a function that mutates shared state
sui client call \
    --function update_state \
    --module your_module \
    --package 0xYOUR_PACKAGE \
    --args 0xSHARED_OBJECT_ID 100 \ # New value
    --gas-budget 10000000

###Häufige Fallfälle 1.Over-Sharing: Vermeiden, share_objectes sei denn, es ist wirklich notwendig (Verwendung transfer::transferfür Privateigentum). 2. sui::lockRennbedingungen: Design für parallelen Zugriff (z. B. Nutzung).

4
Kommentare
.
290697tz.
Jul 30 2025, 11:35

Ja, ein intelligenter Vertrag in Sui kann seinen eigenen Objektstatus ändern, aber er muss dies durch Objekte tun, die explizit an seine Funktionen übergeben werden. Im Objektmodell von Sui gibt es keinen internen Vertragsspeicher wie in Ethereum; stattdessen wird der Zustand durch veränderbare Objekte aufrechterhalten. Diese Objekte können Benutzern gehören oder im Netzwerk gemeinsam genutzt werden. Um den Zustand zu ändern, definieren Sie eine Struktur mit der Schlüsselfähigkeit has und schreiben dann Eingabefunktionen, die eine &mut-Referenz auf das Objekt akzeptieren. Gemeinsam genutzte Objekte ermöglichen globalen Zugriff und sind erforderlich, wenn mehrere Benutzer mit demselben Status interagieren müssen. Um gemeinsam genutzte Objekte zu mutieren, muss die Funktion als öffentlicher Eintrag markiert und bei Aufrufen die richtige Objekt-ID übergeben werden. Verträge „besitzen“ den Staat nicht direkt, sondern basieren auf Daten, die ihnen über Argumente übergeben werden. Sie können die Zugriffskontrolle mithilfe von Funktionen oder durch Überprüfung der Absenderadressen erzwingen. Dieses Design unterstützt eine hohe Parallelität, eine bessere Skalierbarkeit und eine feinkörnige Rechtevergabe. Insgesamt verändern Smart Contracts in Sui ihren Zustand, indem sie MOVE-definierte Objekte unter strengen Eigentums- und Zugriffsregeln modifizieren.

3
Kommentare
.
Evgeniy CRYPTOCOIN.
Jul 31 2025, 09:09

Ja, ein Sui Smart Contract (Move-Modul) kann seine eigenen Objekte besitzen und mutieren über:

1.Eigene Objekte— Während der Modulinitialisierung erstellt (gespeichert unter der Paket-ID). 2.Gemeinsam genutzte ObjektesharedFür den Zugriff mehrerer Autoren markiert.

###Hauptunterschiede zu EVM:Kein externer Eigentümer— Objekte können zum Paket selbst gehören. ✔Direkte Mutation— Kein Genehmigungssystem erforderlich (im Gegensatz zu ERC-20).

Beispielmuster:

struct MyState has key { id: UID, value: u64 }  

// Module can mutate its own object  
public fun update(self: &mut MyState) { self.value += 1 }  

Achten Sie auf:

  • Lagerkosten für eigene Objekte.
  • Verwendung sharedfür den globalen Staat.
  • (Das Objektmodell von Sui ermöglicht autonome Verträge — es sind keine Proxy-Wallets erforderlich. *) *
3
Kommentare
.
Bekky.
Bekky1762
Jul 31 2025, 10:27

###1. Kernkonzept: Objektzentriertes Eigentümer Im Gegensatz zu den Speichervariablen von EVM arbeiten Sui Smart Contracts übereigene Objekte, die aufgrund strenger Eigentumsregeln mutiert werden können.

####Hauptmerkmale | Funktion | Sui | EVM | --------------| | | -----| | Zustandsdarstellung | Objekte mit UID | Speichervariablen | | Eigentum | Explizite keyFähigkeit | Implizite Vertragsbindung | | Wandelbarkeit | &mutReferenzen | Direkte Änderung |


###2. Implementierungsmuster verschieben

####Eigenverantwortlicher Vertrag

module my_contract::state {
    use sui::object::{Self, UID};
    use sui::transfer;
    use sui::tx_context;

    // Contract's state object
    struct ContractState has key, store {
        id: UID,
        counter: u64
    }

    // Initialize and own the state
    public fun init(ctx: &mut tx_context::TxContext) {
        let state = ContractState {
            id: object::new(ctx),
            counter: 0
        };
        transfer::share_object(state); // Make shared for mutability
    }

    // Mutate owned state
    public entry fun increment(state: &mut ContractState) {
        state.counter = state.counter + 1;
    }
}

####Eigentumsmodelle | Modell | Codemuster | Anwendungsfall | | --------------------| ----------| |Gemeinsam| | transfer::share_objectGlobaler veränderlicher Zustand | transfer::freeze_object|Unveränderlich| | Konfiguration | transfer::transfer|Besitzer| | Benutzerressourcen |


###3. CLI-Interaktionen

####Bereitstellung staatlicher Verträge

sui client publish --gas-budget 1000000000
# Output: 
# - Package ID: 0x123...
# - Shared Object ID: 0x456...

####Mutierender Zustand

sui client call \
  --package 0x123 \
  --module state \
  --function increment \
  --args 0x456 \  # Shared object ID
  --gas-budget 100000000

###4. Architektonische Überlegungen

####Kontrolle der Parallelität

// Use `version` field for optimistic concurrency
struct ConcurrentState has key {
    id: UID,
    value: u64,
    version: u64
}

public fun update(
    state: &mut ConcurrentState,
    new_value: u64,
    expected_version: u64
) {
    assert!(state.version == expected_version, EVERSION);
    state.value = new_value;
    state.version = state.version + 1;
}

####Zustandsmigration (Upgrades)

module my_contract::v2 {
    use my_contract::state::ContractState;

    // Migrate V1 state to V2
    public entry fun upgrade_state(
        old_state: ContractState,
        ctx: &mut tx_context::TxContext
    ) {
        let new_state = V2State {
            id: object::new(ctx),
            counter: old_state.counter,
            new_field: 0
        };
        transfer::share_object(new_state);
    }
}

###5. Sicherheitsmuster

####Funktionsbasierter Zugriff

struct AdminCap has key, store {
    id: UID
}

public entry fun secure_update(
    state: &mut ContractState,
    _cap: &AdminCap
) {
    // Only callable with capability
    state.counter += 1;
}

####Einreiseschutz

struct Lock has key {
    id: UID,
    locked: bool
}

public entry fun guarded_update(
    state: &mut ContractState,
    lock: &mut Lock
) {
    assert!(!lock.locked, ELOCKED);
    lock.locked = true;
    state.counter += 1;
    lock.locked = false;
}

###6. Häufige Fallstricke und Lösungen

| Fehler | Ursache | Korrigieren | | --------------| -----| | EInvalidSharedObjectUse| Falsche Veränderlichkeit | &mutReferenz verwenden | | EMissingOwner| Objekt gehört nicht zum Paket | transfer::transferzur Paketadresse | EImmutable| share_object| Es wird versucht, ein eingefrorenes Objekt zu ändern | Initialisieren als |


###7. Leistungsoptimierung

####Gemischte Mutationen

public entry fun batch_update(
    states: vector<&mut ContractState>,
    delta: u64
) {
    let i = 0;
    while (i < vector::length(&states)) {
        let state = vector::borrow_mut(states, i);
        state.counter = state.counter + delta;
        i = i + 1;
    }
}

####Vergleich der Gaskosten | Betrieb | Gas (SUI) | -----------| | ----------| | Einzelaktualisierung | 2.500 | | Batch-Aktualisierung (10 Artikel) | 3.800 |


###Wichtige Unterscheidungsmerkmale von EVM 1.Explizites Eigentums: Objekte müssen bewusst übertragen werden 2. key + store``copy + dropFeinkörnige Veränderlichkeit: gegen Fähigkeiten 3.Parallele Verarbeitung: Unabhängige Objekte mutieren gleichzeitig

Für den Einsatz in der Produktion:

  • Speichern Sie den kritischen Status alsgemeinsam genutzte Objekte
  • Verwenden SieFunktionenfür privilegierte Operationen
  • Implementieren Sie vorabPfade zur Zustandsmigration
1
Kommentare
.

Weißt du die Antwort?

Bitte melde dich an und teile sie.