
Tehnologia Ontology Wasm reduce costurile transferului contractelor inteligente dApp cu logică de afaceri complexă pe blockchain, îmbogățind astfel semnificativ ecosistemul dApp.
În prezent susține simultan dezvoltarea atât în limbajul Rust, cât și în limbajul C++. Limbajul Rust suportă mai bine Wasm, iar bytecode-ul generat este mai simplu, ceea ce poate reduce și mai mult costurile apelurilor contractuale. Așadar, cum se folosește Rust pentru a dezvolta un contract în rețeaua Ontology?
Dezvoltarea unui contract WASM folosind Rust
Crearea unui contract
este un instrument bun pentru crearea proiectelor și gestionarea pachetelor în dezvoltarea programelor în Rust, care ajută dezvoltatorii să organizeze mai bine interacțiunea dintre cod și biblioteci externe. Pentru a crea un nou contract Ontology Wasm, pur și simplu executați următoarea comandă:
![]()
Structura proiectului generată:

Fișierul Cargo.toml este utilizat pentru configurarea informațiilor de bază ale proiectului și a informațiilor despre bibliotecile dependente. Secțiunea [lib] din fișier trebuie să fie setată la valoarea crate-type = [“cdylib”]. Fișierul lib.rs este utilizat pentru a scrie codul logicii contractului. În plus, trebuie să adăugați parametrii dependențelor în secțiunea [dependencies] din fișierul de configurare Cargo.toml:

Cu această dependență, dezvoltatorii pot apela interfețe care interacționează cu blockchain-ul Ontology și instrumente precum parametrul de serializare.
Funcția de intrare a contractului
Fiecare program are o funcție de intrare, cum ar fi funcția main, pe care o vedem de obicei, dar contractul nu are o funcție main. Atunci când se dezvoltă un contract Wasm folosind Rust, funcția invoke este utilizată implicit ca funcție de intrare pentru utilizarea contractului. Numele funcției în Rust va fi ambiguu la compilarea codului sursă Rust în bytecode care poate fi executat de mașina virtuală. Pentru a preveni compilatorul să genereze cod redundant și a reduce dimensiunea contractului, funcția invoke are o adnotare #[no_mangle].
Cum primește funcția invoke parametrii pentru a executa tranzacția?
Biblioteca ontio_std oferă funcția runtime::input() pentru a obține parametrii necesari executării unei tranzacții. Dezvoltatorii pot utiliza ZeroCopySource pentru a deserializa array-ul de octeți obținut. Primul array de octeți citit reprezintă numele metodei invoke, urmat de parametrii metodei.
Cum se returnează rezultatul execuției contractului?
Funcția runtime::ret, oferită de biblioteca ontio_std, returnează rezultatul execuției metodei.
Funcția invoke finalizată arată astfel:

Serializarea și deserializarea datelor contractului
În procesul de dezvoltare a contractelor, dezvoltatorii se confruntă adesea cu probleme de serializare și deserializare, mai precis cu modul de a salva datele de tip struct în baza de date și cum să deserializăm un array de octeți citit din baza de date pentru a obține un tip de date struct.
Biblioteca ontio_std oferă interfețe pentru decodificator și codificator pentru serializarea și deserializarea datelor. Câmpurile struct-ului implementază, de asemenea, interfețele pentru decodificator și codificator, astfel încât structura să poată fi serializată și deserializată. Instanțele clasei Sink sunt necesare atunci când se serializază diferite tipuri de date. O instanță a clasei Sink are un câmp de tip set buf, care stochează datele de tip byte, iar toate datele serializate sunt stocate în buf.
Pentru datele cu lungime fixă (de exemplu: byte, u16, u32, u64 etc.), datele sunt convertite direct într-un array de octeți și apoi salvate în buf; pentru datele cu lungime variabilă, mai întâi trebuie să se serializze lungimea, apoi Ddata (de exemplu, numere întregi fără semn de lungime necunoscută, inclusiv u16, u32 sau u64 etc.).
Deserializarea este opusul direct. Pentru fiecare metodă de serializare există o metodă corespunzătoare de deserializare. Deserializarea necesită utilizarea instanțelor clasei Source. Această instanță a clasei are două câmpuri: buf și pos. Buf este utilizat pentru a stoca datele care vor fi deserializate, iar pos este folosit pentru a stoca poziția curentă de citire. Când se citește un tip specific de date, dacă știți lungimea acestora, le puteți citi direct; pentru datele de lungime necunoscută, citiți mai întâi lungimea și apoi conținutul.
Accesul și actualizarea datelor în lanț
Ontology-wasm-cdt-rust — a încastrat metoda operațională de lucru cu datele în lanț, care este convenabil pentru dezvoltatori pentru a implementa operațiuni precum adăugarea, ștergerea, modificarea și interogarea datelor în lanț în următorul mod:
- database::get(key) — este folosit pentru a interoga date din lanț, iar key solicită implementarea interfeței AsRef;
- database::put(key, value) — este folosit pentru a stoca date în rețea. Key solicită execuția interfeței AsRef, iar value solicită implementarea interfeței Encoder;
- database::delete(key) — este folosit pentru a șterge date din lanț, iar key solicită implementarea interfeței AsRef.
Testarea contractului
Când se implementează metodele contractului, avem nevoie de acces la datele din lanț și ne trebuie o mașină virtuală corespunzătoare pentru a executa bytecode-ul contractului, așa că, de regulă, este necesară desfășurarea contractului în lanț pentru testare. Dar această metodă de testare este problematică. Pentru a facilita testarea contractelor, biblioteca ontio_std oferă un modul mock pentru testare. Acest modul asigură simularea datelor în lanț, făcând mai ușor pentru dezvoltatori testarea unitară a metodelor din contract. Exemple specifice pot fi găsite .
Depurarea contractului
console::debug(msg) scrie informații de depanare în timpul depurării contractului. Informația msg va fi înregistrată în fișierul de jurnal al nodului. Condiția obligatorie este setarea nivelului fișierului de jurnal în modul de depanare, atunci când nodul de testare local Ontology este pornit.
runtime::notify(msg) scrie informații de depanare relevante în timpul depurării contractului. Această metodă va salva informația înregistrată în lanț și poate fi solicitată din lanț prin metoda getSmartCodeEvent.
Articolul a fost tradus de redacția Hashrate&Shares special pentru OntologyRussia.
Ești dezvoltator? Alătură-te comunității noastre tehnice pe . De asemenea, aruncă o privire pe pe site-ul nostru, unde puteți găsi instrumente pentru dezvoltatori, documentație și multe altele.
Ontology
- /
- Telegram /
- /
Sursa: habr.com
