
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 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
À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:
![]()
Projektstrukturen som den genererar:

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:

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:

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 .
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.
Ăr du utvecklare? GĂ„ med i vĂ„rt tekniska samhĂ€lle pĂ„ . Dessutom, kolla in pĂ„ vĂ„r webbplats, dĂ€r du kan hitta utvecklarverktyg, dokumentation och mycket mer.
Ontology
- /
- Telegram /
- /
KĂ€lla: habr.com
