
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 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
— 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:
![]()
A projekt struktúrája, amelyet generál:

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:

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:

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 .
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.
Fejlesztő vagy? Csatlakozz a technikai közösségünkhöz a . Ezen kívül nézd meg a a weboldalunkon, ahol fejlesztői eszközöket, dokumentációt és sok mást találhat.
Ontology
- /
- Telegram /
- /
Forrás: habr.com
