Hoe om 'n WebAssembly-slimkontrak op die Ontologie-netwerk te skryf? Deel 1: Roes

Hoe om 'n WebAssembly-slimkontrak op die Ontologie-netwerk te skryf? Deel 1: Roes

Ontologie Wasm-tegnologie verminder die koste om dApp-slimkontrakte met komplekse besigheidslogika na die blokketting te migreer, waardeur die dApp-ekosisteem grootliks verryk word.

Nou Ontologie Wasm Ondersteun terselfdertyd beide Rust- en C++-ontwikkeling. Die Rust-taal ondersteun Wasm beter, en die gegenereerde greepkode is eenvoudiger, wat die koste van kontrakoproepe verder kan verminder. Dus, hoe om Rust te gebruik om 'n kontrak op die Ontologie-netwerk te ontwikkel?

Ontwikkel 'n WASM-kontrak met Rust

Skep 'n kontrak

Cargo is 'n goeie projekskepping en pakketbestuurhulpmiddel vir Rust-ontwikkeling, wat ontwikkelaars help om die interaksie van kode en derdeparty-biblioteke beter te organiseer. Om 'n nuwe Ontology Wasm-kontrak te skep, voer eenvoudig die volgende opdrag uit:

Hoe om 'n WebAssembly-slimkontrak op die Ontologie-netwerk te skryf? Deel 1: Roes

Die projekstruktuur wat dit genereer:

Hoe om 'n WebAssembly-slimkontrak op die Ontologie-netwerk te skryf? Deel 1: Roes

Die Cargo.toml-lêer word gebruik om basiese projekinligting en afhanklike biblioteekinligting op te stel. Die [lib]-afdeling van die lêer moet gestel word op krat-tipe = ["cdylib"]. Die lib.rs-lêer word gebruik om die kontraklogika-kode te skryf. Daarbenewens moet jy afhanklikheidsparameters by die [afhanklikhede]-afdeling van die Cargo.toml-konfigurasielêer voeg:

Hoe om 'n WebAssembly-slimkontrak op die Ontologie-netwerk te skryf? Deel 1: Roes

Met hierdie afhanklikheid kan ontwikkelaars koppelvlakke noem wat interaksie het met die Ontologie-blokketting en gereedskap soos die serialiseringsparameter.

Kontrakinskrywingsfunksie

Elke program het 'n invoerfunksie, soos die hooffunksie wat ons gewoonlik sien, maar die kontrak het nie 'n hooffunksie nie. Wanneer 'n Wasm-kontrak met Rust ontwikkel word, word die verstek-oproepfunksie gebruik as die invoerfunksie om die kontrak te gebruik. Die naam van 'n funksie in Rust sal onduidelik wees wanneer Rust-bronkode saamgestel word in greepkode wat deur 'n virtuele masjien uitgevoer kan word. Om te verhoed dat die samesteller oortollige kode genereer en die grootte van die kontrak verminder, voeg die invoke-funksie die #[no_mangle]-aantekening by.

Hoe kry die invoke-funksie parameters om 'n transaksie uit te voer?

Die ontio_std-biblioteek verskaf 'n runtime::input()-funksie om die parameters te kry om 'n transaksie uit te voer. Ontwikkelaars kan ZeroCopySource gebruik om die resulterende byte-skikking te deserialiseer. Waarin die eerste reeks grepe gelees is die naam van die oproepmetode is, gevolg deur die metodeparameters.

Hoe word die resultaat van die kontrakuitvoering teruggegee?

Die runtime::ret-funksie wat deur die ontio_std-biblioteek verskaf word, gee die resultaat van 'n metode-uitvoering terug.

Die voltooide oproepfunksie lyk soos volg:

Hoe om 'n WebAssembly-slimkontrak op die Ontologie-netwerk te skryf? Deel 1: Roes

Serialisering en deserialisering van kontrakdata

In die proses om kontrakte te ontwikkel, ondervind ontwikkelaars altyd probleme met serialisering en deserialisering, spesifiek met hoe om 'n struktuurdatatipe in die databasis te stoor en hoe om 'n greepskikking wat vanaf die databasis gelees is, te deserialiseer om 'n struktuurdatatipe te kry.

Die ontio_std-biblioteek bied dekodeerder- en enkodeerderkoppelvlakke vir data-serialisering en deserialisering. Die velde van 'n struktuur implementeer ook die dekodeerder en enkodeerder koppelvlakke sodat die struktuur geserialiseer en gedeserialiseer kan word. Gevalle van die Sink-klas word vereis wanneer verskillende datatipes geserialiseer word. 'n Geval van die Sink-klas het 'n stel-tipe veld-buf wat die greeptipe-data stoor, en alle geserialiseerde data word in buf gestoor.

Vir vaste lengte data (bv.: greep, u16, u32, u64, ens.), word die data direk na 'n grepe-skikking omgeskakel en dan in buf gestoor; vir data van nie-vaste lengte, moet lengte eers geserialiseer word, dan Ddata (byvoorbeeld, ongetekende heelgetalle van onbekende grootte, insluitend u16, u32, of u64, ens.).

Deserialisering is presies die teenoorgestelde. Vir elke serialiseringsmetode is daar 'n ooreenstemmende deserialiseringsmetode. Deserialisering vereis die gebruik van gevalle van die Bron-klas. Hierdie klasinstansie het twee velde buf en pos. Buf word gebruik om die data te stoor wat gedeserialiseer moet word en pos word gebruik om die huidige leesposisie te stoor. Wanneer 'n spesifieke tipe data gelees word, as jy die lengte daarvan ken, kan jy dit direk lees, vir data van onbekende lengte—lees eers die lengte, lees dan die inhoud.

Toegang tot en werk data in die ketting op

ontologie-wasm-cdt-roes - 'n operasionele metode om met data in die ketting te werk, ingekapsuleer, wat gerieflik is vir ontwikkelaars om bedrywighede soos byvoeging, verwydering, verandering en navrae van data in die ketting te implementeer soos volg:

  • databasis :: kry (sleutel) - word gebruik om data van die ketting aan te vra, en sleutelversoeke om die implementering van die AsRef-koppelvlak;
  • databasis :: put (sleutel, waarde) - gebruik om data op die netwerk te stoor. Sleutel versoek die implementering van die AsRef-koppelvlak, en waarde versoek die implementering van die Encoder-koppelvlak;
  • databasis :: delete (sleutel) - word gebruik om data uit die ketting te verwyder, en sleutel versoek die implementering van die AsRef-koppelvlak.

Kontraktoetsing

Wanneer die metodes van 'n kontrak geïmplementeer word, het ons toegang tot die data op die ketting nodig en ons benodig 'n toepaslike virtuele masjien om die greepkode van die kontrak uit te voer, dus is dit oor die algemeen nodig om die kontrak op die ketting te ontplooi vir toetsing. Maar hierdie metode van toetsing is problematies. Om dit vir ontwikkelaars makliker te maak om kontrakte te toets, verskaf die ontio_std-biblioteek 'n skynmodule vir toetsing. Hierdie module bied 'n simulasie van die data in die stroombaan, wat dit makliker maak vir ontwikkelaars om die metodes in die kontrak te toets. Spesifieke voorbeelde kan gevind word hier.

Kontrakontfouting

console::debug(msg) vertoon ontfoutinligting terwyl 'n kontrak ontfout word. Die boodskap-inligting sal by die nodus-loglêer gevoeg word. 'n Voorvereiste is om die loglêervlak na ontfoutmodus te stel wanneer die plaaslike Ontologie-toetsnodus loop.

runtime::notify(msg) voer die toepaslike ontfoutinligting uit terwyl die kontrak ontfout word. Hierdie metode sal die inligting wat in die ketting ingevoer is, stoor en kan van die ketting navraag gedoen word deur die getSmartCodeEvent-metode te gebruik.

Die artikel is veral vir OntologyRussia deur die redakteurs van Hashrate&Shares vertaal. клик

Is jy 'n ontwikkelaar? Sluit aan by ons tegnologie-gemeenskap by Onenigheid. Kyk ook na Ontwikkelaarsentrum op ons webwerf, waar jy ontwikkelaarnutsgoed, dokumentasie en meer kan vind.

Ontologie

Bron: will.com

Voeg 'n opmerking