Hur man skriver ett smart kontrakt med WebAssembly i Ontology-nÀtverket? Del 1: Rust

Hur man skriver ett smart kontrakt med WebAssembly i Ontology-nÀtverket? Del 1: Rust

Ontology Wasm-teknologin sÀnker kostnaden för att överföra smarta kontrakt för dApps med komplex affÀrslogik till blockchain, vilket pÄ sÄ sÀtt berikar dApp-ekosystemet avsevÀrt.

För nÀrvarande Ontology Wasm stöder samtidigt utveckling pÄ bÄde Rust och C++. Rust ger bÀttre stöd för Wasm och den genererade bytekoden Àr enklare, vilket kan ytterligare sÀnka kostnaden för kontraktsanrop. SÄ, hur anvÀnder man Rust för att utveckla kontrakt i Ontology-nÀtverket?

Utveckling av WASM-kontrakt med Rust

Skapa kontrakt

Cargo Àr ett bra verktyg för projektuppbyggnad och paketledning vid utveckling av program med Rust, som hjÀlper utvecklare att bÀttre organisera interaktionen mellan kod och tredjepartsbibliotek. För att skapa ett nytt Ontology Wasm-kontrakt, kör helt enkelt följande kommando:

Hur man skriver ett smart kontrakt med WebAssembly i Ontology-nÀtverket? Del 1: Rust

Projektstrukturen som den genererar:

Hur man skriver ett smart kontrakt med WebAssembly i Ontology-nÀtverket? Del 1: Rust

Filen Cargo.toml anvĂ€nds för att konfigurera grundlĂ€ggande projektinformation och information om beroende bibliotek. Sektionen [lib] i filen mĂ„ste sĂ€ttas till vĂ€rdet crate-type = [“cdylib”]. Filen lib.rs anvĂ€nds för att skriva logiken i kontraktskoden. Dessutom mĂ„ste du lĂ€gga till beroendeparameterar i sektionen [dependencies] i konfigurationsfilen Cargo.toml:

Hur man skriver ett smart kontrakt med WebAssembly i Ontology-nÀtverket? Del 1: Rust

Med detta beroende kan utvecklare anropa grÀnssnitt som interagerar med Ontology-blockchainen samt verktyg som parameterserilisering.

Kontraktsinmatningsfunktion

Ett program har en inmatningsfunktion, som till exempel main-funktionen, som vi vanligtvis ser, men ett kontrakt har ingen main-funktion. NÀr man utvecklar ett Wasm-kontrakt med Rust anvÀnds invocefuktionen som standard som inmatningsfunktion för att anvÀnda kontraktet. Funktionsnamnet i Rust blir oklart vid kompilering av Rust-kÀllkoden till bytekod som kan köras av en virtuell maskin. För att förhindra kompilatorn frÄn att generera överflödig kod och minska storleken pÄ kontraktet, lÀgger funktionen invoke till annoteringen #[no_mangle].

Hur fÄr funktionen invoke parametrar för att utföra transaktionen?

Biblioteket ontio_std tillhandahÄller funktionen runtime::input() för att hÀmta parametrar för transaktionsutförande. Utvecklare kan anvÀnda ZeroCopySource för att deserialisera den mottagna byte-arrayen. Den första lÀsta byte-arrayen Àr namnet pÄ invoke-metoden, följt av metodens parametrar.

Hur returneras resultatet av kontraktsutförande?

Funktionen runtime::ret, som tillhandahÄlls av biblioteket ontio_std, returnerar resultatet av metodens utförande.

Den avslutade invoke-funktionen ser ut som följer:

Hur man skriver ett smart kontrakt med WebAssembly i Ontology-nÀtverket? Del 1: Rust

Serialisering och deserialisering av kontraktsdata

Under utvecklingen av kontrakt stöter utvecklare alltid pÄ problem med serialisering och deserialisering, specifikt hur man sparar struct-datatypen i databasen och hur man deserialiserar en byte-array som lÀsts frÄn databasen för att fÄ struct-datatypen.

Biblioteket ontio_std tillhandahÄller grÀnssnitt för dekodare och kodare för serialisering och deserialisering av data. FÀlten i struct-strukturen implementerar ocksÄ grÀnssnitt för dekodare och kodare sÄ att strukturen kan serialiseras och deserialiseras. Instanser av klassen Sink Àr nödvÀndiga nÀr olika datatyper serialiseras. En instans av klassen Sink har ett set-typ fÀlt buf som lagrar byte-typ data, och all serialiserad data lagras i buf.

För data med fast lÀngd (t.ex.: byte, u16, u32, u64 osv.) transformeras data direkt till en byte-array och sparas sedan i buf; för data med ofast lÀngd mÄste lÀngden först serialiseras och sedan Ddata (t.ex. osignerade heltal av okÀnd storlek, inklusive u16, u32 eller u64 osv.).

Deserialisering Ă€r motsatsen. För varje serialiseringsmetod finns en motsvarande deserialiseringsmetod. Deserialisering krĂ€ver anvĂ€ndning av instanser av klassen Source. Denna instans har tvĂ„ fĂ€lt buf och pos. Buf anvĂ€nds för att lagra de data som ska deserialiseras, och pos anvĂ€nds för att lagra den aktuella lĂ€spositionen. NĂ€r ett specifikt datatyp lĂ€ses, om lĂ€ngden Ă€r kĂ€nd, kan den lĂ€sas direkt; för data med okĂ€nd lĂ€ngd— lĂ€s först lĂ€ngden och sedan innehĂ„llet.

Åtkomst och uppdatering av data i kedjan

Ontology-wasm-cdt-rust — kapslar in driftsmetoden för att arbeta med data i kedjan, vilket Ă€r bekvĂ€mt för utvecklare att utföra operationer sĂ„som att lĂ€gga till, ta bort, Ă€ndra och begĂ€ra data i kedjan pĂ„ följande sĂ€tt:

  • database::get(key) — anvĂ€nds för att begĂ€ra data frĂ„n kedjan, och key begĂ€r implementeringen av grĂ€nssnittet AsRef;
  • database::put(key, value) — anvĂ€nds för att lagra data i nĂ€tverket. Key begĂ€r utförandet av grĂ€nssnittet AsRef, och value begĂ€r implementeringen av grĂ€nssnittet Encoder;
  • database::delete(key) — anvĂ€nds för att ta bort data frĂ„n kedjan, och key begĂ€r implementeringen av grĂ€nssnittet AsRef.

Kontraktstestning

NÀr kontraktsmetoder implementeras behöver vi tillgÄng till data i kedjan och vi behöver en motsvarande virtuell maskin för att exekvera kontraktets bytekod, sÄ det Àr vanligtvis nödvÀndigt att distribuera kontraktet i kedjan för testning. Men denna testmetod Àr problematisk. För att underlÀtta testningen av kontrakt erbjuder ontio_std-biblioteket en mocking-modul för testning. Denna modul simulerar data i kedjan, vilket gör det lÀttare för utvecklare att enhetstesta metoder i kontraktet. Specifika exempel kan hittas hÀr.

Kontraktsfelsökning

console::debug(msg) skriver ut debug-information under felsökning av kontraktet. Informationen msg kommer att registreras i nodens loggfil. En nödvÀndig förutsÀttning Àr att loggfilens nivÄ sÀtts till debug nÀr den lokala testnoden för Ontology körs.

runtime::notify(msg) skriver ut relevant debug-information under felsökning av kontraktet. Denna metod kommer att spara den inskickade informationen i kedjan och kan begÀras frÄn kedjan med metoden getSmartCodeEvent.

Artikeln översattes av Hashrate&Shares speciellt för OntologyRussia. klicka

Är du utvecklare? GĂ„ med i vĂ„rt tekniska samhĂ€lle pĂ„ Discord. Dessutom, kolla in Utvecklarcentrum pĂ„ vĂ„r webbplats, dĂ€r du kan hitta utvecklarverktyg, dokumentation och mycket mer.

Ontology

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster