ProHoster > Blog > Amministrazione > 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:
A struttura di u prughjettu chì genera:
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:
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ì:
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ù.