Come scrivere uno smart contract WebAssembly sulla rete Ontology? Parte 1: Ruggine

Come scrivere uno smart contract WebAssembly sulla rete Ontology? Parte 1: Ruggine

La tecnologia Ontology Wasm riduce il costo della migrazione dei contratti intelligenti dApp con logica aziendale complessa alla blockchain, arricchendo così notevolmente l'ecosistema dApp.

Ora Ontologia Wasm Supporta contemporaneamente lo sviluppo in Rust e C++. Il linguaggio Rust supporta meglio Wasm e il bytecode generato è più semplice, il che può ridurre ulteriormente il costo delle chiamate a contratto. COSÌ, come usare Rust per sviluppare un contratto sulla rete Ontology?

Sviluppo di un contratto WASM con Rust

Crea un contratto

ufficio è un buon strumento per la creazione di progetti e la gestione dei pacchetti per lo sviluppo di Rust, che aiuta gli sviluppatori a organizzare meglio l'interazione tra codice e librerie di terze parti. Per creare un nuovo contratto Ontology Wasm, esegui semplicemente il seguente comando:

Come scrivere uno smart contract WebAssembly sulla rete Ontology? Parte 1: Ruggine

La struttura del progetto che genera:

Come scrivere uno smart contract WebAssembly sulla rete Ontology? Parte 1: Ruggine

Il file Cargo.toml viene utilizzato per impostare le informazioni di base sul progetto e le informazioni sulla libreria dipendente. La sezione [lib] del file deve essere impostata su crate-type = ["cdylib"]. Il file lib.rs viene utilizzato per scrivere il codice logico del contratto. Inoltre, è necessario aggiungere i parametri di dipendenza alla sezione [dependencies] del file di configurazione Cargo.toml:

Come scrivere uno smart contract WebAssembly sulla rete Ontology? Parte 1: Ruggine

Con questa dipendenza, gli sviluppatori possono chiamare interfacce che interagiscono con la blockchain di Ontology e strumenti come il parametro di serializzazione.

Funzione di registrazione del contratto

Ogni programma ha una funzione di input, come la funzione principale che vediamo di solito, ma il contratto non ha una funzione principale. Quando un contratto Wasm viene sviluppato utilizzando Rust, la funzione di richiamo predefinita viene utilizzata come funzione di input per utilizzare il contratto. Il nome di una funzione in Rust non sarà chiaro durante la compilazione del codice sorgente di Rust in bytecode che può essere eseguito da una macchina virtuale. Per impedire al compilatore di generare codice ridondante e ridurre le dimensioni del contratto, la funzione invoke aggiunge l'annotazione #[no_mangle].

In che modo la funzione invoke ottiene i parametri per eseguire una transazione?

La libreria ontio_std fornisce una funzione runtime::input() per ottenere i parametri per eseguire una transazione. Gli sviluppatori possono utilizzare ZeroCopySource per deserializzare l'array di byte risultante. In cui il primo array di byte letto è il nome del metodo invoke, seguito dai parametri del metodo.

Come viene restituito il risultato dell'esecuzione del contratto?

La funzione runtime::ret fornita dalla libreria ontio_std restituisce il risultato dell'esecuzione di un metodo.

La funzione di richiamo completata è simile a questa:

Come scrivere uno smart contract WebAssembly sulla rete Ontology? Parte 1: Ruggine

Serializzazione e deserializzazione dei dati del contratto

Nel processo di sviluppo dei contratti, gli sviluppatori incontrano sempre problemi con la serializzazione e la deserializzazione, in particolare con come archiviare un tipo di dati struct nel database e come deserializzare un array di byte letto dal database per ottenere un tipo di dati struct.

La libreria ontio_std fornisce interfacce decodificatore e codificatore per la serializzazione e la deserializzazione dei dati. I campi di una struttura implementano anche le interfacce decodificatore e codificatore in modo che la struttura possa essere serializzata e deserializzata. Le istanze della classe Sink sono necessarie quando vengono serializzati vari tipi di dati. Un'istanza della classe Sink ha un campo di tipo set buf che archivia i dati di tipo byte e tutti i dati serializzati vengono archiviati in buf.

Per i dati di lunghezza fissa (ad esempio: byte, u16, u32, u64, ecc.), i dati vengono convertiti direttamente in un array di byte e quindi memorizzati in buf; per i dati di lunghezza non fissa, la lunghezza deve essere prima serializzata, quindi Ddata (ad esempio, interi senza segno di dimensione sconosciuta, inclusi u16, u32 o u64, ecc.).

La deserializzazione è l'esatto contrario. Per ogni metodo di serializzazione esiste un metodo di deserializzazione corrispondente. La deserializzazione richiede l'uso di istanze della classe Source. Questa istanza di classe ha due campi buf e pos. Buf viene utilizzato per memorizzare i dati da deserializzare e pos viene utilizzato per memorizzare la posizione di lettura corrente. Quando viene letto un particolare tipo di dati, se ne conosci la lunghezza, puoi leggerlo direttamente, per dati di lunghezza sconosciuta: leggi prima la lunghezza, quindi leggi il contenuto.

Accedi e aggiorna i dati nella catena

ontologia-wasm-cdt-rust - ha incapsulato un metodo operativo per lavorare con i dati nella catena, utile per gli sviluppatori per implementare operazioni come l'aggiunta, l'eliminazione, la modifica e l'interrogazione dei dati nella catena come segue:

  • database::get(chiave) - viene utilizzato per richiedere dati dalla catena e la chiave richiede l'implementazione dell'interfaccia AsRef;
  • database::put(chiave, valore) - utilizzato per memorizzare i dati sulla rete. Key richiede l'implementazione dell'interfaccia AsRef e value richiede l'implementazione dell'interfaccia Encoder;
  • database::elimina(chiave) - viene utilizzato per rimuovere i dati dalla catena e la chiave richiede l'implementazione dell'interfaccia AsRef.

Test del contratto

Quando vengono implementati i metodi di un contratto, abbiamo bisogno di accedere ai dati sulla catena e abbiamo bisogno di una macchina virtuale appropriata per eseguire il bytecode del contratto, quindi è generalmente necessario distribuire il contratto sulla catena per il test. Ma questo metodo di test è problematico. Per facilitare agli sviluppatori il test dei contratti, la libreria ontio_std fornisce un modulo fittizio per il test. Questo modulo fornisce la simulazione dei dati nella catena, rendendo più semplice per gli sviluppatori il test unitario dei metodi nel contratto. Si possono trovare esempi specifici qui.

Debug del contratto

console::debug(msg) visualizza le informazioni di debug durante il debug di un contratto. Le informazioni sul messaggio verranno aggiunte al file di log del nodo. Un prerequisito è impostare il livello del file di log sulla modalità di debug quando il nodo di test Ontology locale è in esecuzione.

runtime::notify(msg) restituisce le informazioni di debug appropriate durante il debug del contratto. Questo metodo memorizza le informazioni immesse nella catena e può essere interrogato dalla catena utilizzando il metodo getSmartCodeEvent.

L'articolo è stato tradotto dalla redazione di Hashrate&Shares appositamente per OntologyRussia. клик

Sei uno sviluppatore? Unisciti alla nostra comunità tecnologica su Discordia. Inoltre, dai un'occhiata a Centro per sviluppatori sul nostro sito Web, dove puoi trovare strumenti per sviluppatori, documentazione e altro ancora.

ontologia

Fonte: habr.com

Aggiungi un commento