Si të shkruani një kontratë inteligjente WebAssembly në rrjetin Ontology? Pjesa 1: Ndryshk

Si të shkruani një kontratë inteligjente WebAssembly në rrjetin Ontology? Pjesa 1: Ndryshk

Teknologjia Ontology Wasm zvogëlon koston e migrimit të kontratave inteligjente dApp me logjikë komplekse biznesi në blockchain, duke pasuruar kështu shumë ekosistemin dApp.

Tani Ontologjia Wasm Njëkohësisht mbështet zhvillimin e Rust dhe C++. Gjuha Rust mbështet Wasm më mirë dhe bytekodi i krijuar është më i thjeshtë, gjë që mund të ulë më tej koston e thirrjeve me kontratë. Kështu që, si të përdorim Rust për të zhvilluar një kontratë në rrjetin Ontology?

Zhvillimi i një kontrate WASM me Rust

Krijo një kontratë

ngarkesë është një mjet i mirë për krijimin e projektit dhe menaxhimin e paketave për zhvillimin e Rust, i cili ndihmon zhvilluesit të organizojnë më mirë ndërveprimin e kodit dhe bibliotekave të palëve të treta. Për të krijuar një kontratë të re Ontology Wasm, thjesht ekzekutoni komandën e mëposhtme:

Si të shkruani një kontratë inteligjente WebAssembly në rrjetin Ontology? Pjesa 1: Ndryshk

Struktura e projektit që gjeneron:

Si të shkruani një kontratë inteligjente WebAssembly në rrjetin Ontology? Pjesa 1: Ndryshk

Skedari Cargo.toml përdoret për të vendosur informacionin bazë të projektit dhe informacionin e varur të bibliotekës. Seksioni [lib] i skedarit duhet të vendoset në crate-type = ["cdylib"]. Skedari lib.rs përdoret për të shkruar kodin logjik të kontratës. Përveç kësaj, ju duhet të shtoni parametrat e varësisë në seksionin [varësitë] të skedarit të konfigurimit Cargo.toml:

Si të shkruani një kontratë inteligjente WebAssembly në rrjetin Ontology? Pjesa 1: Ndryshk

Me këtë varësi, zhvilluesit mund të thërrasin ndërfaqe që ndërveprojnë me zinxhirin e bllokut Ontology dhe mjete të tilla si parametri i serializimit.

Funksioni i hyrjes në kontratë

Çdo program ka një funksion hyrës, si funksioni kryesor që shohim zakonisht, por kontrata nuk ka një funksion kryesor. Kur një kontratë Wasm zhvillohet duke përdorur Rust, funksioni i parazgjedhur i thirrjes përdoret si funksion hyrës për të përdorur kontratën. Emri i një funksioni në Rust do të jetë i paqartë kur përpiloni kodin burimor Rust në bytecode që mund të ekzekutohet nga një makinë virtuale. Për të parandaluar që përpiluesi të gjenerojë kod të tepërt dhe për të zvogëluar madhësinë e kontratës, funksioni i thirrjes shton shënimin #[no_mangle].

Si i merr parametrat funksioni i thirrjes për të ekzekutuar një transaksion?

Biblioteka ontio_std ofron një funksion runtime::input() për të marrë parametrat për të ekzekutuar një transaksion. Zhvilluesit mund të përdorin ZeroCopySource për të deserializuar grupin e bajtit që rezulton. Në të cilin grupi i parë i bajtëve të lexuar është emri i metodës së thirrjes, e ndjekur nga 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ë një metode.

Funksioni i plotësuar i thirrjes duket si ky:

Si të shkruani një kontratë inteligjente WebAssembly në rrjetin Ontology? Pjesa 1: Ndryshk

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

Në procesin e zhvillimit të kontratave, zhvilluesit gjithmonë hasin në probleme me serializimin dhe deserializimin, veçanërisht me mënyrën se si të ruajnë një lloj të dhënash strukture në bazën e të dhënave dhe si të deserializojnë një grup bajt të lexuar nga baza e të dhënave për të marrë një lloj të dhënash strukture.

Biblioteka ontio_std ofron ndërfaqe dekoderi dhe koduesi për serializimin dhe deserializimin e të dhënave. Fushat e një strukture zbatojnë gjithashtu ndërfaqet e dekoderit dhe koduesit në mënyrë që struktura të mund të serializohet dhe deserializohet. Instancat e klasës Sink kërkohen kur lloje të ndryshme të dhënash serializohen. Një shembull i klasës Sink ka një fushë buf të tipit set që ruan të dhënat e llojit të bajtit dhe të gjitha të dhënat e serializuara 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ë grup bajtësh dhe më pas ruhen në buf; për të dhënat me gjatësi jo fikse, së pari duhet të serializohet gjatësia, pastaj Ddata (për shembull, numra të plotë të panënshkruar me madhësi të panjohur, duke përfshirë u16, u32 ose u64, etj.).

Deserializimi është pikërisht e kundërta. Për çdo metodë serializimi, ekziston një metodë përkatëse deserializimi. Deserializimi kërkon përdorimin e instancave të klasës Source. Ky shembull i klasës ka dy fusha buf dhe pos. Buf përdoret për të ruajtur të dhënat që do të deserializohen dhe pos përdoret për të ruajtur pozicionin aktual të leximit. Kur lexohet një lloj i caktuar i të dhënave, nëse e dini gjatësinë e tij, mund ta lexoni drejtpërdrejt, për të dhëna me gjatësi të panjohur—lexoni së pari gjatësinë, pastaj lexoni përmbajtjen.

Aksesoni dhe përditësoni të dhënat në zinxhir

ontologji-wasm-cdt-ndryshk - përmbledh një metodë operacionale për të punuar me të dhënat në zinxhir, e cila është e përshtatshme për zhvilluesit për të zbatuar operacione të tilla si shtimi, fshirja, ndryshimi dhe kërkimi i të dhënave në zinxhir si më poshtë:

  • baza e të dhënave:: marrë (çelës) - përdoret për të kërkuar të dhëna nga zinxhiri, dhe çelësi kërkon zbatimin e ndërfaqes AsRef;
  • baza e të dhënave::put (çelës, vlerë) - përdoret për të ruajtur të dhënat në rrjet. Key kërkon zbatimin e ndërfaqes AsRef dhe vlera kërkon zbatimin e ndërfaqes Encoder;
  • baza e të dhënave::delete(çelës) - përdoret për të hequr të dhënat nga zinxhiri dhe çelësi kërkon zbatimin e ndërfaqes AsRef.

Testimi i kontratës

Kur zbatohen metodat e një kontrate, ne kemi nevojë për akses në të dhënat në zinxhir dhe na duhet një makinë virtuale e përshtatshme për të ekzekutuar bajtkodin e kontratës, kështu që përgjithësisht është e nevojshme të vendoset kontrata në zinxhir për testim. Por kjo metodë e testimit është problematike. Për ta bërë më të lehtë për zhvilluesit testimin e kontratave, biblioteka ontio_std ofron një modul model për testim. Ky modul ofron një simulim të të dhënave në qark, duke e bërë më të lehtë për zhvilluesit që të testojnë njësi metodat në kontratë. Mund të gjenden shembuj specifikë këtu.

Korrigjimi i kontratës

tastiera::debug(msg) shfaq informacionin e korrigjimit gjatë korrigjimit të një kontrate. Informacioni i mesazheve do të shtohet në skedarin e regjistrit të nyjeve. Një parakusht është të vendosni nivelin e skedarit të regjistrit në modalitetin e korrigjimit kur funksionon nyja lokale e testimit të Ontologjisë.

Runtime::notify(msg) nxjerr informacionin e duhur të korrigjimit ndërsa kontrata është duke u korrigjuar. Kjo metodë do të ruajë informacionin e futur në zinxhir dhe mund të kërkohet nga zinxhiri duke përdorur metodën getSmartCodeEvent.

Artikulli u përkthye nga redaktorët e Hashrate&Shares posaçërisht për OntologyRussia. qaj

A jeni një zhvillues? Bashkohuni me komunitetin tonë të teknologjisë në Mosmarrëveshje. Gjithashtu, hidhini një sy Qendra e Zhvilluesve në faqen tonë të internetit, ku mund të gjeni mjete zhvilluesish, dokumentacion dhe më shumë.

ontologji

Burimi: www.habr.com

Shto një koment