Hoe skriuw ik in WebAssembly smart kontrakt op it Ontology netwurk? Diel 1: Rust

Hoe skriuw ik in WebAssembly smart kontrakt op it Ontology netwurk? Diel 1: Rust

Ontology Wasm technology ferleget de kosten fan it oerdragen fan dApp smart kontrakten mei komplekse saaklike logika nei de blockchain, dêrmei signifikant ferrykjen it dApp ekosysteem.

В настоящее время Ontology Wasm stipet tagelyk ûntwikkeling yn sawol Rust as C ++. De Rust-taal stipet Wasm better, en de oanmakke bytekoade is ienfâldiger, wat de kosten fan kontraktoproppen fierder kin ferminderje. Sa, hoe Rust te brûken om in kontrakt te ûntwikkeljen op it Ontology-netwurk?

Untwikkeljen fan in WASM-kontrakt mei Rust

It meitsjen fan in kontrakt

Lading is in goed ark foar it meitsjen fan projekten en it behearen fan pakketten by it ûntwikkeljen fan programma's yn Rust, wat helpt ûntwikkelders better organisearje de ynteraksje fan koade en tredden bibleteken. Om in nij Ontology Wasm-kontrakt te meitsjen, útfiere gewoan it folgjende kommando:

Hoe skriuw ik in WebAssembly smart kontrakt op it Ontology netwurk? Diel 1: Rust

De projektstruktuer dy't it genereart:

Hoe skriuw ik in WebAssembly smart kontrakt op it Ontology netwurk? Diel 1: Rust

It bestân Cargo.toml wurdt brûkt om basisprojektynformaasje en ôfhinklike biblioteekynformaasje te konfigurearjen. De seksje [lib] yn it bestân moat ynsteld wurde op krattype = ["cdylib"]. It lib.rs-bestân wurdt brûkt om de kontraktlogika te kodearjen. Derneist moatte jo ôfhinklikensparameters tafoegje oan 'e seksje [ôfhinklikens] fan it konfiguraasjetriem Cargo.toml:

Hoe skriuw ik in WebAssembly smart kontrakt op it Ontology netwurk? Diel 1: Rust

Mei dizze ôfhinklikens kinne ûntwikkelders ynterfaces neame dy't ynteraksje mei de Ontology blockchain en ark lykas de serialisaasjeparameter.

Kontrakt yngong funksje

Elk programma hat in ynfierfunksje, lykas de haadfunksje dy't wy normaal sjogge, mar in kontrakt hat gjin haadfunksje. By it ûntwikkeljen fan in Wasm-kontrakt mei Rust, wurdt de opropfunksje standert brûkt as de ynfierfunksje foar it brûken fan it kontrakt. De namme fan in funksje yn Rust sil ûndúdlik wêze by it kompilearjen fan de Rust-boarnekoade yn bytekoade dy't kin wurde útfierd troch in firtuele masine. Om foar te kommen dat de kompilator oerstallige koade genereart en de grutte fan it kontrakt te ferminderjen, foeget de opropfunksje de #[no_mangle] annotaasje ta.

Hoe ûntfangt de opropfunksje parameters om in transaksje út te fieren?

De bibleteek ontio_std jout de runtime :: input () funksje om de parameters te ûntfangen om in transaksje út te fieren. Untwikkelders kinne ZeroCopySource brûke om de resultearjende byte-array te deserialisearjen. wêryn de earste byte array lêzen is de namme fan de oprop metoade, folge troch de metoade parameters.

Hoe wurdt it resultaat fan kontraktútfiering weromjûn?

De runtime :: ret-funksje, dy't wurdt levere troch de ontio_std-bibleteek, jout it resultaat fan 'e metoade-útfiering werom.

De foltôge opropfunksje sjocht der sa út:

Hoe skriuw ik in WebAssembly smart kontrakt op it Ontology netwurk? Diel 1: Rust

Serialisaasje en deserialisaasje fan kontraktgegevens

Yn it proses fan it ûntwikkeljen fan kontrakten, ûntwikkelders wurde altyd konfrontearre mei problemen fan serialization en deserialization, spesifyk hoe te bewarjen in struct gegevens type yn de databank en hoe te deserialize in byte array lêzen út de databank te krijen in struct gegevens type.

De ontio_std-bibleteek biedt decoder- en encoder-ynterfaces foar serialisearjen en deserialisearjen fan gegevens. De fjilden fan in struktuer ymplementearje ek decoder- en encoder-ynterfaces sadat de struktuer kin wurde serialisearre en deserialisearre. Ynstânsjes fan 'e Sink-klasse binne nedich as ferskate soarten gegevens wurde serialisearre. In eksimplaar fan de klasse Sink hat in set-type fjild buf dy't bewarret byte type gegevens, en alle serialized gegevens wurdt opslein yn buf.

Foar gegevens mei fêste lingte (bgl.: byte, u16, u32, u64, ensfh.), De gegevens wurde direkt omset yn in byte-array en dan opslein yn buf; foar net-fêste lingte gegevens, Jo moatte earst serialize de lingte en dan de Ddata (lykas net ûndertekene hiele getallen fan ûnbekende grutte, ynklusyf u16, u32 of u64, ensfh).

Deserialisaasje is krekt it tsjinoerstelde. Foar eltse serialization metoade is der in oerienkommende deserialization metoade. Deserialisaasje fereasket it gebrûk fan eksimplaren fan 'e Source-klasse. Dizze klasse eksimplaar hat twa fjilden buf en pos. Buf wurdt brûkt om de gegevens op te slaan dy't sille wurde deserialisearre en pos wurdt brûkt om de hjoeddeistige lêsposysje op te slaan. As in spesifyk soart gegevens wurdt lêzen, as jo de lingte kenne, kinne jo it direkt lêze, foar gegevens fan ûnbekende lingte, lês earst de lingte en lês dan de ynhâld.

Tagong ta en bywurkje gegevens yn 'e keten

Ontology-wasm-cdt-rust - omfettet in operasjonele metoade foar it wurkjen mei gegevens oer in ketting, wat handich is foar ûntwikkelders om operaasjes te ymplementearjen lykas tafoegjen, wiskjen, feroarjen en opfreegje fan gegevens oer in keten as folget:

  • databank :: get (kaai) - brûkt om gegevens oan te freegjen fan 'e keten, en kaai freget in ymplemintaasje fan' e AsRef-ynterface;
  • database ::put(kaai, wearde) - brûkt om gegevens op it netwurk op te slaan. Key fersiken ymplemintaasje fan de AsRef ynterface, en wearde fersiken ymplemintaasje fan de Encoder ynterface;
  • database :: wiskje (kaai) - wurdt brûkt om te ferwiderjen gegevens út 'e keatling, en kaai freget in ymplemintaasje fan de AsRef ynterface.

Kontrakt testen

By it útfieren fan kontraktmetoaden hawwe wy tagong ta gegevens oer de keten nedich en wy hawwe de korrespondearjende firtuele masine nedich om de kontraktbytekoade út te fieren, dus it is typysk nedich om it kontrakt yn te setten nei de keten foar testen. Mar dizze testmetoade is problematysk. Om kontrakttesten makliker te meitsjen foar ûntwikkelders, leveret de ontio_std-bibleteek in mock-testmodule. Dizze module soarget foar simulaasje fan gegevens yn in keatling, wêrtroch it makliker is foar ûntwikkelders om metoaden te testen yn in kontrakt. Spesifike foarbylden kinne fûn wurde hjir.

Debuggen fan it kontrakt

console :: debug (msg) printe debug ynformaasje wylst debuggen in kontrakt. De msg-ynformaasje sil ynfierd wurde yn it logbestân fan 'e knooppunt. In betingst is om it logtriemnivo yn te stellen yn debugmodus as de lokale Ontology-testknooppunt rint.

runtime :: notify (msg) printet passende debuggen ynformaasje wylst it kontrakt wurdt debuggen. Dizze metoade sil de ynfierde ynformaasje opslaan yn 'e ketting en kin wurde opfrege fan' e ketting mei de getSmartCodeEvent-metoade.

It artikel waard oerset troch de redaksje fan Hashrate&Shares spesjaal foar OntologyRussia. gûle

Binne jo in ûntwikkelder? Doch mei oan ús techmienskip by Untwerp. Sjoch ek ris op Developer Center op ús webside, wêr't jo ûntwikkeldersark, dokumintaasje en mear kinne fine.

Ontology

Boarne: www.habr.com

Add a comment