Як напісаць смарт кантракт на WebAssembly у сетцы Ontology? Частка 1: Rust

Як напісаць смарт кантракт на WebAssembly у сетцы Ontology? Частка 1: Rust

Тэхналогія Ontology Wasm зніжае кошт пераносу смарт кантрактаў dApp са складанай бізнес-логікай на блокчейн, тым самым значна ўзбагачаючы dApp экасістэму.

У цяперашні час Ontology Wasm адначасова падтрымлівае распрацоўку як на мове Rust, так і на мове C++. Мова Rust лепш падтрымлівае Wasm, а згенераваны байт-код прасцей, што можа яшчэ больш зменшыць кошт кантрактных выклікаў. Такім чынам, як выкарыстоўваць Rust для распрацоўкі кантракту ў сетцы Ontology?

Распрацоўка WASM - кантракту з дапамогай Rust

Стварэнне кантракта

грузавы — гэта добрая прылада стварэння праектаў і кіраванні пакетамі пры распрацоўцы праграм на Rust, які дапамагае распрацоўнікам лепш арганізоўваць узаемадзеянне кода і іншых бібліятэк. Каб стварыць новы Ontology Wasm- кантракт, проста выканайце наступную каманду:

Як напісаць смарт кантракт на WebAssembly у сетцы Ontology? Частка 1: Rust

Структура праекту, якую яна генеруе:

Як напісаць смарт кантракт на WebAssembly у сетцы Ontology? Частка 1: Rust

Файл Cargo.toml выкарыстоўваецца для настройкі базавай інфармацыі праекта і інфармацыі залежнай бібліятэкі. Секцыя [lib] у файле павінна быць усталяванай у значэнне crate-type = ["cdylib"]. Файл lib.rs выкарыстоўваецца для напісання кода логікі кантракта. У дадатак, Вам неабходна дадаць параметры залежнасцяў у падзел [dependencies] файла канфігурацыі Cargo.toml:

Як напісаць смарт кантракт на WebAssembly у сетцы Ontology? Частка 1: Rust

З дапамогай гэтай залежнасці распрацоўнікі могуць выклікаць інтэрфейсы, якія ўзаемадзейнічаюць з блокчейном Ontology, і прылады такія, як параметр серыялізацыі.

Функцыя ўводу кантракту

Кожная праграма мае функцыю ўводу, як напрыклад main-функцыя, якую мы звычайна бачым, але ў кантракту няма main-функцыі. Калі распрацоўваецца Wasm- кантракт з выкарыстаннем Rust, то функцыя invoke па змаўчанні выкарыстоўваецца як функцыя ўводу для выкарыстання кантракту. Імя функцыі ў Rust будзе незразумелым пры кампіляцыі зыходнага кода Rust у байт-код, які можа выконваць віртуальная машына. Каб папярэдзіць кампілятар ад генеравання залішняга кода і скараціць памер кантракту, функцыя invoke дадае анатацыю #[no_mangle].

Як функцыя invoke атрымлівае параметры для выканання транзакцыі?

Бібліятэка ontio_std дае функцыю runtime :: input (), каб атрымаць параметры для выканання транзакцыі. Распрацоўнікі могуць выкарыстоўваць ZeroCopySource для дэсерыялізацыі атрыманага масіва байтаў. У якім першы лічаны масіў байтаў-гэта імя invoke-метаду, далей параметры метаду.

Як вяртаецца вынік выканання кантракта?

Функцыя runtime::ret, якая падаецца бібліятэкай ontio_std, вяртае вынік выканання метаду.

Скончаная invoke- функцыя выглядае наступным чынам:

Як напісаць смарт кантракт на WebAssembly у сетцы Ontology? Частка 1: Rust

Серыялізацыя і дэсерыялізацыя даных кантракта

У працэсе распрацоўкі кантрактаў распрацоўшчыкі заўсёды натыкаюцца на праблемы серыялізацыі і дэсерыялізацыі, а менавіта з тым, як захаваць struct- тып дадзеных у базу дадзеных і як масіў байтаў, лічаны з базы дадзеных, дэсерыялізаваць, каб атрымаць struct- тып дадзеных.

Бібліятэка ontio_std дае інтэрфейсы дэкодэра і кодэра для серыялізацыі і дэсерыялізацыі дадзеных. Палі структуры struct таксама рэалізуюць інтэрфейсы дэкодэра і кодэра, так што структура можа быць серыялізаваная і дэсерыялізаваная. Асобнікі класа Sink неабходныя, калі серыялізуюцца розныя тыпы дадзеных. Асобнік класа Sink мае set- тып поле buf, якое захоўвае байт тып дадзеныя, а ўсе серыялізаваныя дадзеныя захоўваюцца ў buf.

Для дадзеных з фіксаванай даўжынёй (да прыкладу: byte, U16, U32, U64 і г.д.) дадзеныя непасрэдна пераўтворацца ў масіў байтаў і затым захоўваюцца ў buf; для дадзеных нефіксаванай даўжыні спачатку трэба серыялізаваць даўжыню, а затым Ddata (напрыклад цэлыя лікі без знака невядомага памеру, уключаючы u16, u32 ці u64 і т. д.).

Дэсерыялізацыя з'яўляецца прамой супрацьлегласцю. Для кожнага метаду серыялізацыі ёсць адпаведны метад дэсерыялізацыі. Дэсерыялізацыя патрабуе выкарыстання асобнікаў класа Source. Гэты асобнік класа мае два палі buf і pos. Buf выкарыстоўваецца для захоўвання дадзеных, якія будуць дэсерыялізаваная, а pos выкарыстоўваецца, каб захоўваць бягучую пазіцыю счытвання. Калі счытваецца канкрэтны тып дадзеных, калі вы ведаеце іх даўжыню, вы можаце счытваць іх напрамую, для дадзеных невядомай даўжыні - спачатку лічыце даўжыню, а затым лічыце змесціва.

Доступ і абнаўленне дадзеных у ланцужку

Ontology-wasm-cdt-rust - інкапсуляваў аперацыйны метад працы з дадзенымі ў ланцугі, які зручны для распрацоўнікаў, каб рэалізоўваць аперацыі такія, як даданне, выдаленне, змена і запытванне дадзеных у ланцугі наступным чынам:

  • database::get(key) - выкарыстоўваецца, каб запытаць дадзеныя з ланцуга, а key запытвае рэалізацыю інтэрфейсу AsRef;
  • database::put(key, value) - Выкарыстоўваецца, каб захоўваць дадзеныя ў сеткі. Key запытвае выкананне інтэрфейсу AsRef, а value запытвае рэалізацыю інтэрфейсу Encoder;
  • database::delete(key) - Выкарыстоўваецца, каб выдаліць дадзеныя з ланцужка, а key запытвае рэалізацыю інтэрфейсу AsRef.

Тэставанне кантракта

Калі рэалізуюцца метады кантракта нам патрэбен доступ да дадзеных у ланцугі і нам патрэбна адпаведная віртуальная машына, каб выканаць байткод кантракту, таму як правіла неабходна разгарнуць кантракт у ланцугі для тэставання. Але такі метад тэсціравання праблематычны. Каб зрабіць лягчэй для распрацоўшчыкаў тэсціраванне кантрактаў, бібліятэка ontio_std дае mock- модуль для тэсціравання. Дадзены модуль забяспечвае сімуляцыю дадзеных у ланцугі, робячы лягчэй для распрацоўшчыкаў юніт-тэсціраванне метадаў у кантракце. Канкрэтныя прыклады могуць быць знойдзены тут.

Адладка кантракту

console::debug(msg) выводзіць адладкавую інфармацыю падчас адладкі кантракту. Інфармацыя msg будзе занесеная ў лог- файл ноды. Абавязковай умовай з'яўляецца ўстаноўка ўзроўню лог-файла ў рэжым адладкі, калі запушчана лакальная тэст-нода Ontology.

runtime::notify(msg) выводзіць адпаведную адладкавую інфармацыю падчас адладкі кантракту. Гэты метад будзе захоўваць унесеную інфармацыю ў ланцуг і можа быць запытаны з ланцуга з дапамогай метаду getSmartCodeEvent.

Артыкул быў перакладзены рэдакцыяй Hashrate&Shares спецыяльна для OntologyRussia. клік

Вы распрацоўшчык? Далучайцеся да нашай тэхнічнай супольнасці на дысананс. Акрамя таго, зазірніце ў Цэнтр распрацоўшчыкаў на нашым сайце, там вы можаце знайсці інструменты распрацоўшчыка, дакументацыю і многае іншае.

Ontology

Крыніца: habr.com

Дадаць каментар