Како да напишете паметен договор WebAssembly на мрежата Ontology? Дел 1: Рѓа

Како да напишете паметен договор WebAssembly на мрежата Ontology? Дел 1: Рѓа

Технологијата Ontology Wasm ги намалува трошоците за мигрирање на паметните договори dApp со сложена деловна логика во блокчејнот, а со тоа во голема мера го збогатува екосистемот dApp.

Сега Онтологија Wasm Истовремено го поддржува развојот на Rust и C++. Јазикот Rust подобро го поддржува Wasm, а генерираниот бајтекод е поедноставен, што дополнително може да ги намали трошоците за повици со договор. Значи, како да се користи Rust за да се развие договор на мрежата Ontology?

Развивање на WASM договор со Rust

Направете договор

на товар е добра алатка за креирање проекти и управување со пакети за развој на Rust, која им помага на програмерите подобро да ја организираат интеракцијата на кодот и библиотеките од трети страни. За да креирате нов договор за Ontology Wasm, едноставно извршете ја следнава команда:

Како да напишете паметен договор WebAssembly на мрежата Ontology? Дел 1: Рѓа

Структурата на проектот што ја генерира:

Како да напишете паметен договор WebAssembly на мрежата Ontology? Дел 1: Рѓа

Датотеката Cargo.toml се користи за поставување на основни информации за проектот и информации за зависна библиотека. Делот [lib] од датотеката мора да биде поставен на crate-type = ["cdylib"]. Датотеката lib.rs се користи за пишување на логичкиот код на договорот. Дополнително, треба да додадете параметри за зависност во делот [dependencies] од конфигурациската датотека Cargo.toml:

Како да напишете паметен договор WebAssembly на мрежата Ontology? Дел 1: Рѓа

Со оваа зависност, програмерите можат да повикаат интерфејси кои комуницираат со блокчејнот на Онтологија и алатки како што е параметарот за серијализација.

Функција за влез во договор

Секоја програма има влезна функција, како главната функција што обично ја гледаме, но договорот нема главна функција. Кога Wasm договор се развива со помош на Rust, стандардната функција за повикување се користи како влезна функција за користење на договорот. Името на функцијата во Rust ќе биде нејасно при составувањето на изворниот код на Rust во бајтекод што може да се изврши од виртуелна машина. За да се спречи компајлерот да генерира непотребен код и да ја намали големината на договорот, функцијата invoke ја додава прибелешката #[no_mangle].

Како функцијата повикување добива параметри за извршување на трансакција?

Библиотеката ontio_std обезбедува функција за извршување::input() за да ги добие параметрите за извршување на трансакцијата. Програмерите можат да користат ZeroCopySource за да ја десеријализираат добиената бајт низа. Во која првата низа од прочитани бајти е името на методот на повикување, проследено со параметрите на методот.

Како се враќа резултатот од извршувањето на договорот?

Функцијата за извршување::ret обезбедена од библиотеката ontio_std го враќа резултатот од извршувањето на методот.

Завршената функција за повикување изгледа вака:

Како да напишете паметен договор WebAssembly на мрежата Ontology? Дел 1: Рѓа

Сериозирање и десериализација на податоци за договорот

Во процесот на развивање договори, програмерите секогаш наидуваат на проблеми со серијализацијата и десериализацијата, конкретно со тоа како да складираат тип на податочен структура во базата на податоци и како да се десерилизира бајтната низа прочитана од базата на податоци за да се добие структурен тип на податоци.

Библиотеката ontio_std обезбедува интерфејси за декодер и енкодер за серијализација и десериализација на податоците. Полињата на структурата исто така ги имплементираат интерфејсите на декодерот и енкодерот, така што структурата може да се серијализира и десериизира. Потребни се примероци од класата Sink кога се серијализираат различни типови податоци. Примерок од класата Sink има поле од тип на сет што ги складира податоците од типот на бајт, а сите сериски податоци се складираат во buf.

За податоци со фиксна должина (на пр.: бајт, u16, u32, u64, итн.), податоците директно се претвораат во низа бајти и потоа се складираат во buf; за податоци со нефиксна должина, прво мора да се серијализира должината, а потоа Ddata (на пример, неозначени цели броеви со непозната големина, вклучувајќи u16, u32 или u64, итн.).

Десериализацијата е токму спротивното. За секој метод на серијализација, постои соодветен метод на десериализација. Десериализацијата бара употреба на инстанци од класата Source. Оваа класа пример има две полиња buf и pos. Buf се користи за складирање на податоците што треба да се десеријализираат, а pos се користи за складирање на моменталната позиција за читање. Кога се чита одреден тип на податоци, ако ја знаете неговата должина, можете директно да ги читате, за податоци со непозната должина - прво прочитајте ја должината, а потоа прочитајте ја содржината.

Пристапете и ажурирајте ги податоците во синџирот

онтологија-wasm-cdt-рѓа - инкапсулираше оперативен метод за работа со податоци во синџирот, што е погодно за програмерите да имплементираат операции како што се додавање, бришење, менување и барање податоци во синџирот на следниов начин:

  • база на податоци::get(клуч) - се користи за барање податоци од синџирот, а клучот бара имплементација на интерфејсот AsRef;
  • база на податоци::put(клуч, вредност) - се користи за складирање податоци на мрежата. Key бара имплементација на интерфејсот AsRef, а вредноста бара имплементација на интерфејсот на Encoder;
  • база на податоци::избриши(клуч) - се користи за отстранување на податоци од синџирот и клучот бара имплементација на интерфејсот AsRef.

Тестирање на договор

Кога се имплементираат методите на договорот, потребен ни е пристап до податоците на синџирот и потребна ни е соодветна виртуелна машина за извршување на бајтекодот на договорот, така што генерално е неопходно да се распореди договорот на синџирот за тестирање. Но, овој метод на тестирање е проблематичен. За да им олесни на програмерите да тестираат договори, библиотеката ontio_std обезбедува лажен модул за тестирање. Овој модул обезбедува симулација на податоците во колото, што им олеснува на програмерите да ги тестираат методите во договорот. Може да се најдат конкретни примери тука.

Дебагирање на договор

конзола::debug(msg) прикажува информации за отстранување грешки додека дебагира договор. Информациите за пораките ќе се додадат во датотеката за евиденција на јазолот. Предуслов е да го поставите нивото на датотеката за евиденција во режим за отстранување грешки кога работи локалниот јазол за тестирање на онтологијата.

runtime::notify(msg) ги дава соодветните информации за отстранување грешки додека договорот се дебагира. Овој метод ќе ги складира информациите внесени во синџирот и може да се побараат од ланецот користејќи го методот getSmartCodeEvent.

Написот беше преведен од уредниците на Hashrate&Shares специјално за OntologyRussia. плаче

Дали сте програмер? Придружете се на нашата технолошка заедница на Раздор. Исто така, погледнете го Центар за програмери на нашата веб-локација, каде што можете да најдете алатки за програмери, документација и многу повеќе.

Онтологија

Извор: www.habr.com

Додадете коментар