Jak napsat chytrou smlouvu na WebAssembly v síti Ontology? Část 1: Rust

Jak napsat chytrou smlouvu na WebAssembly v síti Ontology? Část 1: Rust

Technologie Ontology Wasm snižuje náklady na přenos chytrých kontraktů dApp se složitou obchodní logikou na blockchain, čímž významně obohacuje ekosystém dApp.

V současné době Ontology Wasm současně podporuje vývoj jak v jazyce Rust, tak v jazyce C++. Jazyk Rust lépe podporuje Wasm a generovaný bytecode je jednodušší, což může dále snížit náklady na volání kontraktů. Takže jak použít Rust pro vývoj kontraktu v síti Ontology?

Vývoj WASM kontraktu pomocí Rust

Vytvoření kontraktu

Cargo je dobrý nástroj pro vytváření projektů a správu balíčků při vývoji aplikací v Rustu, který pomáhá vývojářům lépe organizovat interakci kódu a externích knihoven. Abyste vytvořili nový Ontology Wasm kontrakt, stačí spustit následující příkaz:

Jak napsat chytrou smlouvu na WebAssembly v síti Ontology? Část 1: Rust

Struktura projektu, kterou generuje:

Jak napsat chytrou smlouvu na WebAssembly v síti Ontology? Část 1: Rust

Soubor Cargo.toml se používá pro nastavení základních informací o projektu a informací o závislých knihovnách. Sekce [lib] v souboru musí mít hodnotu crate-type = ["cdylib"]. Soubor lib.rs se používá pro psaní logiky kontraktu. Navíc je nutné přidat parametry závislostí do sekce [dependencies] konfiguračního souboru Cargo.toml:

Jak napsat chytrou smlouvu na WebAssembly v síti Ontology? Část 1: Rust

Pomocí této závislosti mohou vývojáři volat rozhraní, která interagují s blockchainem Ontology, a nástroje, jako je parametr serializace.

Funkce vstupu kontraktu

Každý program má funkci vstupu, například funkci main, kterou obvykle vidíme, ale kontrakt nemá funkci main. Při vývoji Wasm kontraktu pomocí Rustu se jako funkce vstupu pro použití kontraktu používá funkce invoke. Název funkce v Rustu bude při kompilaci zdrojového kódu Rust do bytecode, který může vykonávat virtuální stroj, nejasný. Aby se kompilátor varoval před generováním nadbytečného kódu a zmenšil velikost kontraktu, funkce invoke přidává anotaci #[no_mangle].

Jak funkce invoke přijímá parametry pro vykonání transakce?

Knihovna ontio_std poskytuje funkci runtime::input() pro získání parametrů pro realizaci transakce. Vývojáři mohou použít ZeroCopySource k deserializaci přijatého pole bytů. První přečtené pole bytů je název invoke-metody, následované parametry metody.

Jak se vrací výsledek vykonání kontraktu?

Funkce runtime::ret, kterou poskytuje knihovna ontio_std, vrací výsledek vykonání metody.

Dokončená invoke-funkce vypadá následovně:

Jak napsat chytrou smlouvu na WebAssembly v síti Ontology? Část 1: Rust

Serializace a deserializace dat kontraktu

Při vývoji kontraktů se vývojáři často setkávají s problémy serializace a deserializace, zejména jak uložit typ dat struct do databáze a jak deserializovat pole bytů přečtené z databáze, abychom získali typ dat struct.

Knihovna ontio_std poskytuje rozhraní pro dekodér a kodér pro serializaci a deserializaci dat. Pole struktury struct rovněž implementují rozhraní pro dekodér a kodér, takže struktura může být serializována a deserializována. Instance třídy Sink jsou nezbytné při serializaci různých typů dat. Instance třídy Sink má pole buf typu set, které uchovává bajtová data, a všechna serializovaná data jsou uložena v buf.

Pro data s pevnou délkou (například: byte, u16, u32, u64 atd.) jsou data přímo přetvořena na pole bytů a poté uložena v buf; u dat s proměnlivou délkou je nejprve nutné serializovat délku a poté data (například celé čísla bez znaménka neznámé velikosti, včetně u16, u32 nebo u64 atd.).

Deserializace je přímým opakem. Pro každou metodu serializace existuje odpovídající metoda deserializace. Deserializace vyžaduje použití instancí třídy Source. Tato instance třídy má dvě pole buf a pos. Buf slouží k ukládání dat, která budou deserializována, a pos se používá k uchovávání aktuální pozice čtení. Při čtení konkrétního typu dat, pokud znáte jejich délku, můžete je číst přímo; pro data neznámé délky nejprve přečtěte délku a poté obsah.

Přístup a aktualizace dat v řetězci

Ontology-wasm-cdt-rust — kapsloval operativní metodu práce s daty v řetězci, která usnadňuje vývojářům provádět operace, jako je přidávání, odstraňování, měnění a dotazování dat v řetězci následujícím způsobem:

  • database::get(key) — používá se k dotazování dat z řetězce, přičemž key vyžaduje implementaci rozhraní AsRef;
  • database::put(key, value) — používá se k ukládání dat do sítě. Key vyžaduje provedení rozhraní AsRef, a value vyžaduje implementaci rozhraní Encoder;
  • database::delete(key) — používá se k odstranění dat z řetězce, přičemž key vyžaduje implementaci rozhraní AsRef.

Testování kontraktu

Když se implementují metody kontraktu, potřebujeme přístup k datům v řetězci a potřebujeme odpovídající virtuální stroj, abychom provedli bytecode kontraktu, proto je obvykle nutné nasadit kontrakt v řetězci pro testování. Taková metoda testování je však problematická. Abychom usnadnili vývojářům testování kontraktů, knihovna ontio_std poskytuje mock modul pro testování. Tento modul zajišťuje simulaci dat v řetězci, což usnadňuje vývojářům jednotkové testování metod v kontraktu. Konkrétní příklady mohou být nalezeny zde.

Ladění kontraktu

console::debug(msg) vypisuje ladicí informace během ladění kontraktu. Informace msg budou zaznamenány do logu souboru uzlu. Podmínkou je nastavení úrovně logu na ladicí režim, když je spuštěna místní testovací uzlová instance Ontology.

runtime::notify(msg) vypisuje příslušné ladicí informace během ladění kontraktu. Tato metoda uloží zadané informace do řetězce a mohou být dotazovány z řetězce pomocí metody getSmartCodeEvent.

Článek byl přeložen redakcí Hashrate&Shares speciálně pro OntologyRussia. klikněte

Jste vývojář? Připojte se k naší technické komunitě na Discord. Navíc se podívejte na Centrum pro vývojáře na našich stránkách, kde můžete najít nástroje pro vývojáře, dokumentaci a mnohem více.

Ontology

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster