Hogyan írjunk okos szerződést WebAssembly-n az Ontology hálózaton? 1. rész: Rust

Hogyan írjunk okos szerződést WebAssembly-n az Ontology hálózaton? 1. rész: Rust

Az Ontology Wasm technológia csökkenti a komplex üzleti logikával rendelkező dApp-ok szmart szerződéseinek blokkláncra való áttelepítésének költségeit, ezáltal jelentősen gazdagítva a dApp ökoszisztémát.

Jelenleg Ontology Wasm egyszerre támogatja a Rust és a C++ nyelven való fejlesztést. A Rust nyelv jobban támogatja a Wasm-t, és a generált bájtkód egyszerűbb, ami további költségcsökkentést eredményezhet a szerződéses hívásoknál. Tehát hogyan használhatjuk a Rust-ot az Ontology hálózatában való szerződésfejlesztéshez?

WASM-szerződés fejlesztés Rusttal

Szerződés létrehozása

Cargo — egy jó eszköz a projektek létrehozására és a csomagok kezelésére Rust programok fejlesztésekor, amely segít a fejlesztőknek jobban megszervezni a kód és a külső könyvtárak közötti interakciót. Az új Ontology Wasm-szerződés létrehozásához egyszerűen futtassa a következő parancsot:

Hogyan írjunk okos szerződést WebAssembly-n az Ontology hálózaton? 1. rész: Rust

A projekt struktúrája, amelyet generál:

Hogyan írjunk okos szerződést WebAssembly-n az Ontology hálózaton? 1. rész: Rust

A Cargo.toml fájl a projekt alapinformációinak és a függő könyvtár információinak beállítására szolgál. A [lib] szekcióban meg kell határozni a crate-type = ["cdylib"] értéket. A lib.rs fájl a szerződés logikai kódjának írására szolgál. Ezen kívül szükséges a Cargo.toml konfigurációs fájl [dependencies] szekciójába a függőségek paramétereinek hozzáadása:

Hogyan írjunk okos szerződést WebAssembly-n az Ontology hálózaton? 1. rész: Rust

Ezekkel a függőségekkel a fejlesztők interfészeket hívhatnak, amelyek interakcióba lépnek az Ontology blokklánccal, valamint eszközöket, mint a sorosítási paraméter.

A szerződés bemeneti funkciója

Minden programnak van bemeneti funkciója, mint például a main-funkció, amelyet általában látunk, de a szerződésnek nincs main-funkciója. Amikor Rust felhasználásával Wasm-szerződést fejlesztenek, az invoke funkciót a szerződés használatára szánt bemeneti funkcióként alkalmazzák. A Rustban a funkció neve nem lesz nyilvánvaló a Rust forráskód bájtkódra való fordításakor, amelyet a virtuális gép végezhet. A felesleges kód generálásának megakadályozására és a szerződés méretének csökkentésére az invoke funkció a #[no_mangle] annotációt adja hozzá.

Hogyan kapja meg az invoke funkció a tranzakció végrehajtásához szükséges paramétereket?

Az ontio_std könyvtár biztosítja a runtime::input() függvényt, amely lehetővé teszi a tranzakció végrehajtásához szükséges paraméterek megszerzését. A fejlesztők a ZeroCopySource-t használhatják a kapott byte tömb deszerializálására. Az első olvasott byte tömb az invoke- metódus neve, ezt követik a metódus paraméterei.

Hogyan tér vissza a szerződés végrehajtásának eredménye?

A runtime::ret függvény, amelyet az ontio_std könyvtár biztosít, a metódus végrehajtásának eredményét adja vissza.

A befejezett invoke- funkció a következőképpen néz ki:

Hogyan írjunk okos szerződést WebAssembly-n az Ontology hálózaton? 1. rész: Rust

A szerződés adatai sorozatba és deszerializálásba

A szerződések fejlesztése során a fejlesztők mindig szembesülnek a sorozatba és deszerializálás problémáival, különösen azzal, hogyan menthetik el az struct típusú adatokat az adatbázisba, és hogyan deszerializálhatják a byte tömböt az adatbázisból, hogy visszakapják az struct típusú adatokat.

Az ontio_std könyvtár dekóder és kódoló interfészeket biztosít az adatok sorozatba és deszerializálásához. Az struct struktúra mezői szintén megvalósítják a dekóder és kódoló interfészeket, így a struktúra sorozatba és deszerializálásra kerülhet. A Sink osztály példányaira van szükség, amikor különféle típusú adatokat sorozatba alakítanak. A Sink osztály példányának van egy set típusú buf mezője, amely a byte típusú adatokat tárolja, és az összes sorozatba helyezett adat a buf-ban tárolódik.

A fix hosszúságú adatok (például: byte, u16, u32, u64 stb.) közvetlenül byte tömbbe kerülnek átalakításra, majd elmentésre a buf-ba; a nem fix hosszúságú adatok esetében először a hosszúságot kell sorozatba alakítani, majd az adatok (például ismeretlen méretű, pozitív egész számok, beleértve az u16, u32 vagy u64 stb.) kerülnek sorozatba.

A deszerializálás a sorozatba helyezés közvetlen ellentéte. Minden sorozatba helyezési metódushoz van egy megfelelő deszerializáló metódus. A deszerializáláshoz Source osztály példányait kell használni. Ez az osztály példány két mezővel rendelkezik, buf és pos. A buf azokat az adatokat tárolja, amelyeket deszerializálni kell, míg a pos a jelenlegi olvasási pozíciót tárolja. Amikor egy adott típusú adatot olvasnak, ha ismerik a hosszúságukat, közvetlenül olvashatják őket; az ismeretlen hosszúságú adatok esetében először a hosszúságot, majd a tartalmat kell olvasni.

Az adatok elérése és frissítése a láncon

Ontology-wasm-cdt-rust — encapsulálta az adatokkal való munka operatív módszerét a láncban, amely kényelmes a fejlesztők számára műveletek végrehajtására, mint például adatok hozzáadása, törlése, módosítása és lekérdezése a láncban a következő módon:

  • database::get(key) — arra használják, hogy adatokat kérjenek le a láncból, a key pedig az AsRef interfész megvalósítását kéri;
  • database::put(key, value) — arra használják, hogy adatokat tároljanak a láncban. A key az AsRef interfész végrehajtását kéri, míg a value az Encoder interfész megvalósítását igényli;
  • database::delete(key) — arra használják, hogy adatokat távolítsanak el a láncból, a key pedig az AsRef interfész megvalósítását kéri.

Szerződés tesztelése

Amikor a szerződés módszereit valósítják meg, szükség van az adatokhoz való hozzáférésre a láncban, valamint egy megfelelő virtuális gépre a szerződés bytekódjának végrehajtásához, ezért általában szükséges a szerződést telepíteni a láncba a teszteléshez. Ez a tesztelési módszer azonban problémás. A szerződések tesztelésének megkönnyítése érdekében az ontio_std könyvtár mock modult biztosít a teszteléshez. Ez a modul szimulálja az adatokat a láncban, ezzel megkönnyítve a fejlesztők számára a szerződés módszereinek egység tesztelését. Konkrét példák találhatók itt.

Szerződés hibakeresése

console::debug(msg) hibaelhárító információkat jelenít meg a szerződés hibakeresése közben. Az msg információ a csomópont naplófájljába fog kerülni. Kötelező feltétel, hogy a naplófájl szintjét hibakeresési módra állítsuk, amikor a helyi teszt csomópontot futtatjuk Ontology alatt.

runtime::notify(msg) megfelelő hibakeresési információt jelenít meg a szerződés hibakeresése közben. Ez a módszer megőrzi a bejegyzett információt a láncban, és a láncból kérhető a getSmartCodeEvent módszerrel.

A cikket a Hashrate&Shares szerkesztősége fordította az OntologyRussia számára. kattintás

Fejlesztő vagy? Csatlakozz a technikai közösségünkhöz a Discord. Ezen kívül nézd meg a Fejlesztőközpontot a weboldalunkon, ahol fejlesztői eszközöket, dokumentációt és sok mást találhat.

Ontology

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster