Cumu scrive un cuntrattu intelligente WebAssembly nantu à a reta di Ontology? Parte 1: Rust

Cumu scrive un cuntrattu intelligente WebAssembly nantu à a reta di Ontology? Parte 1: Rust

A tecnulugia di Ontology Wasm riduce u costu di migrazione di cuntratti intelligenti dApp cù una logica cummerciale cumplessa à a blockchain, arricchisce cusì assai l'ecosistema dApp.

В настоящее время Ontologia Wasm Supporta simultaneamente u sviluppu Rust è C++. A lingua Rust supporta Wasm megliu, è u bytecode generatu hè più simplice, chì pò ancu riduce u costu di e chjama di u cuntrattu. Allora, cumu aduprà Rust per sviluppà un cuntrattu nantu à a reta di Ontology?

Sviluppà un cuntrattu WASM cù Rust

Crea un cuntrattu

Cargo hè un bonu strumentu di creazione di prughjettu è gestione di pacchetti per u sviluppu di Rust, chì aiuta i sviluppatori à urganizà megliu l'interazzione di codice è biblioteche di terzu. Per creà un novu cuntrattu Ontology Wasm, basta à eseguisce u cumandimu seguente:

Cumu scrive un cuntrattu intelligente WebAssembly nantu à a reta di Ontology? Parte 1: Rust

A struttura di u prughjettu chì genera:

Cumu scrive un cuntrattu intelligente WebAssembly nantu à a reta di Ontology? Parte 1: Rust

U schedariu Cargo.toml hè utilizatu per stallà l'infurmazioni basi di u prughjettu è l'infurmazioni di a biblioteca dipendente. A sezione [lib] di u schedariu deve esse stabilitu à crate-type = ["cdylib"]. U schedariu lib.rs hè utilizatu per scrive u codice logicu di u cuntrattu. Inoltre, avete bisognu di aghjunghje parametri di dependenza à a sezione [dipendenze] di u schedariu di cunfigurazione Cargo.toml:

Cumu scrive un cuntrattu intelligente WebAssembly nantu à a reta di Ontology? Parte 1: Rust

Cù sta dependenza, i sviluppatori ponu chjamà interfacce chì interagiscenu cù l'Ontology blockchain è arnesi cum'è u paràmetru di serializazione.

Funzione di entrata di u cuntrattu

Ogni prugramma hà una funzione di input, cum'è a funzione principale chì generalmente vedemu, ma u cuntrattu ùn hà micca una funzione principale. Quandu un cuntrattu Wasm hè sviluppatu cù Rust, a funzione di invocazione predeterminata hè usata cum'è a funzione di input per utilizà u cuntrattu. U nome di una funzione in Rust ùn serà micca chjaru quandu compile u codice fonte Rust in bytecode chì pò esse eseguitu da una macchina virtuale. Per impediscenu à u compilatore di generà codice redundante è riduce a dimensione di u cuntrattu, a funzione invoke aghjunghje l'annotazione #[no_mangle].

Cumu a funzione d'invocazione uttene parametri per eseguisce una transazzione?

A libreria ontio_std furnisce una funzione runtime::input() per ottene i paràmetri per eseguisce una transazzione. I sviluppatori ponu aduprà ZeroCopySource per deserializà a matrice di byte resultanti. In quale u primu array di bytes leghje hè u nome di u metudu di invucazione, seguitu da i paràmetri di u metudu.

Cumu hè tornatu u risultatu di l'esekzione di u cuntrattu?

A funzione runtime::ret furnita da a libreria ontio_std torna u risultatu di un metudu esecutivu.

A funzione di invocazione cumpleta hè cusì:

Cumu scrive un cuntrattu intelligente WebAssembly nantu à a reta di Ontology? Parte 1: Rust

Serializing and Deserializing Contract Data

In u prucessu di sviluppu di cuntratti, i sviluppatori sempre incontranu prublemi cù a serializazione è a deserializazione, in particulare cumu per almacenà un tipu di dati struct in a basa di dati è cumu per deserializà un array di byte lettu da a basa di dati per uttene un tipu di dati struct.

A libreria ontio_std furnisce interfacce di decodificatore è codificatore per a serializazione è a deserializazione di dati. I campi di una struttura implementanu ancu l'interfacce di decodificatore è codificatore per chì a struttura pò esse serializata è deserializzata. L'istanze di a classa Sink sò richieste quandu parechji tipi di dati sò serializzati. Un esempiu di a classa Sink hà un buf di campu set-type chì guarda i dati di tipu di byte, è tutti i dati seriali sò guardati in buf.

Per i dati di lunghezza fissa (p.e.: byte, u16, u32, u64, etc.), i dati sò direttamente cunvertiti in un array di byte è poi guardati in buf; per i dati di lunghezza non fissa, a lunghezza deve esse serializzata prima, dopu Ddata (per esempiu, interi senza signu di taglia scunnisciuta, cumpresu u16, u32, o u64, etc.).

A deserializazione hè esattamente u cuntrariu. Per ogni metudu di serializazione, ci hè un metudu di deserializazione currispundente. A deserializazione richiede l'usu di istanze di a classa Source. Questa istanza di classa hà dui campi buf è pos. Buf hè utilizatu per almacenà e dati per esse deserializatu è pos hè utilizatu per almacenà a pusizione di lettura attuale. Quandu un tipu particulari di dati hè esse lettu, se sapete a so lunghezza, pudete leghje direttamente, per dati di lunghezza scunnisciuta - leghje a lunghezza prima, dopu leghje u cuntenutu.

Accessu è aghjurnà e dati in a catena

ontologia-wasm-cdt-rust - incapsulatu un metudu operativu per travaglià cù e dati in a catena, chì hè cunvenutu per i sviluppatori per implementà operazioni cum'è aghjunghje, sguassà, cambià è interrogà dati in a catena cum'è seguita:

  • database::get(key) - hè utilizatu per dumandà dati da a catena, è chjave dumanda l'implementazione di l'interfaccia AsRef;
  • basa di dati::put (chjave, valore) - utilizatu per almacenà dati nantu à a reta. Chjave dumanda l'implementazione di l'interfaccia AsRef, è u valore dumanda l'implementazione di l'interfaccia Encoder;
  • basa di dati::cancellate (chiave) - hè utilizatu per sguassà e dati da a catena, è a chjave dumanda l'implementazione di l'interfaccia AsRef.

Test di u cuntrattu

Quandu i metudi di un cuntrattu sò implementati, avemu bisognu di l'accessu à e dati nantu à a catena è avemu bisognu di una macchina virtuale appruvata per eseguisce u bytecode di u cuntrattu, per quessa, hè in generale necessariu di implementà u cuntrattu nantu à a catena per a prova. Ma stu metudu di teste hè problematicu. Per fà più faciule per i sviluppatori di pruvà i cuntratti, a biblioteca ontio_std furnisce un modulu simulatu per a prova. Stu modulu furnisce una simulazione di e dati in u circuitu, facendu più faciule per i sviluppatori per pruvà unità di i metudi in u cuntrattu. Esempii specifichi ponu esse truvati ccà.

Debugging di u cuntrattu

console::debug(msg) mostra l'infurmazioni di debug mentre debug un cuntrattu. L'infurmazione di msg serà aghjuntu à u schedariu di log di u nodu. Un prerequisite hè di stabilisce u nivellu di u schedariu di log à u modu di debug quandu u nodu di prova di l'Ontology locale hè in esecuzione.

runtime::notify(msg) produce l'informazione di debug approprita mentre u cuntrattu hè debuggatu. Stu metudu guardà l'infurmazioni entrate in a catena è pò esse dumandata da a catena cù u metudu getSmartCodeEvent.

L'articulu hè statu traduttu da l'editori di Hashrate&Shares in particulare per OntologyRussia. pienghje

Sò un sviluppatore? Unisci à a nostra cumunità tecnologica à Discord. Inoltre, fate un ochju Centru di sviluppatori nant'à u nostru situ web, induve pudete truvà strumenti di sviluppatore, documentazione è più.

Ontologia

Source: www.habr.com

Add a comment