
Binabawasan ng teknolohiya ng Ontology Wasm ang gastos ng paglipat ng mga dApp smart contract na may kumplikadong lohika ng negosyo sa blockchain, sa gayon ay lubos na nagpapayaman sa dApp ecosystem.
Ngayon Sabay-sabay na sumusuporta sa Rust at C++ development. Ang Rust na wika ay sumusuporta sa Wasm nang mas mahusay, at ang nabuong bytecode ay mas simple, na maaaring higit pang mabawasan ang gastos ng mga tawag sa kontrata. Kaya, paano gamitin ang Rust para bumuo ng kontrata sa network ng Ontology?
Pagbuo ng isang Kontrata ng WASM sa Rust
Gumawa ng kontrata
ay isang mahusay na tool sa paggawa ng proyekto at pamamahala ng package para sa pagbuo ng Rust, na tumutulong sa mga developer na mas mahusay na ayusin ang pakikipag-ugnayan ng code at mga third-party na aklatan. Upang lumikha ng bagong kontrata sa Ontology Wasm, patakbuhin lang ang sumusunod na command:
![]()
Ang istraktura ng proyekto na nabuo nito:

Ang Cargo.toml file ay ginagamit upang i-set up ang pangunahing impormasyon ng proyekto at nakadependeng impormasyon sa library. Ang [lib] na seksyon ng file ay dapat na nakatakda sa crate-type = ["cdylib"]. Ang lib.rs file ay ginagamit para isulat ang contract logic code. Bilang karagdagan, kailangan mong magdagdag ng mga parameter ng dependency sa seksyong [dependencies] ng configuration file ng Cargo.toml:

Sa dependency na ito, maaaring tumawag ang mga developer ng mga interface na nakikipag-ugnayan sa Ontology blockchain at mga tool tulad ng serialization parameter.
Pag-andar ng pagpasok ng kontrata
Ang bawat programa ay may input function, tulad ng pangunahing function na karaniwan nating nakikita, ngunit ang kontrata ay walang pangunahing function. Kapag ang isang Wasm contract ay binuo gamit ang Rust, ang default na invoke function ay ginagamit bilang input function para magamit ang kontrata. Ang pangalan ng isang function sa Rust ay magiging malabo kapag kino-compile ang Rust source code sa bytecode na maaaring isagawa ng isang virtual machine. Para pigilan ang compiler sa pagbuo ng redundant code at bawasan ang laki ng kontrata, idinaragdag ng invoke function ang #[no_mangle] annotation.
Paano nakakakuha ng mga parameter ang invoke function para magsagawa ng transaksyon?
Ang ontio_std library ay nagbibigay ng runtime::input() function para makuha ang mga parameter para magsagawa ng transaksyon. Maaaring gamitin ng mga developer ang ZeroCopySource para i-deserialize ang resultang byte array. Kung saan ang unang hanay ng mga byte na nabasa ay ang pangalan ng paraan ng pag-invoke, na sinusundan ng mga parameter ng pamamaraan.
Paano ibinalik ang resulta ng pagpapatupad ng kontrata?
Ang runtime::ret function na ibinigay ng ontio_std library ay nagbabalik ng resulta ng isang method execution.
Ang nakumpletong invoke function ay ganito ang hitsura:

Pag-serialize at Deserializing Data ng Kontrata
Sa proseso ng pagbuo ng mga kontrata, palaging nagkakaproblema ang mga developer sa serialization at deserialization, partikular sa kung paano mag-imbak ng struct data type sa database at kung paano mag-deserialize ng byte array na nabasa mula sa database para makakuha ng struct data type.
Ang ontio_std library ay nagbibigay ng decoder at encoder interface para sa serialization at deserialization ng data. Ang mga field ng isang struct ay nagpapatupad din ng mga decoder at encoder na mga interface upang ang istraktura ay maaaring serialized at deserialized. Ang mga pagkakataon ng klase ng Sink ay kinakailangan kapag ang iba't ibang uri ng data ay na-serialize. Ang isang instance ng Sink class ay may set-type na field buf na nag-iimbak ng byte type na data, at lahat ng serialized na data ay naka-store sa buf.
Para sa fixed length data (hal: byte, u16, u32, u64, atbp.), ang data ay direktang kino-convert sa isang byte array at pagkatapos ay iniimbak sa buf; para sa data na hindi nakapirming haba, dapat munang i-serialize ang haba, pagkatapos ay ang Ddata (halimbawa, mga unsigned integer na hindi alam ang laki, kabilang ang u16, u32, o u64, atbp.).
Ang deserialization ay ang eksaktong kabaligtaran. Para sa bawat paraan ng serialization, mayroong katumbas na paraan ng deserialization. Ang deserialization ay nangangailangan ng paggamit ng mga instance ng Source class. Ang instance ng klase na ito ay may dalawang field na buf at pos. Ginagamit ang Buf upang iimbak ang data na i-deserialize at ang pos ay ginagamit upang iimbak ang kasalukuyang posisyon ng nabasa. Kapag ang isang partikular na uri ng data ay binabasa, kung alam mo ang haba nito, maaari mo itong basahin nang direkta, para sa data na hindi alam ang haba—basahin muna ang haba, pagkatapos ay basahin ang mga nilalaman.
I-access at i-update ang data sa chain
ontology-wasm-cdt-rust - nag-encapsulated ng isang operational na paraan para sa pagtatrabaho sa data sa chain, na maginhawa para sa mga developer na ipatupad ang mga operasyon tulad ng pagdaragdag, pagtanggal, pagbabago at pag-query ng data sa chain tulad ng sumusunod:
- database::get(key) - ay ginagamit upang humiling ng data mula sa chain, at hinihiling ng key ang pagpapatupad ng interface ng AsRef;
- database::put(key, value) - ginagamit upang mag-imbak ng data sa network. Hinihiling ng Key ang pagpapatupad ng interface ng AsRef, at hinihiling ng halaga ang pagpapatupad ng interface ng Encoder;
- database::delete(key) - ay ginagamit upang alisin ang data mula sa chain, at hinihiling ng key ang pagpapatupad ng interface ng AsRef.
Pagsubok sa kontrata
Kapag ang mga pamamaraan ng isang kontrata ay ipinatupad, kailangan namin ng access sa data sa chain at kailangan namin ng isang naaangkop na virtual machine upang maisagawa ang bytecode ng kontrata, kaya karaniwang kinakailangan na i-deploy ang kontrata sa chain para sa pagsubok. Ngunit ang pamamaraang ito ng pagsubok ay may problema. Upang gawing mas madali para sa mga developer na subukan ang mga kontrata, ang ontio_std library ay nagbibigay ng mock module para sa pagsubok. Ang module na ito ay nagbibigay ng simulation ng data sa circuit, na ginagawang mas madali para sa mga developer na i-unit test ang mga pamamaraan sa kontrata. Ang mga partikular na halimbawa ay matatagpuan .
Pag-debug ng Kontrata
console::debug(msg) ay nagpapakita ng impormasyon sa pag-debug habang nagde-debug ng isang kontrata. Ang impormasyon ng mensahe ay idaragdag sa node log file. Ang isang kinakailangan ay upang itakda ang antas ng log file sa debug mode kapag ang lokal na Ontology test node ay tumatakbo.
runtime::notify(msg) ay naglalabas ng naaangkop na impormasyon sa pag-debug habang ang kontrata ay na-debug. Ang pamamaraang ito ay mag-iimbak ng impormasyong ipinasok sa chain at maaaring i-query mula sa chain gamit ang getSmartCodeEvent method.
Ang artikulo ay isinalin ng mga editor ng Hashrate&Shares lalo na para sa OntologyRussia.
Ikaw ba ay isang developer? Sumali sa aming tech community sa . Gayundin, tingnan mo sa aming website, kung saan makakahanap ka ng mga tool ng developer, dokumentasyon, at higit pa.
Ontolohiya
- /
- Telegrama /
- /
Pinagmulan: www.habr.com
