Kif tikteb kuntratt intelliġenti tal-WebAssembly fuq in-netwerk tal-Ontoloġija? Parti 1: Sadid

Kif tikteb kuntratt intelliġenti tal-WebAssembly fuq in-netwerk tal-Ontoloġija? Parti 1: Sadid

Ontoloġija It-teknoloġija Wasm tnaqqas l-ispiża tal-migrazzjoni ta 'kuntratti intelliġenti dApp b'loġika kummerċjali kumplessa għall-blockchain, u b'hekk tarrikkixxi ħafna l-ekosistema dApp.

Issa Ontoloġija Wasm Fl-istess ħin jappoġġja kemm l-iżvilupp Rust kif ukoll C++. Il-lingwa Rust tappoġġja Wasm aħjar, u l-bytecode iġġenerat huwa aktar sempliċi, li jista 'jnaqqas aktar l-ispiża tas-sejħiet tal-kuntratt. Allura, kif tuża Rust biex tiżviluppa kuntratt fuq in-netwerk tal-Ontoloġija?

Żvilupp ta' Kuntratt WASM ma' Rust

Oħloq kuntratt

merkanzija hija għodda tajba ta 'ħolqien ta' proġett u ġestjoni ta 'pakketti għall-iżvilupp Rust, li tgħin lill-iżviluppaturi biex jorganizzaw aħjar l-interazzjoni tal-kodiċi u libreriji ta' partijiet terzi. Biex toħloq kuntratt ġdid tal-Ontology Wasm, sempliċement ħaddem il-kmand li ġej:

Kif tikteb kuntratt intelliġenti tal-WebAssembly fuq in-netwerk tal-Ontoloġija? Parti 1: Sadid

L-istruttura tal-proġett li tiġġenera:

Kif tikteb kuntratt intelliġenti tal-WebAssembly fuq in-netwerk tal-Ontoloġija? Parti 1: Sadid

Il-fajl Cargo.toml jintuża biex titwaqqaf informazzjoni bażika tal-proġett u informazzjoni tal-librerija dipendenti. Is-sezzjoni [lib] tal-fajl għandha tkun issettjata għal crate-type = ["cdylib"]. Il-fajl lib.rs jintuża biex jikteb il-kodiċi tal-loġika tal-kuntratt. Barra minn hekk, trid iżżid parametri ta' dipendenza mat-taqsima [dipendenzi] tal-fajl ta' konfigurazzjoni Cargo.toml:

Kif tikteb kuntratt intelliġenti tal-WebAssembly fuq in-netwerk tal-Ontoloġija? Parti 1: Sadid

B'din id-dipendenza, l-iżviluppaturi jistgħu jsejħu interfaces li jinteraġixxu mal-blockchain tal-Ontoloġija u għodod bħall-parametru ta 'serialization.

Funzjoni tad-dħul tal-kuntratt

Kull programm għandu funzjoni ta 'input, bħall-funzjoni ewlenija li normalment naraw, iżda l-kuntratt m'għandux funzjoni ewlenija. Meta kuntratt Wasm jiġi żviluppat bl-użu Rust, il-funzjoni ta 'invoke default tintuża bħala l-funzjoni ta' input biex tuża l-kuntratt. L-isem ta 'funzjoni f'Rut mhux ċar meta tikkompila l-kodiċi tas-sors ta' Rust f'bytecode li jista 'jiġi eżegwit minn magna virtwali. Biex tevita li l-kompilatur jiġġenera kodiċi żejda u jnaqqas id-daqs tal-kuntratt, il-funzjoni invoke żżid l-annotazzjoni #[no_mangle].

Kif il-funzjoni invoke tikseb parametri biex tesegwixxi tranżazzjoni?

Il-librerija ontio_std tipprovdi funzjoni runtime::input() biex tikseb il-parametri biex tesegwixxi tranżazzjoni. L-iżviluppaturi jistgħu jużaw ZeroCopySource biex deserialize l-firxa ta 'byte li tirriżulta. Li fiha l-ewwel firxa ta 'bytes jinqraw huwa l-isem tal-metodu invoke, segwit mill-parametri tal-metodu.

Kif jiġi rritornat ir-riżultat tal-eżekuzzjoni tal-kuntratt?

Il-funzjoni runtime::ret ipprovduta mil-librerija ontio_std tirritorna r-riżultat ta 'eżekuzzjoni ta' metodu.

Il-funzjoni invoke kompluta tidher bħal din:

Kif tikteb kuntratt intelliġenti tal-WebAssembly fuq in-netwerk tal-Ontoloġija? Parti 1: Sadid

Serializing u Deserializing Data Kuntratt

Fil-proċess tal-iżvilupp ta 'kuntratti, l-iżviluppaturi dejjem jiltaqgħu ma' problemi b'serialization u deserialization, speċifikament ma 'kif taħżen tip ta' data struct fid-database u kif deserialize firxa ta 'byte moqrija mid-database biex tikseb tip ta' data struct.

Il-librerija ontio_std tipprovdi interfaces ta 'decoder u encoder għas-serializzazzjoni u deserialization tad-dejta. L-oqsma ta 'strut jimplimentaw ukoll l-interfaces ta' decoder u encoder sabiex l-istruttura tkun tista 'tiġi serializzata u deserializzata. L-istanzi tal-klassi Sink huma meħtieġa meta diversi tipi ta' data jiġu serializzati. Istanza tal-klassi Sink għandha kamp tat-tip sett li jaħżen id-dejta tat-tip byte, u d-dejta kollha serjali tinħażen f'bu.

Għal data ta' tul fiss (eż.: byte, u16, u32, u64, eċċ.), id-data hija kkonvertita direttament għal firxa ta' byte u mbagħad maħżuna f'bu; għal data ta' tul mhux fiss, it-tul irid jiġi serjali l-ewwel, imbagħad Ddata (per eżempju, interi mhux iffirmati ta' daqs mhux magħruf, inklużi u16, u32, jew u64, eċċ.).

Id-deserialization hija eżattament l-oppost. Għal kull metodu ta 'serialization, hemm metodu ta' deserialization korrispondenti. Deserialization teħtieġ l-użu ta 'istanzi tal-klassi Sors. Din l-istanza tal-klassi għandha żewġ oqsma buf u pos. Buf jintuża biex jaħżen id-dejta li trid tiġi deserialized u pos jintuża biex jaħżen il-pożizzjoni attwali tal-qari. Meta tkun qed tinqara tip partikolari ta 'data, jekk taf it-tul tagħha, tista' taqraha direttament, għal data ta 'tul mhux magħruf — aqra t-tul l-ewwel, imbagħad aqra l-kontenut.

Aċċess u aġġorna d-dejta fil-katina

ontoloġija-wasm-cdt-sadid - inkapsulat metodu operazzjonali biex taħdem mad-dejta fil-katina, li huwa konvenjenti għall-iżviluppaturi biex jimplimentaw operazzjonijiet bħaż-żieda, it-tħassir, il-bidla u l-mistoqsija tad-dejta fil-katina kif ġej:

  • database::get(key) - tintuża biex titlob dejta mill-katina, u ċ-ċavetta titlob l-implimentazzjoni tal-interface AsRef;
  • database::put(ċavetta, valur) - użat biex jaħżen data fuq in-netwerk. Key jitlob l-implimentazzjoni tal-interface AsRef, u l-valur jitlob l-implimentazzjoni tal-interface Encoder;
  • database:: delete(key) - tintuża biex tneħħi d-dejta mill-katina, u ċ-ċavetta titlob l-implimentazzjoni tal-interface AsRef.

Ittestjar tal-kuntratt

Meta l-metodi ta 'kuntratt jiġu implimentati, għandna bżonn aċċess għad-dejta fuq il-katina u neħtieġu magna virtwali xierqa biex tesegwixxi l-bytecode tal-kuntratt, għalhekk huwa ġeneralment meħtieġ li l-kuntratt jiġi skjerat fuq il-katina għall-ittestjar. Iżda dan il-metodu ta 'ttestjar huwa problematiku. Biex tagħmilha aktar faċli għall-iżviluppaturi biex jittestjaw il-kuntratti, il-librerija ontio_std tipprovdi modulu finta għall-ittestjar. Dan il-modulu jipprovdi simulazzjoni tad-dejta fiċ-ċirkwit, li jagħmilha aktar faċli għall-iżviluppaturi biex jittestjaw l-unità tal-metodi fil-kuntratt. Jistgħu jinstabu eżempji speċifiċi hawn.

Debugging tal-Kuntratti

console::debug(msg) juri informazzjoni dwar id-debug waqt id-debug ta' kuntratt. L-informazzjoni msg tiġi miżjuda mal-fajl log tan-node. Prerekwiżit huwa li tissettja l-livell tal-fajl log għall-modalità debug meta n-nodu tat-test tal-Ontoloġija lokali jkun qed jaħdem.

runtime::notify(msg) joħroġ l-informazzjoni xierqa tad-debug waqt li l-kuntratt ikun qed jiġi debugged. Dan il-metodu se jaħżen l-informazzjoni mdaħħla fil-katina u jista’ jiġi mistoqsi mill-katina bl-użu tal-metodu getSmartCodeEvent.

L-artiklu ġie tradott mill-edituri ta 'Hashrate&Shares speċjalment għal OntologyRussia. biki

Inti żviluppatur? Ingħaqad fil-komunità tat-teknoloġija tagħna fuq Diskord. Ukoll, agħti ħarsa lejn Ċentru għall-Iżviluppaturi fuq il-websajt tagħna, fejn tista' ssib għodod għall-iżviluppaturi, dokumentazzjoni, u aktar.

Ontoloġija

Sors: www.habr.com

Żid kumment