Hogyan írjunk WebAssembly intelligens szerződést az Ontológia hálózaton? 1. rész: Rozsda

Hogyan írjunk WebAssembly intelligens szerződést az Ontológia hálózaton? 1. rész: Rozsda

Az Ontology Wasm technológia csökkenti a bonyolult üzleti logikával rendelkező dApp intelligens szerződések blokkláncra történő migrálásának költségeit, ezáltal nagymértékben gazdagítja a dApp ökoszisztémát.

Most Ontológia Wasm Egyidejűleg támogatja a Rust és a C++ fejlesztést. A Rust nyelv jobban támogatja a Wasm-ot, és egyszerűbb a generált bájtkód, ami tovább csökkentheti a szerződéses hívások költségeit. Így, hogyan lehet a Rust segítségével szerződést kötni az Ontológia hálózaton?

WASM szerződés kidolgozása Rusttal

Hozzon létre egy szerződést

Szállítmány egy jó projektkészítő és csomagkezelő eszköz a Rust fejlesztéshez, amely segít a fejlesztőknek a kód és a harmadik féltől származó könyvtárak interakciójának jobb megszervezésében. Új Ontology Wasm szerződés létrehozásához egyszerűen futtassa a következő parancsot:

Hogyan írjunk WebAssembly intelligens szerződést az Ontológia hálózaton? 1. rész: Rozsda

Az általa generált projektstruktúra:

Hogyan írjunk WebAssembly intelligens szerződést az Ontológia hálózaton? 1. rész: Rozsda

A Cargo.toml fájl az alapvető projektinformációk és a függő könyvtári információk beállítására szolgál. A fájl [lib] szakaszát crate-type = ["cdylib"] értékre kell állítani. A lib.rs fájl a szerződés logikai kódjának írására szolgál. Ezenkívül hozzá kell adnia a függőségi paramétereket a Cargo.toml konfigurációs fájl [dependencies] szakaszához:

Hogyan írjunk WebAssembly intelligens szerződést az Ontológia hálózaton? 1. rész: Rozsda

Ezzel a függőséggel a fejlesztők olyan interfészeket hívhatnak meg, amelyek kölcsönhatásba lépnek az ontológia blokklánccal és olyan eszközökkel, mint például a szerializációs paraméter.

Szerződéskötés funkció

Minden programnak van bemeneti funkciója, mint általában a fő függvénynek, de a szerződésnek nincs fő funkciója. Ha egy Wasm-szerződést Rust használatával fejlesztenek ki, az alapértelmezett meghívó funkciót használják bemeneti függvényként a szerződés használatához. A Rust egyik függvényének neve homályos lesz, amikor a Rust forráskódot virtuális gép által végrehajtható bájtkódba fordítja. Annak megakadályozására, hogy a fordító redundáns kódot generáljon, és csökkentse a szerződés méretét, az invoke függvény hozzáadja a #[no_mangle] megjegyzést.

Hogyan kap paramétereket az invoke függvény a tranzakció végrehajtásához?

Az ontio_std könyvtár egy futásidejű::input() függvényt biztosít a tranzakció végrehajtásához szükséges paraméterek lekéréséhez. A fejlesztők a ZeroCopySource segítségével deszerializálhatják az eredményül kapott bájttömböt. Amelyben az első olvasott bájttömb az invoke metódus neve, majd a metódus paraméterei.

Hogyan térül vissza a szerződés teljesítésének eredménye?

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

A kész meghívó függvény így néz ki:

Hogyan írjunk WebAssembly intelligens szerződést az Ontológia hálózaton? 1. rész: Rozsda

A szerződéses adatok sorosítása és deszerializálása

A szerződések kidolgozása során a fejlesztők mindig problémákba ütköznek a szerializálással és a deszerializálással kapcsolatban, különös tekintettel arra, hogyan kell tárolni egy struct adattípust az adatbázisban, és hogyan lehet deszerializálni az adatbázisból kiolvasott bájttömböt, hogy struct adattípust kapjanak.

Az ontio_std könyvtár dekódoló és kódoló interfészeket biztosít az adatok sorosításához és deszerializálásához. A struktúra mezői a dekóder és a kódoló interfészeket is megvalósítják, így a struktúra szerializálható és deszerializálható. A Sink osztály példányaira akkor van szükség, ha különböző adattípusokat soroznak. A Sink osztály egy példányának van egy set-type mező buf, amely tárolja a bájt típusú adatokat, és minden soros adat a buf-ban van tárolva.

Rögzített hosszúságú adatok (pl.: byte, u16, u32, u64 stb.) esetén az adatokat közvetlenül egy bájttömbbe konvertálják, majd a buf-ban tárolják; nem rögzített hosszúságú adatoknál először a hosszt kell szerializálni, majd a Ddata-t (például ismeretlen méretű előjel nélküli egész számok, beleértve az u16, u32 vagy u64 stb.).

A deszerializáció ennek pont az ellenkezője. Minden szerializálási módszerhez létezik egy megfelelő deszerializációs módszer. A deszerializálás a Source osztály példányainak használatát igényli. Ennek az osztálypéldánynak két mezője van: buf és pos. A Buf a deszerializálandó adatok tárolására, a pos pedig az aktuális olvasási pozíció tárolására szolgál. Egy adott típusú adat olvasása közben, ha ismeri a hosszát, közvetlenül is elolvashatja, ismeretlen hosszúságú adatok esetén – először a hosszt olvassa el, majd a tartalmat.

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

ontology-wasm-cdt-rozsda - beágyazott egy olyan műveleti módszert a láncban lévő adatokkal való munkavégzéshez, amely kényelmes a fejlesztők számára olyan műveletek végrehajtásához, mint például adatok hozzáadása, törlése, módosítása és lekérdezése a láncban az alábbiak szerint:

  • adatbázis::get(kulcs) - adatkérésre szolgál a láncból, a kulcs pedig az AsRef interfész megvalósítását kéri;
  • adatbázis::put(kulcs, érték) - adatok tárolására szolgál a hálózaton. A Key az AsRef interfész megvalósítását kéri, az érték pedig az Encoder interfész megvalósítását;
  • adatbázis::delete(kulcs) - adatok eltávolítására szolgál a láncból, és a kulcs kéri az AsRef interfész megvalósítását.

Szerződés tesztelése

A szerződés metódusainak implementálásakor hozzá kell férnünk a láncon lévő adatokhoz, és megfelelő virtuális gépre van szükségünk a szerződés bájtkódjának végrehajtásához, ezért általában szükséges a szerződés telepítése a láncon a teszteléshez. De ez a vizsgálati módszer problémás. Annak érdekében, hogy a fejlesztők könnyebben tesztelhessék a szerződéseket, az ontio_std könyvtár egy álmodult biztosít a teszteléshez. Ez a modul szimulálja az áramkörben lévő adatokat, megkönnyítve a fejlesztők számára a szerződésben szereplő módszerek egységtesztjét. Konkrét példák találhatók itt.

Szerződés hibakeresés

console::debug(msg) megjeleníti a hibakeresési információkat a szerződés hibakeresése közben. Az üzenetadatok hozzáadódnak a csomóponti naplófájlhoz. Előfeltétel, hogy a naplófájl szintjét hibakeresési módra állítsa, amikor a helyi ontológia tesztcsomópont fut.

A runtime::notify(msg) a megfelelő hibakeresési információkat adja ki a szerződés hibakeresése közben. Ez a metódus tárolja a láncba bevitt információkat, és a getSmartCodeEvent metódussal lekérdezhető a lánctól.

A cikket a Hashrate&Shares szerkesztői fordították le kifejezetten az OntologyRussia számára. kiáltás

Ön fejlesztő? Csatlakozz technológiai közösségünkhöz a címen Viszály. Továbbá, vessen egy pillantást Fejlesztői Központ weboldalunkon, ahol fejlesztői eszközöket, dokumentációt és egyebeket találhat.

ontológia

Forrás: will.com

Hozzászólás