Nola idatzi WebAssembly kontratu adimenduna Ontology sarean? 1. zatia: herdoila

Nola idatzi WebAssembly kontratu adimenduna Ontology sarean? 1. zatia: herdoila

Ontology Wasm teknologiak dApp kontratu adimendunak negozio-logika konplexua duten migrazioaren kostua murrizten du blockchainera, eta horrela dApp ekosistema asko aberasten du.

Orain Ontologia Wasm Rust eta C++ garapena onartzen du aldi berean. Rust hizkuntzak Wasm hobeto onartzen du, eta sortutako bytecode sinpleagoa da, eta horrek kontratu-deien kostua are gehiago murriztu dezake. Beraz, nola erabili Rust Ontologia sarean kontratu bat garatzeko?

Rust-ekin WASM kontratua garatzea

Kontratu bat sortu

Zama Rust garapenerako proiektuak sortzeko eta paketeak kudeatzeko tresna ona da, garatzaileei kodeen eta hirugarrenen liburutegien elkarrekintza hobeto antolatzen laguntzen diena. Ontology Wasm kontratu berri bat sortzeko, exekutatu komando hau:

Nola idatzi WebAssembly kontratu adimenduna Ontology sarean? 1. zatia: herdoila

Sortzen duen proiektuaren egitura:

Nola idatzi WebAssembly kontratu adimenduna Ontology sarean? 1. zatia: herdoila

Cargo.toml fitxategia proiektuaren oinarrizko informazioa eta menpeko liburutegiaren informazioa konfiguratzeko erabiltzen da. Fitxategiaren [lib] atala crate-type = ["cdylib"] gisa ezarri behar da. lib.rs fitxategia kontratuaren kode logikoa idazteko erabiltzen da. Horrez gain, Cargo.toml konfigurazio-fitxategiko [dependencies] atalean gehitu behar dituzu mendekotasun-parametroak:

Nola idatzi WebAssembly kontratu adimenduna Ontology sarean? 1. zatia: herdoila

Mendekotasun honekin, garatzaileek Ontology bloke-katearekin elkarreragiten duten interfazeak eta serializazio parametroa bezalako tresnei dei diezaiekete.

Kontratua sartzeko funtzioa

Programa bakoitzak sarrera funtzio bat du, normalean ikusten dugun funtzio nagusia bezala, baina kontratuak ez du funtzio nagusirik. Wasm kontratua Rust erabiliz garatzen denean, dei-funtzio lehenetsia erabiltzen da kontratua erabiltzeko sarrera-funtzio gisa. Rust-en funtzio baten izena ez da argituko Rust iturburu-kodea makina birtual batek exekutatu dezakeen bytecode batean konpilatzean. Konpilatzaileak kode erredundantea sortzea saihesteko eta kontratuaren tamaina murrizteko, invoke funtzioak #[no_mangle] oharpena gehitzen du.

Nola lortzen ditu invoke funtzioak transakzio bat exekutatzeko parametroak?

ontio_std liburutegiak runtime::input() funtzio bat eskaintzen du transakzio bat exekutatzeko parametroak lortzeko. Garatzaileek ZeroCopySource erabil dezakete ondoriozko byte-matrizea deserializatzeko. Irakurritako lehenengo byte-matrizea invoke metodoaren izena da, eta ondoren metodoaren parametroak.

Nola itzultzen da kontratuaren betearazpenaren emaitza?

ontio_std liburutegiak eskaintzen duen runtime::ret funtzioak metodo baten exekuzioaren emaitza itzultzen du.

Osatutako dei-funtzioak honelako itxura du:

Nola idatzi WebAssembly kontratu adimenduna Ontology sarean? 1. zatia: herdoila

Kontratuaren datuak serializatu eta deserializatu

Kontratuak garatzeko prozesuan, garatzaileek beti arazoak izaten dituzte serializazio eta deserializazioarekin, zehazki, datu-basean struct datu-mota nola gorde eta datu-basetik irakurritako byte-matrize bat nola deserializatu struct datu-mota lortzeko.

ontio_std liburutegiak deskodetzaile eta kodetzaile interfazeak eskaintzen ditu datuen serializazio eta deserializaziorako. Egitura baten eremuek deskodetzaile eta kodetzaile interfazeak ere ezartzen dituzte, egitura serializatu eta deserializatu ahal izateko. Sink klasearen instantziak beharrezkoak dira hainbat datu mota seriatzen direnean. Sink klaseko instantzia batek multzo motako buf bat du, byte motako datuak gordetzen dituena, eta serializatutako datu guztiak buf-en gordetzen dira.

Luzera finkoko datuetarako (adibidez: byte, u16, u32, u64, etab.), datuak zuzenean byte array batean bihurtzen dira eta gero buf-en gordetzen dira; luzera ez finkoko datuetarako, luzera seriatu behar da lehenik, eta ondoren Ddata (adibidez, tamaina ezezaguneko zenbaki oso sinatu gabeak, u16, u32 edo u64 barne, etab.).

Deserializazioa guztiz kontrakoa da. Serializazio-metodo bakoitzari dagokion deserializazio-metodo bat dago. Deserializazioak Source klaseko instantzien erabilera eskatzen du. Klase instantzia honek bi eremu ditu buf eta pos. Buf deserializatu beharreko datuak gordetzeko erabiltzen da eta pos uneko irakurketa posizioa gordetzeko. Datu-mota jakin bat irakurtzen ari direnean, haren luzera ezagutzen baduzu, zuzenean irakur dezakezu, luzera ezezaguneko datuetarako; irakurri luzera lehenik, eta gero edukia.

Sartu eta eguneratu kateko datuak

ontologia-wasm-cdt-herdoila - Kateko datuekin lan egiteko metodo operatibo bat bildu zuen, garatzaileentzat komenigarria dena katean datuak gehitzea, ezabatzea, aldatzea eta kontsultatzea bezalako eragiketak ezartzeko:

  • datu-basea::get(gakoa) - kateari datuak eskatzeko erabiltzen da, eta gakoak AsRef interfazearen ezarpena eskatzen du;
  • datu-basea::jarri(gakoa, balioa) - sarean datuak gordetzeko erabiltzen da. Key-ek AsRef interfazea ezartzea eskatzen du, eta value-k Encoder interfazea ezartzea eskatzen du;
  • datu-basea::ezabatu(gakoa) - katetik datuak kentzeko erabiltzen da, eta gakoak AsRef interfazearen ezarpena eskatzen du.

Kontratuaren probak

Kontratu baten metodoak ezartzen direnean, kateko datuetarako sarbidea behar dugu eta makina birtual egoki bat behar dugu kontratuaren bytecodea exekutatzeko, beraz, orokorrean beharrezkoa da kontratua katean hedatzea probak egiteko. Baina probatzeko metodo hau arazotsua da. Garatzaileei kontratuak probatzea errazteko, ontio_std liburutegiak probak egiteko modulu simulatua eskaintzen du. Modulu honek zirkuituko datuen simulazioa eskaintzen du, garatzaileek kontratuko metodoak probatzeko unitatea erraztuz. Adibide zehatzak aurki daitezke Hemen.

Kontratuaren arazketa

console::debug(msg) arazte-informazioa bistaratzen du kontratu bat arazketa bitartean. Mezuaren informazioa nodoaren erregistro-fitxategian gehituko da. Baldintza bat da erregistro-fitxategiaren maila arazketa moduan ezartzea Ontology proba-nodo lokala martxan dagoenean.

runtime::notify(msg) kontratua arazketa egiten ari den bitartean arazte-informazio egokia ateratzen du. Metodo honek katean sartutako informazioa gordeko du eta katetik kontsulta daiteke getSmartCodeEvent metodoa erabiliz.

Artikulua Hashrate&Shares-eko editoreek itzuli dute bereziki OntologyRussiarako. negar egin

Garatzailea al zara? Sartu gure komunitate teknologikoa hemen discord. Gainera, begiratu Garatzaile Zentroa gure webgunean, garatzaileentzako tresnak, dokumentazioa eta abar aurki ditzakezun.

Ontologia

Iturria: www.habr.com

Gehitu iruzkin berria