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

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

Technologie Ontology Wasm snižuje náklady na migraci chytrých kontraktů dApp se složitou obchodní logikou do blockchainu, čímž výrazně obohacuje ekosystém dApp.

v současné době Ontologie Wasm Současně podporuje vývoj Rust i C++. Jazyk Rust podporuje Wasm lépe a generovaný bajtkód je jednodušší, což může dále snížit náklady na smluvní hovory. Tak, jak použít Rust k vytvoření kontraktu na síti Ontology?

Vypracování smlouvy WASM se společností Rust

Vytvořte smlouvu

Náklad je dobrý nástroj pro vytváření projektů a správu balíčků pro vývoj Rust, který pomáhá vývojářům lépe organizovat interakci kódu a knihoven třetích stran. Chcete-li vytvořit nový kontrakt Ontology Wasm, jednoduše spusťte následující příkaz:

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

Struktura projektu, kterou generuje:

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

Soubor Cargo.toml se používá k nastavení základních informací o projektu a závislých informací o knihovně. Sekce [lib] souboru musí být nastavena na crate-type = ["cdylib"]. Soubor lib.rs se používá k zápisu kódu logiky kontraktu. Kromě toho musíte přidat parametry závislosti do sekce [dependencies] konfiguračního souboru Cargo.toml:

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

Díky této závislosti mohou vývojáři volat rozhraní, která interagují s blockchainem Ontologie a nástroji, jako je parametr serializace.

Funkce zadávání smlouvy

Každý program má vstupní funkci, jako je hlavní funkce, kterou obvykle vidíme, ale smlouva nemá hlavní funkci. Když je smlouva Wasm vyvinuta pomocí Rust, použije se výchozí funkce invoke jako vstupní funkce pro použití smlouvy. Název funkce v Rustu bude nejasný při kompilaci zdrojového kódu Rust do bajtkódu, který lze spustit virtuálním strojem. Aby se zabránilo kompilátoru ve generování redundantního kódu a zmenšila se velikost kontraktu, funkce invoke přidá anotaci #[no_mangle].

Jak funkce invoke získá parametry pro provedení transakce?

Knihovna ontio_std poskytuje funkci runtime::input() pro získání parametrů pro provedení transakce. Vývojáři mohou použít ZeroCopySource k deserializaci výsledného bajtového pole. Ve kterém první pole přečtených bajtů je název metody invoke následovaný parametry metody.

Jak se vrátí výsledek plnění smlouvy?

Funkce runtime::ret poskytovaná knihovnou ontio_std vrací výsledek provedení metody.

Dokončená funkce vyvolání vypadá takto:

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

Serializace a deserializace smluvních dat

V procesu vývoje kontraktů se vývojáři vždy setkávají s problémy se serializací a deserializací, konkrétně s tím, jak uložit datový typ struct do databáze a jak deserializovat bajtové pole načtené z databáze, aby získali datový typ struct.

Knihovna ontio_std poskytuje rozhraní dekodéru a kodéru pro serializaci a deserializaci dat. Pole struktury také implementují rozhraní dekodéru a kodéru, takže strukturu lze serializovat a deserializovat. Instance třídy Sink jsou vyžadovány při serializaci různých datových typů. Instance třídy Sink má buf pole typu set, které ukládá data typu bajtu a všechna serializovaná data jsou uložena v buf.

Pro data s pevnou délkou (např.: bajt, u16, u32, u64 atd.) jsou data přímo převedena na pole bajtů a poté uložena v buf; pro data nepevné délky musí být nejprve serializována délka a poté Ddata (například celá čísla bez znaménka neznámé velikosti, včetně u16, u32 nebo u64 atd.).

Deserializace je pravý opak. 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 se používá k uložení dat, která mají být deserializována, a pos se používá k uložení aktuální polohy čtení. Když se čte určitý typ dat, pokud znáte jeho 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

ontologie-wasm-cdt-rez - zapouzdřená operační metoda pro práci s daty v řetězci, která je vhodná pro vývojáře k implementaci operací, jako je přidávání, mazání, změna a dotazování na data v řetězci následovně:

  • databáze::get(klíč) - používá se k vyžádání dat z řetězce a klíč vyžaduje implementaci rozhraní AsRef;
  • databáze::put(klíč, hodnota) - slouží k ukládání dat v síti. Key požaduje implementaci rozhraní AsRef a value požaduje implementaci rozhraní Encoder;
  • databáze::delete(klíč) - se používá k odstranění dat z řetězce a klíč vyžaduje implementaci rozhraní AsRef.

Testování smlouvy

Když jsou implementovány metody kontraktu, potřebujeme přístup k datům v řetězci a potřebujeme vhodný virtuální stroj pro provedení bajtového kódu kontraktu, takže je obecně nutné nasadit kontrakt do řetězce pro testování. Tento způsob testování je ale problematický. Aby se vývojářům usnadnilo testování smluv, knihovna ontio_std poskytuje falešný modul pro testování. Tento modul poskytuje simulaci dat v okruhu a usnadňuje vývojářům jednotkové testování metod ve smlouvě. Konkrétní příklady lze nalézt zde.

Ladění smlouvy

console::debug(msg) zobrazuje informace o ladění při ladění smlouvy. Informace o zprávě budou přidány do souboru protokolu uzlu. Předpokladem je nastavit úroveň souboru žurnálu do režimu ladění, když je spuštěn lokální uzel testu Ontologie.

runtime::notify(msg) vypíše příslušné informace o ladění během ladění smlouvy. Tato metoda bude ukládat informace zadané do řetězce a lze je z řetězce dotazovat pomocí metody getSmartCodeEvent.

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

Jste vývojář? Připojte se k naší technické komunitě na Svár. Také se podívejte na Vývojářské centrum na našem webu, kde najdete vývojářské nástroje, dokumentaci a další.

Ontologie

Zdroj: www.habr.com

Přidat komentář