Hvordan skrive en smart kontrakt i WebAssembly på Ontology-nettverket? Del 1: Rust

Hvordan skrive en smart kontrakt i WebAssembly på Ontology-nettverket? Del 1: Rust

Ontology Wasm-teknologin reducerer omkostningerne ved at overføre smarte kontrakter til dApp med kompleks forretningslogik på blockchain, hvilket væsentligt beriger dApp-økosystemet.

I øjeblikket Ontology Wasm understøtter samtidig udvikling på både Rust og C++. Rust-sproget understøtter Wasm bedre, og den genererede bytekode er simplere, hvilket yderligere kan reducere omkostningerne ved kontraktopkald. Så hvordan bruger man Rust til at udvikle kontrakter på Ontology-netværket?

Udvikling af en WASM-kontrakt med Rust

Oprettelse af en kontrakt

Cargo er et godt værktøj til projektoprettelse og pakkehåndtering ved udvikling af programmer i Rust, som hjælper udviklere med bedre at organisere samspillet mellem kode og tredjepartsbiblioteker. For at oprette en ny Ontology Wasm-kontrakt, skal du blot udføre følgende kommando:

Hvordan skrive en smart kontrakt i WebAssembly på Ontology-nettverket? Del 1: Rust

Den projektstruktur, den genererer:

Hvordan skrive en smart kontrakt i WebAssembly på Ontology-nettverket? Del 1: Rust

Cargo.toml-filen bruges til at konfigurere grundlæggende information om projektet og information om afhængige biblioteker. Sektionen [lib] i filen skal sættes til værdien crate-type = [“cdylib”]. Filen lib.rs anvendes til at skrive kontraktens logikkode. Derudover skal du tilføje afhængighedsparametre i sektionen [dependencies] i Cargo.toml-konfigurationsfilen:

Hvordan skrive en smart kontrakt i WebAssembly på Ontology-nettverket? Del 1: Rust

Med denne afhængighed kan udviklere kalde grænseflader, der interagerer med Ontology-blockchain, samt værktøjer som serialiseringsparameter.

Kontraktens indgangsfunktion

Hver program har en indgangsfunktion, som f.eks. main-funktionen, som vi normalt ser, men kontrakter har ikke en main-funktion. Når en Wasm-kontrakt udvikles med Rust, bruges funktionen invoke som standard som indgangsfunktion til kontraktens anvendelse. Funktionsnavnet i Rust vil være uklart ved kompilering af Rust-kildekoden til bytekode, som en virtuel maskine kan udføre. For at advare compileren mod at generere overskydende kode og reducere kontraktens størrelse, tilføjer funktionen invoke annotationen #[no_mangle].

Hvordan får funktionen invoke parametre til at udføre transaktionen?

Biblioteket ontio_std tilbyder funktionen runtime::input() for at hente parametre til udførelse af transaktionen. Udviklere kan bruge ZeroCopySource til at deserialisere den modtagne byte-array. Den første læste byte-array er navnet på invoke-metoden, efterfulgt af parametrene for metoden.

Hvordan returneres resultatet af kontraktens udførelse?

Funktionen runtime::ret, som tilbydes af biblioteket ontio_std, returnerer resultatet af metodens udførelse.

Den afsluttede invoke-funktion ser således ud:

Hvordan skrive en smart kontrakt i WebAssembly på Ontology-nettverket? Del 1: Rust

Serialisering og deserialisering af kontraktdatadat

Under udviklingen af kontrakter støder udviklerne altid på problemer med serialisering og deserialisering, specifikt hvordan man gemmer struct-datatyper i databasen, og hvordan man deserialiserer et byte-array læst fra databasen for at få struct-typen.

Biblioteket ontio_std tilbyder decoder- og encoder-grænseflader til serialisering og deserialisering af data. Felterne i struct-strukturen implementerer også decoder- og encoder-grænseflader, så strukturen kan serialiseres og deserialiseres. Exempler af klassen Sink er nødvendige, når forskellige datatyper skal serialiseres. Et eksempel af klassen Sink har et set-typet felt buf, som opbevarer byte-typede data, mens alle serialiserede data gemmes i buf.

For data med fast længde (f.eks.: byte, u16, u32, u64 osv.) konverteres dataene direkte til et byte-array og gemmes derefter i buf; for data med variabel længde skal længden serialiseres først, og derefter dataene (f.eks. usignerede heltal med ukendt størrelse, inklusive u16, u32 eller u64 osv.).

Deserialisering er direkte modsat. For hver serialiseringsmetode er der en tilsvarende deserialiseringsmetode. Deserialisering kræver brug af eksempler fra klassen Source. Dette eksempel har to felter: buf og pos. Buf bruges til at opbevare de data, der skal deserialiseres, mens pos bruges til at opbevare den aktuelle læseposition. Når et bestemt datatyp læses, kan du, hvis du kender deres længde, læse dem direkte, for data med ukendt længde skal længden først læses, og derefter indholdet.

Adgang til og opdatering af data i kæden

Ontology-wasm-cdt-rust — har kapslet operationen af metoden til at arbejde med data i kæden, som er praktisk for udviklere til at udføre operationer som tilføjelse, sletning, ændring og forespørgsel af data i kæden på følgende måde:

  • database::get(key) — bruges til at forespørge data fra kæden, hvor key forespørger implementeringen af interface AsRef;
  • database::put(key, value) — bruges til at gemme data i kæden. Key forespørger implementeringen af interface AsRef, mens value forespørger implementeringen af interface Encoder;
  • database::delete(key) — bruges til at slette data fra kæden, hvor key forespørger implementeringen af interface AsRef.

Testning af kontrakten

Når metoderne i kontrakten implementeres, har vi brug for adgang til data i kæden, og vi har brug for den relevante virtuelle maskine til at udføre kontraktens bytekode; derfor er det normalt nødvendigt at implementere kontrakten i kæden til testning. Men denne testmetode er problematisk. For at gøre testningen af kontrakter lettere for udviklere, tilbyder biblioteket ontio_std en mock-modul til testning. Denne modul simulerer data i kæden, hvilket gør det lettere for udviklere at udføre enhedstest af metoderne i kontrakten. Specifikke eksempler kan findes her.

Fejlfinding af kontrakten

console::debug(msg) udskriver fejlfinding information under fejlfinding af kontrakten. Information msg vil blive føjet til logfilen på noden. Det er en forudsætning, at logfilens niveau er indstillet til fejlfinding, når den lokale testnode Ontology kører.

runtime::notify(msg) udskriver relevant fejlfinding information under fejlfinding af kontrakten. Denne metode vil gemme den indtastede information i kæden og kan forespørges fra kæden ved hjælp af metoden getSmartCodeEvent.

Artiklen er blevet oversat af redaktionen Hashrate&Shares specielt for OntologyRussia. klik

Er du udvikler? Tilmeld dig vores tekniske fællesskab på Discord. Tjek også Udviklercenter på vores hjemmeside, hvor du kan finde udvikler værktøjer, dokumentation og meget mere.

Ontology

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster