
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ě 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
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:
![]()
Struktura projektu, kterou generuje:

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:

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ě:

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 .
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.
Jste vývojář? Připojte se k naší technické komunitě na . Navíc se podívejte na na našich stránkách, kde můžete najít nástroje pro vývojáře, dokumentaci a mnohem více.
Ontology
- /
- Telegram /
- /
Zdroj: habr.com
