Beitrag
Teile dein Wissen.

Beherrschen von Move-Sprachkonzepten — Kurs #2
ImKurs #1, den ich bereits gemacht habe, wurden Sie zwar in die Grundlagen des Schreibens intelligenter Verträge in Move und der Erstellung einfacher DApps auf der Sui-Blockchain eingeführt, aber dieser Kurs konzentriert sich darauf,Ihr Verständnis der Move-Sprache selbst zu vertiefen— von ihrem leistungsstarken Typsystem bis hin zu fortgeschrittenen Mustern wie Generics, Ereignissen, Modulen und Zugriffskontrollmechanismen.
Am Ende dieses Kurses werden Sie in der Lage sein:
- Schreiben Sie modularen, wiederverwendbaren und sicheren Move-Code
- Nutze Generika, Fähigkeiten und Ressourcentypen effektiv
- Implementieren Sie mithilfe von Funktionen eine differenzierte Zugriffskontrolle
- Senden Sie Ereignisse aus und hören Sie sich diese an, um eine Integration außerhalb der Kette zu ermöglichen
- Arbeiten Sie mit komplexen Datenstrukturen wie Tabellen und Vektoren
- Verstehe, wie sich Move von anderen intelligenten Vertragssprachen wie Solidity unterscheidet
Tauchen wir in das Herz der Move-Sprache ein!
Schritt 1: Die wichtigsten Sprachfunktionen von Move verstehen
Move wurde unter Berücksichtigung von Sicherheit und Klarheit entwickelt. Lassen Sie uns einige der wichtigsten Funktionen untersuchen, die Move als intelligente Vertragssprache einzigartig machen.
1.1 Ressourcenorientierte Programmierung (überarbeitet)
Im Mittelpunkt von Move steht das Konzept derRessourcen. Dabei handelt es sich um spezielle Typen, die nicht kopiert oder gelöscht werden können, sofern dies nicht ausdrücklich erlaubt ist. Dies erzwingt den sicheren Umgang mit digitalen Assets wie Token oder NFTs.
module examples::token {
use sui::object::{Self, UID};
struct MyToken has key, store {
id: UID,
value: u64,
}
public fun mint(ctx: &mut TxContext): MyToken {
MyToken {
id: object::new(ctx),
value: 100,
}
}
}
In diesem Beispiel:
MyToken
- key
ist eineRessource, weil sie die Fähigkeit hat.
store
- Sie kann gespeichert (id
) und anhand ihrer Eigenschaft eindeutig identifiziert werden.
- Es kann nicht dupliziert oder gelöscht werden, sofern nicht anders angegeben.
Dadurch wird garantiert, dass jede MyToken
Instanz einzigartig verwaltet und verwaltet wird, sodass versehentliches Duplizieren oder Löschen verhindert wird.
1.2 Fähigkeitensystem
Jeder Move-Typ hat eine Reihe vonFähigkeiten, die definieren, welche Operationen er unterstützt:
Fähigkeit | Bedeutung |
---|---|
copy | Kann dupliziert werden |
drop | Kann zerstörungsfrei weggeworfen werden |
store | Kann im globalen Speicher gespeichert werden |
key | Kann als Struktur mit einem ID-Feld (d. h. einem Objekt) verwendet werden |
Beispiel:
struct Example has copy, drop { value: u64 }
Das Verständnis dieser Fähigkeiten ist für die Gestaltung sicherer und vorhersehbarer intelligenter Verträge unerlässlich.
Warum Fähigkeiten wichtig sind
Fähigkeiten setzen bei der Kompilierung strenge Regeln durch. Zum Beispiel:
- Eine Struktur mit nur
key
undstore
kann nicht kopiert oder gelöscht werden. - Sie können keine Struktur aus einer Funktion zurückgeben, die nicht gelöscht werden kann, es sei denn, sie wird gespeichert oder übertragen.
Dies verhindert Fehler wie doppelte Ausgaben oder versehentlichen Token-Verlust.
1.3 Generische Daten und Typparameter
Move unterstützt generische Typen, sodass Entwickler flexiblen und wiederverwendbaren Code schreiben können.
module examples::storage {
use sui::object::{Self, UID};
struct Box<phantom T> has key {
id: UID,
content: T,
}
public fun new_box<T>(ctx: &mut TxContext, content: T): Box<T> {
Box {
id: object::new(ctx),
content,
}
}
}
Hier <T>
ist einTypparameter, der die Box
Arbeit mit jedem Typ ermöglicht und gleichzeitig sicher und effizient ist.
Hinweis: Das
phantom
Schlüsselwort gibt an, dassT
sich dies nicht auf die Laufzeitdarstellung der Struktur auswirkt — nützlich für die abstrakte Modellierung.
Schritt 2: Modulare Entwicklung und Paketmanagement
Wenn Ihre Move-Projekte immer komplexer werden, wird die Organisation Ihres Codes von entscheidender Bedeutung.
2.1 Move-Pakete erstellen und veröffentlichen
EinMove-Paketenthält ein oder mehrere Module und definiert Abhängigkeiten. Es ist die Einheit für Bereitstellung und Versionierung in Move.
Verzeichnisstruktur:
sources/
place.move
user.move
Move.toml
Definieren Sie Abhängigkeiten inMove.toml
:
[dependencies]
Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework" }
MyLibrary = { local = "../my-library" }
Sie können Pakete im Sui-Netzwerk veröffentlichen und sie in mehreren DApps wiederverwenden.
2.2 Wiederverwendung vorhandener Module
coin``transfer``tx_context
DasSui Frameworkbietet praxiserprobte Module wie, und. Prüfen Sie immer, was verfügbar ist, bevor Sie benutzerdefinierte Logik schreiben.
Um beispielsweise ein Objekt zu übertragen:
use sui::transfer;
public entry fun send_place(place: Place, recipient: address) {
transfer::public_transfer(place, recipient);
}
Die Verwendung von Standardbibliotheken gewährleistet eine sicherere, schnellere Entwicklung und bessere Interoperabilität.
Schritt 3: Ereignisse und Off-Chain-Kommunikation
Um reale Anwendungen zu erstellen, müssen Ihre Move-Verträge mit Off-Chain-Systemen wie Frontends oder Indexern kommunizieren.
3.1 Ausstrahlende Ereignisse
Move ermöglicht die Ausgabe vonEvents, die von externen Diensten indexiert werden können.
use sui::event;
struct PlaceCreated has drop {
name: String,
}
public fun emit_place_created(name: String) {
event::emit(PlaceCreated { name });
}
Dieses Ereignis wird in der Blockchain erscheinen und kann von Explorern oder Indexierungstools aufgegriffen werden.
3.2 Ereignisse anhören
Verwenden Sie Tools wieSuite Explorer,Subsquidoder die Sui JSON-RPC-API, um auf ausgegebene Ereignisse zu warten und in Ihrer Anwendung entsprechend zu reagieren.
In JavaScript/TypeScript:
import { JsonRpcProvider } from '@mysten/sui.js';
const provider = new JsonRpcProvider('https://fullnode.devnet.sui.io');
const events = await provider.getEvents({
MoveEventType: '0x...::example::PlaceCreated'
});
Schritt 4: Zugriffskontrolle und Sicherheitsmuster
Sicherheit ist beim Umgang mit intelligenten Verträgen von größter Bedeutung. Move bietet verschiedene Tools zur Implementierung einer robusten Zugriffskontrolle.
4.1 Modell des Objektbesitzes
Sui setzt das Eigentum auf Protokollebene durch. Nur der Besitzer eines Objekts kann es ändern oder übertragen.
public entry fun update_name(sweet_place: &mut SweetPlace, new_name: String) {
sweet_place.name = new_name;
}
Nur der aktuelle Besitzer kann diese Funktion aufrufen.
4.2 Funktionsmuster
Für detailliertere Berechtigungen verwenden Sie dasCapability Pattern— erstellen Sie spezielle Objekte, die eingeschränkten Zugriff auf bestimmte Funktionen gewähren.
struct AdminCap has key { id: UID }
public entry fun grant_admin_cap(ctx: &mut TxContext) {
let cap = AdminCap { id: object::new(ctx) };
transfer::public_transfer(cap, tx_context::sender(ctx));
}
public entry fun restricted_action(_: &AdminCap) {
// perform admin action
}
Jetzt AdminCap
können nur Benutzer ausführen, die das besitzenrestricted_action
.
Dieses Muster wird in DeFi und DAOs häufig verwendet, um Befugnisse sicher zu delegieren.
Schritt 5: Arbeiten mit komplexen Datenstrukturen
Move unterstützt strukturierte Datentypen, die es Entwicklern ermöglichen, komplexe Logik und Beziehungen zu modellieren.
5.1 Vektoren
Vektoren werden verwendet, um geordnete Sammlungen von Objekten desselben Typs zu speichern.
let names = vector[String::utf8(b"Alice"), String::utf8(b"Bob")];
Sie sind nützlich, um Listen von NFTs, Benutzerrollen oder dynamischen Metadaten zu speichern.
Beispiel für die Verwendung:
vector::push_back(&mut names, String::utf8(b"Charlie"));
5.2 Tabellen (über die Sui Standard Library)
Move unterstützt zwar keine nativen Maps oder Hash-Tabellen, aber Sui stellt den Table
Typ in seiner Standardbibliothek bereit.
use sui::table::{Self, Table};
struct Registry has key {
id: UID,
entries: Table<u64, String>,
}
public fun add_entry(registry: &mut Registry, key: u64, value: String) {
table::add(&mut registry.entries, key, value);
}
Verwenden Sie Tabellen, um große Datensätze effizient zu verwalten.
Schritt 6: Testen und Debuggen Ihrer Verträge
Durch das Testen wird sichergestellt, dass sich Ihr Move-Code unter verschiedenen Bedingungen wie erwartet verhält.
6.1 Komponententests in Move
Schreiben Sie Komponententests mithilfe des Test-Frameworks direkt in Ihre Move-Module.
#[test]
public fun test_create_sweet_place() {
let ctx = tx_context::dummy();
create_sweet_place(&mut ctx, String::utf8(b"My House"));
}
Führen Sie Tests durch mit:
sui move test
6.2 Sui Explorer verwenden
Verwenden Sie nach der Bereitstellung Ihres Vertrags den Sui Explorer, um Transaktionen zu überprüfen, Objektstatus einzusehen und Probleme zu debuggen.
Schritt 7: Reale Anwendungen von Advanced Move-Konzepten
Nachdem Sie nun die wichtigsten Sprachfunktionen verstanden haben, wollen wir untersuchen, wie sie sich auf reale Szenarien anwenden lassen.
7.1 NFT Minting Platform
Erstellen Sie eine Plattform, die es Benutzern ermöglicht, NFTs zu minten, die durch Move-Ressourcen unterstützt werden, und nutzen Sie dabei die Eigentums- und Ressourcenmodelle.
7.2 DAO-Wahlsystem
Implementieren Sie eine dezentrale autonome Organisation (DAO), die Move für Abstimmungen, Vorschläge und Verwaltung nutzt und Ereignisse und Funktionen für sichere Aktionen nutzt.
7.3 Token-Swaps und AMMs
Erstellen Sie eine dezentrale Börse (DEX) mithilfe von Move-Modulen zur Darstellung von Liquiditätspools und Token-Swaps. Verwenden Sie Generics und Tabellen für ein effizientes Zustandsmanagement.
- Sui
- Architecture
- Move
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 Fehlerbehebung42
- Sui-Transaktion schlägt fehl: Objekte sind für eine andere Transaktion reserviert24
- Wie interagieren Fähigkeitsbeschränkungen mit dynamischen Feldern in heterogenen Sammlungen?04