Com escriure un contracte intel·ligent WebAssembly a la xarxa d'Ontology? Part 1: òxid

Com escriure un contracte intel·ligent WebAssembly a la xarxa d'Ontology? Part 1: òxid

La tecnologia Ontology Wasm redueix el cost de migrar els contractes intel·ligents dApp amb una lògica empresarial complexa a la cadena de blocs, enriquint així molt l'ecosistema dApp.

Ara Ontologia Wasm Admet simultàniament el desenvolupament de Rust i C++. El llenguatge Rust admet millor Wasm i el bytecode generat és més senzill, cosa que pot reduir encara més el cost de les trucades de contracte. Tan, com utilitzar Rust per desenvolupar un contracte a la xarxa d'Ontology?

Desenvolupament d'un contracte WASM amb Rust

Crear un contracte

Càrrega és una bona eina de creació de projectes i gestió de paquets per al desenvolupament de Rust, que ajuda els desenvolupadors a organitzar millor la interacció del codi i les biblioteques de tercers. Per crear un nou contracte d'Ontology Wasm, només cal que executeu l'ordre següent:

Com escriure un contracte intel·ligent WebAssembly a la xarxa d'Ontology? Part 1: òxid

L'estructura del projecte que genera:

Com escriure un contracte intel·ligent WebAssembly a la xarxa d'Ontology? Part 1: òxid

El fitxer Cargo.toml s'utilitza per configurar la informació bàsica del projecte i la informació de la biblioteca dependent. La secció [lib] del fitxer s'ha d'establir com a crate-type = ["cdylib"]. El fitxer lib.rs s'utilitza per escriure el codi lògic del contracte. A més, cal afegir paràmetres de dependència a la secció [dependències] del fitxer de configuració Cargo.toml:

Com escriure un contracte intel·ligent WebAssembly a la xarxa d'Ontology? Part 1: òxid

Amb aquesta dependència, els desenvolupadors poden cridar interfícies que interactuen amb la cadena de blocs d'Ontology i eines com ara el paràmetre de serialització.

Funció d'entrada de contracte

Cada programa té una funció d'entrada, com la funció principal que solem veure, però el contracte no té una funció principal. Quan es desenvolupa un contracte Wasm amb Rust, la funció d'invocació predeterminada s'utilitza com a funció d'entrada per utilitzar el contracte. El nom d'una funció a Rust no estarà clar en compilar el codi font de Rust en bytecode que pugui executar una màquina virtual. Per evitar que el compilador generi codi redundant i reduir la mida del contracte, la funció d'invocació afegeix l'anotació #[no_mangle].

Com obté la funció d'invocació els paràmetres per executar una transacció?

La biblioteca ontio_std proporciona una funció runtime::input() per obtenir els paràmetres per executar una transacció. Els desenvolupadors poden utilitzar ZeroCopySource per deserialitzar la matriu de bytes resultant. En què la primera matriu de bytes llegits és el nom del mètode d'invocació, seguit dels paràmetres del mètode.

Com es retorna el resultat de l'execució del contracte?

La funció runtime::ret proporcionada per la biblioteca ontio_std retorna el resultat de l'execució d'un mètode.

La funció d'invocació completada té aquest aspecte:

Com escriure un contracte intel·ligent WebAssembly a la xarxa d'Ontology? Part 1: òxid

Serialització i deserialització de dades del contracte

En el procés de desenvolupament de contractes, els desenvolupadors sempre tenen problemes amb la serialització i la deserialització, concretament amb com emmagatzemar un tipus de dades struct a la base de dades i com deserialitzar una matriu de bytes llegida de la base de dades per obtenir un tipus de dades struct.

La biblioteca ontio_std proporciona interfícies de descodificador i codificador per a la serialització i deserialització de dades. Els camps d'una estructura també implementen les interfícies de descodificador i codificador perquè l'estructura es pugui serialitzar i deserialitzar. Les instàncies de la classe Sink són necessàries quan es serialitzen diversos tipus de dades. Una instància de la classe Sink té un buf de camp de tipus set que emmagatzema les dades de tipus byte i totes les dades serialitzades s'emmagatzemen a buf.

Per a dades de longitud fixa (per exemple: byte, u16, u32, u64, etc.), les dades es converteixen directament en una matriu de bytes i després s'emmagatzemen a buf; per a dades de longitud no fixa, primer s'ha de serialitzar la longitud i després Ddata (per exemple, nombres enters sense signe de mida desconeguda, inclosos u16, u32 o u64, etc.).

La deserialització és exactament el contrari. Per a cada mètode de serialització, hi ha un mètode de deserialització corresponent. La deserialització requereix l'ús d'instàncies de la classe Source. Aquesta instància de classe té dos camps buf i pos. Buf s'utilitza per emmagatzemar les dades a deserialitzar i pos s'utilitza per emmagatzemar la posició de lectura actual. Quan es llegeix un tipus de dades concret, si en coneixeu la longitud, podeu llegir-lo directament, per a dades de longitud desconeguda; primer llegiu-ne la longitud i després llegiu-ne el contingut.

Accedir i actualitzar dades de la cadena

ontologia-wasm-cdt-rovell - va encapsular un mètode operatiu per treballar amb dades a la cadena, que és convenient perquè els desenvolupadors implementin operacions com ara afegir, suprimir, canviar i consultar dades a la cadena de la següent manera:

  • base de dades::get(clau) - s'utilitza per sol·licitar dades de la cadena i la clau sol·licita la implementació de la interfície AsRef;
  • base de dades::put(clau, valor) - S'utilitza per emmagatzemar dades a la xarxa. La clau demana la implementació de la interfície AsRef i el valor demana la implementació de la interfície Encoder;
  • base de dades::eliminar (clau) - s'utilitza per eliminar dades de la cadena i la clau sol·licita la implementació de la interfície AsRef.

Prova de contracte

Quan s'implementen els mètodes d'un contracte, necessitem accedir a les dades de la cadena i necessitem una màquina virtual adequada per executar el bytecode del contracte, per la qual cosa generalment és necessari desplegar el contracte a la cadena per a la prova. Però aquest mètode de prova és problemàtic. Per facilitar als desenvolupadors la prova de contractes, la biblioteca ontio_std ofereix un mòdul simulat per provar. Aquest mòdul proporciona una simulació de les dades del circuit, facilitant als desenvolupadors la prova d'unitat dels mètodes del contracte. Es poden trobar exemples concrets aquí.

Depuració de contractes

console::debug(msg) mostra informació de depuració mentre es depura un contracte. La informació del missatge s'afegirà al fitxer de registre del node. Un requisit previ és establir el nivell del fitxer de registre en mode de depuració quan s'executa el node de prova d'Ontology local.

runtime::notify(msg) mostra la informació de depuració adequada mentre s'està depurant el contracte. Aquest mètode emmagatzemarà la informació introduïda a la cadena i es pot consultar des de la cadena mitjançant el mètode getSmartCodeEvent.

L'article va ser traduït pels editors d'Hashrate&Shares especialment per a OntologyRussia. feu clic a

Ets desenvolupador? Uneix-te a la nostra comunitat tecnològica a Discòrdia. A més, fes-hi una ullada Centre de desenvolupadors al nostre lloc web, on podeu trobar eines per a desenvolupadors, documentació i molt més.

Ontologia

Font: www.habr.com

Afegeix comentari