Kiel skribi inteligentan kontrakton WebAssembly en la Ontology-reto? Parto 1: Rusto

Kiel skribi inteligentan kontrakton WebAssembly en la Ontology-reto? Parto 1: Rusto

Ontology Wasm-teknologio reduktas la koston de migrado de dApp inteligentaj kontraktoj kun kompleksa komerca logiko al la blokĉeno, tiel multe riĉigante la dApp-ekosistemon.

В настоящее время Ontologio Wasm Samtempe subtenas kaj Rust kaj C++-disvolviĝon. La Rust-lingvo pli bone subtenas Wasm, kaj la generita bajtkodo estas pli simpla, kio povas plu redukti la koston de kontraktaj vokoj. Do, kiel uzi Rust por disvolvi kontrakton sur la Ontology-reto?

Evoluigante WASM-Kontrakton kun Rust

Krei kontrakton

kargo estas bona projekt-kreado kaj paka administrado por Rust-disvolviĝo, kiu helpas programistojn pli bone organizi la interagadon de kodo kaj triaj bibliotekoj. Por krei novan Ontology Wasm-kontrakton, simple rulu la sekvan komandon:

Kiel skribi inteligentan kontrakton WebAssembly en la Ontology-reto? Parto 1: Rusto

La projektstrukturo kiun ĝi generas:

Kiel skribi inteligentan kontrakton WebAssembly en la Ontology-reto? Parto 1: Rusto

La dosiero Cargo.toml estas uzata por agordi bazajn projektajn informojn kaj dependajn bibliotekajn informojn. La sekcio [lib] de la dosiero devas esti agordita al crate-type = ["cdylib"]. La lib.rs dosiero estas uzata por skribi la kontraktan logikan kodon. Krome, vi devas aldoni dependecajn parametrojn al la sekcio [dependecoj] de la agorda dosiero Cargo.toml:

Kiel skribi inteligentan kontrakton WebAssembly en la Ontology-reto? Parto 1: Rusto

Kun ĉi tiu dependeco, programistoj povas voki interfacojn, kiuj interagas kun la Ontologio-blokĉeno kaj iloj kiel la seriiga parametro.

Kontrakta enira funkcio

Ĉiu programo havas enigfunkcion, kiel la ĉefa funkcio, kiun ni kutime vidas, sed la kontrakto ne havas ĉefan funkcion. Kiam Wasm-kontrakto estas evoluigita uzante Rust, la defaŭlta alvoka funkcio estas uzata kiel la eniga funkcio por uzi la kontrakton. La nomo de funkcio en Rust estos neklara dum kompilado de Rust fontkodo en bajtokodon kiu povas esti efektivigita per virtuala maŝino. Por malhelpi la kompililon generi redundan kodon kaj redukti la grandecon de la kontrakto, la invoke funkcio aldonas la #[no_mangle] komentarion.

Kiel la alvoka funkcio ricevas parametrojn por efektivigi transakcion?

La biblioteko ontio_std disponigas funkcion runtime::input() por akiri la parametrojn por efektivigi transakcion. Programistoj povas uzi ZeroCopySource por deserialigi la rezultan bajtan tabelon. En kiu la unua tabelo de bajtoj legitaj estas la nomo de la alvoka metodo, sekvata de la metodoparametroj.

Kiel estas redonita la rezulto de la kontrakto-ekzekuto?

La funkcio runtime::ret provizita de la biblioteko ontio_std resendas la rezulton de metodo ekzekuto.

La finita alvoka funkcio aspektas jene:

Kiel skribi inteligentan kontrakton WebAssembly en la Ontology-reto? Parto 1: Rusto

Seriigante kaj Seneriigante Kontraktajn Datumojn

En la procezo de evoluigado de kontraktoj, programistoj ĉiam renkontas problemojn kun seriigo kaj deseriigo, specife kun kiel stoki struct-datupon en la datumbazo kaj kiel deseriigi bajtan tabelon legitan de la datumbazo por akiri struct-datupon.

La ontio_std-biblioteko disponigas malĉifrilon kaj kodigilon interfacojn por datumseriigo kaj deseriigo. La kampoj de struktur ankaŭ efektivigas la malĉifrilon kaj kodigilinterfacojn tiel ke la strukturo povas esti seriigita kaj deserialigita. Okazoj de la Sink-klaso estas postulataj kiam diversaj datumtipoj estas seriigitaj. Ekzemplo de la Sink-klaso havas aro-specan kampan bufon kiu stokas la bajtajn tipdatenojn, kaj ĉiuj seriigitaj datenoj estas stokitaj en buf.

Por fikslongaj datumoj (ekz.: bajto, u16, u32, u64, ktp.), la datumoj estas rekte konvertitaj al bajta tabelo kaj tiam konservitaj en buf; por datenoj de ne-fiksa longo, longo devas esti seriigita unue, tiam Ddata (ekzemple, sensignaj entjeroj de nekonata grandeco, inkluzive de u16, u32, aŭ u64, ktp.).

Deseriigo estas ĝuste la malo. Por ĉiu seriigmetodo, ekzistas ekvivalenta deseriigmetodo. Seneriigo postulas la uzon de kazoj de la Font-klaso. Ĉi tiu klaskazaĵo havas du kampojn buf kaj pos. Buf estas uzata por stoki la datumojn por esti deserialigitaj kaj pos estas uzata por stoki la nunan legan pozicion. Kiam oni legas apartan tipon de datumoj, se oni konas ĝian longon, oni povas legi ĝin rekte, por datumoj de nekonata longo—legu unue la longon, poste legu la enhavon.

Aliri kaj ĝisdatigi datumojn en la ĉeno

ontologio-wasm-cdt-rusto - enkapsuligis funkcian metodon por labori kun datumoj en la ĉeno, kiu estas oportuna por programistoj efektivigi operaciojn kiel aldoni, forigi, ŝanĝi kaj pridemandi datumojn en la ĉeno jene:

  • datumbazo::get(ŝlosilo) - estas uzata por peti datumojn de la ĉeno, kaj ŝlosilo postulas la efektivigon de la interfaco AsRef;
  • datumbazo::put(ŝlosilo, valoro) - uzata por konservi datumojn en la reto. Ŝlosilo petas la efektivigon de la AsRef-interfaco, kaj valoro petas la efektivigon de la Encoder-interfaco;
  • datumbazo::delete(ŝlosilo) - estas uzata por forigi datumojn de la ĉeno, kaj ŝlosilo postulas la efektivigon de la interfaco AsRef.

Kontrakta testado

Kiam la metodoj de kontrakto estas efektivigitaj, ni bezonas aliron al la datumoj sur la ĉeno kaj ni bezonas taŭgan virtualan maŝinon por ekzekuti la bajtokodon de la kontrakto, do ĝenerale necesas deploji la kontrakton sur la ĉeno por testado. Sed ĉi tiu metodo de testado estas problema. Por faciligi al programistoj testi kontraktojn, la biblioteko ontio_std disponigas imitan modulon por testado. Ĉi tiu modulo provizas simuladon de la datumoj en la cirkvito, faciligante al programistoj unutesti la metodojn en la kontrakto. Specifaj ekzemploj troveblas tie.

Kontrakta Sencimigado

console::debug(msg) montras sencimigajn informojn dum elpurigado de kontrakto. La msg-informo estos aldonita al la noda protokolo-dosiero. Antaŭkondiĉo estas agordi la protokoldosiernivelon al sencimiga reĝimo kiam la loka Ontologio-testnodo funkcias.

runtime::notify(msg) eligas la taŭgajn sencimigajn informojn dum la kontrakto estas sencimigita. Ĉi tiu metodo stokos la informojn enigitajn en la ĉenon kaj povas esti demandita de la ĉeno per la getSmartCodeEvent-metodo.

La artikolon tradukis la redaktoroj de Hashrate&Shares precipe por OntologyRussia. plori

Ĉu vi estas programisto? Aliĝu al nia teknika komunumo ĉe Malkonkordo. Ankaŭ, rigardu Centro de Programistoj en nia retejo, kie vi povas trovi programistajn ilojn, dokumentadon kaj pli.

ontologio

fonto: www.habr.com

Aldoni komenton