Si e shkruan një kontratë të zgjuar në WebAssembly në rrjetin Ontology? Pjesa 1: Rust

Si e shkruan një kontratë të zgjuar në WebAssembly në rrjetin Ontology? Pjesa 1: Rust

Teknologjia Ontology Wasm ul kostot e transfertës së kontratave të zgjuara dApp me logjikë të ndërlikuar në blockchain, duke pasuruar ndjeshëm ekosistemin dApp.

Aktualisht Ontology Wasm mbështet zhvillimin si në gjuhën Rust ashtu edhe në gjuhën C++. Gjuha Rust ofron mbështetje më të mirë për Wasm, ndërsa kodi bajt i përftuar është më i thjeshtë, çka gjithashtu mund të ulë më tej kostot e thirrjeve të kontratave. Pra, si të përdorim Rust për të zhvilluar një kontratë në rrjetin Ontology?

Zhvillimi i kontratave WASM me Rust

Krijimi i kontratës

Cargo është një mjet i shkëlqyer për krijimin e projekteve dhe menaxhimin e paketave gjatë zhvillimit të programeve në Rust, që ndihmon zhvilluesit të organizojnë më mirë ndërveprimin e kodit dhe bibliotekave të jashtme. Për të krijuar një kontratë të re Ontology Wasm, thjesht ekzekutoni komandën e mëposhtme:

Si e shkruan një kontratë të zgjuar në WebAssembly në rrjetin Ontology? Pjesa 1: Rust

Struktura e projektit, që ajo gjeneron:

Si e shkruan një kontratë të zgjuar në WebAssembly në rrjetin Ontology? Pjesa 1: Rust

Skedha Cargo.toml përdoret për të konfiguruar informacionin bazë të projektit dhe informacionin e bibliotekës së varur. Seksioni [lib] në skedha duhet të vendoset në vlerën crate-type = ["cdylib"]. Skedha lib.rs përdoret për të shkruar logjikën e kodit të kontratës. Përveç kësaj, ju duhet të shtoni parametrat e varësive në seksionin [dependencies] të skedhës së konfigurimit Cargo.toml:

Si e shkruan një kontratë të zgjuar në WebAssembly në rrjetin Ontology? Pjesa 1: Rust

Me këtë varësi, zhvilluesit mund të thërrasin interfaca që ndërveprojnë me blockchain-in Ontology, si dhe mjete si parametri i serializimit.

Funksioni i thirrjes së kontratës

Çdo program ka njĂ« funksion thirrje, si p.sh., funksioni main qĂ« zakonisht shohim, por kontrata nuk ka njĂ« funksion main. Kur zhvillohet njĂ« kontratĂ« Wasm duke pĂ«rdorur Rust, funksioni invoke pĂ«rdoret si funksion thirrjeje pĂ«r tĂ« pĂ«rdorur kontratĂ«n. Emri i funksionit nĂ« Rust do tĂ« jetĂ« i paqartĂ« gjatĂ« kompilimit tĂ« kodit burimor Rust nĂ« kodin binar, i cili mund tĂ« ekzekutohet nga maĆĄina virtuale. PĂ«r tĂ« parandaluar kompilatorin tĂ« gjenerojĂ« kod tĂ« panevojshĂ«m dhe pĂ«r tĂ« zvogĂ«luar madhĂ«sinĂ« e kontratĂ«s, funksioni invoke shton njĂ« annotim #[no_mangle].

Si funksioni invoke merr parametrat për të realizuar një transaksion?

Biblioteka ontio_std ofron funksionin runtime::input() për të marrë parametrat për realizimin e transaksionit. Zhvilluesit mund të përdorin ZeroCopySource për të deserializuar array-n e marrë të bajtave. Array-i i parë i lexuar është emri i metodës invoke, pastaj parametrat e metodës.

Si kthehet rezultati i ekzekutimit të kontratës?

Funksioni runtime::ret, i ofruar nga biblioteka ontio_std, kthen rezultatin e ekzekutimit të metodës.

Funksioni i plotë invoke duket si më poshtë:

Si e shkruan një kontratë të zgjuar në WebAssembly në rrjetin Ontology? Pjesa 1: Rust

Serializimi dhe deserializimi i të dhënave të kontratës

Gjatë procesit të zhvillimit të kontratave, zhvilluesit përballen gjithmonë me probleme të serializimit dhe deserializimit, sidomos me mënyrën se si të ruajnë të dhënat me tipin struct në bazën e të dhënave dhe si të deserializojnë një array bajtash të lexuar nga baza e të dhënave për të marrë tipin struct.

Biblioteka ontio_std ofron interfaca për dekoder dhe kodues për serilizimin dhe deserializimin e të dhënave. Fushat e strukturës struct gjithashtu realizojnë interfaca për dekoder dhe kodues, në mënyrë që struktura të mund të serilizohet dhe deserializohet. Instancat e klasës Sink janë të nevojshme kur serilizohen lloje të ndryshme të të dhënave. Një instancë e klasës Sink ka një fushë të tipit set- buf, e cila ruan të dhëna të tipit byte, ndërsa të gjitha të dhënat e serilizuar ruhen në buf.

Për të dhënat me gjatësi fikse (p.sh.: byte, u16, u32, u64 etj.) të dhënat konvertohen drejtpërdrejt në një array bajtesh dhe më pas ruhet në buf; për të dhënat me gjatësi të pacaktuar, fillimisht duhet serilizuara gjatësia, dhe pastaj Ddata (p.sh. numra të tërë pa shenjë me madhësi të panjohur, përfshirë u16, u32 ose u64 etj.).

Deserializimi Ă«shtĂ« e kundĂ«rta e drejtpĂ«rdrejtĂ«. PĂ«r çdo metodĂ« serializimi ka njĂ« metodĂ« pĂ«rkatĂ«se deserializimi. Deserializimi kĂ«rkon pĂ«rdorimin e instancave tĂ« klasĂ«s Source. Kjo instancĂ« klase ka dy fusha, buf dhe pos. Buf pĂ«rdoret pĂ«r tĂ« ruajtur tĂ« dhĂ«nat qĂ« do tĂ« deserialized, ndĂ«rsa pos pĂ«rdoret pĂ«r tĂ« mbajtur pozitat aktuale tĂ« leximit. Kur lexoni njĂ« tip tĂ« caktuar tĂ« tĂ« dhĂ«nave, nĂ«se e dini gjatĂ«si e tyre, mund t'i lexoni direkt; pĂ«r tĂ« dhĂ«nat me gjatĂ«si tĂ« panjohur— fillimisht lexoni gjatĂ«siĂ«n, pastaj lexoni pĂ«rmbajtjen.

Qasja dhe përditësimi i të dhënave në zinxhir

Ontology-wasm-cdt-rust — inkapsuloi metodĂ«n operacionale tĂ« punĂ«s me tĂ« dhĂ«na nĂ« zinxhir, e cila Ă«shtĂ« e pĂ«rshtatshme pĂ«r zhvilluesit pĂ«r tĂ« realizuar operacione si shtimi, fshirja, modifikimi dhe kĂ«rkimi i tĂ« dhĂ«nave nĂ« zinxhir nĂ« kĂ«tĂ« mĂ«nyrĂ«:

  • database::get(key) — pĂ«rdoret pĂ«r tĂ« kĂ«rkuar tĂ« dhĂ«na nga zinxhiri, ndĂ«rsa key kĂ«rkon realizimin e ndĂ«rfaqes AsRef;
  • database::put(key, value) — pĂ«rdoret pĂ«r tĂ« ruajtur tĂ« dhĂ«na nĂ« rrjet. Key kĂ«rkon realizimin e ndĂ«rfaqes AsRef, ndĂ«rsa value kĂ«rkon realizimin e ndĂ«rfaqes Encoder;
  • database::delete(key) — pĂ«rdoret pĂ«r tĂ« hequr tĂ« dhĂ«na nga zinxhiri, ndĂ«rsa çelĂ«si kĂ«rkon implementimin e interfesĂ«s AsRef.

Testimi i kontratës

Kur metodat e kontratës implementohen, na nevojitet qasje në të dhënat në zinxhir dhe na nevojitet një makinë virtuale për të ekzekutuar bytecode-in e kontratës, prandaj zakonisht është e nevojshme të implementohet kontrata në zinxhir për testim. Mirëpo, ky metod testimi është problematik. Për ta bërë më të lehtë për zhvilluesit testimin e kontratave, biblioteka ontio_std ofron një modul mock për testim. Ky modul siguron simulimin e të dhënave në zinxhir, duke lehtësuar testimin njësi të metodave në kontratë. Shembuj konkretë mund të gjenden këtu.

Depurimi i kontratës

console::debug(msg) nxjerr informacionin e depurimit gjatë depurimit të kontratës. Informacioni msg do të regjistrohet në skedarin log të nodës. Kushti i domosdoshëm është të vendoset niveli i skedarit log në modalitetin e depurimit, kur është e aktivizuar nodi testues lokal i Ontology.

runtime::notify(msg) ekzekuton informacione për debug në kohën e debug-imit të kontratës. Këto metoda do të ruajë informacionin e dhënë në zinxhir dhe mund të kërkohet nga zinxhiri me metodën getSmartCodeEvent.

Artikulli është përkthyer nga redaksia Hashrate&Shares ekskluzivisht për OntologyRussia. klik

Jeni zhvillues? Bashkohuni me komunitetin tonë teknik në Discord. Për më tepër, shikoni në Qendrën e zhvilluesve në faqen tonë, ku mund të gjeni mjete zhvilluesi, dokumentacion dhe shumë më tepër.

Ontology

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster