Ontology желісінде WebAssembly смарт келісімшартын қалай жазуға болады? 1-бөлім: Тот

Ontology желісінде WebAssembly смарт келісімшартын қалай жазуға болады? 1-бөлім: Тот

Ontology Wasm технологиясы күрделі бизнес логикасы бар dApp смарт келісімшарттарын блокчейнге көшіру құнын төмендетеді, осылайша dApp экожүйесін айтарлықтай байытады.

В настоящее время Онтология Васм Бір уақытта Rust және C++ дамуын қолдайды. Rust тілі Wasm тілін жақсырақ қолдайды, ал жасалған байт-код қарапайым, бұл келісімшарттық қоңыраулардың құнын одан әрі төмендетуі мүмкін. Сонымен, Ontology желісінде келісім-шартты әзірлеу үшін Rust қалай пайдалануға болады?

Rust компаниясымен WASM келісімшартын жасау

Келісімшарт жасаңыз

жүк әзірлеушілерге код пен үшінші тарап кітапханаларының өзара әрекеттесуін жақсырақ ұйымдастыруға көмектесетін Rust әзірлеуге арналған жақсы жобаны жасау және пакетті басқару құралы болып табылады. Жаңа Ontology Wasm келісімшартын жасау үшін жай ғана келесі пәрменді орындаңыз:

Ontology желісінде WebAssembly смарт келісімшартын қалай жазуға болады? 1-бөлім: Тот

Ол жасайтын жоба құрылымы:

Ontology желісінде WebAssembly смарт келісімшартын қалай жазуға болады? 1-бөлім: Тот

Cargo.toml файлы жобаның негізгі ақпаратын және тәуелді кітапхана ақпаратын орнату үшін пайдаланылады. Файлдың [lib] бөлімі crate-type = ["cdylib"] күйіне орнатылуы керек. lib.rs файлы шарттың логикалық кодын жазу үшін пайдаланылады. Бұған қоса, Cargo.toml конфигурация файлының [тәуелділіктер] бөліміне тәуелділік параметрлерін қосу керек:

Ontology желісінде WebAssembly смарт келісімшартын қалай жазуға болады? 1-бөлім: Тот

Бұл тәуелділікпен әзірлеушілер Ontology блокчейнімен және сериялау параметрі сияқты құралдармен әрекеттесетін интерфейстерді шақыра алады.

Келісімшартты енгізу функциясы

Әрбір бағдарламада біз әдетте көретін негізгі функция сияқты енгізу функциясы бар, бірақ келісімшартта негізгі функция жоқ. Wasm келісім-шарты Rust көмегімен жасалған кезде, келісім-шартты пайдалану үшін енгізу функциясы ретінде әдепкі шақыру функциясы пайдаланылады. Rust бастапқы кодын виртуалды машинамен орындалатын байт кодқа құрастыру кезінде Rust ішіндегі функцияның атауы түсініксіз болады. Компилятордың артық кодты жасауына жол бермеу және келісім-шарт өлшемін азайту үшін шақыру функциясы #[no_mangle] аннотациясын қосады.

Шақыру функциясы транзакцияны орындау үшін параметрлерді қалай алады?

ontio_std кітапханасы транзакцияны орындау үшін параметрлерді алу үшін орындау уақыты::input() функциясын қамтамасыз етеді. Әзірлеушілер алынған байт массивін сериядан шығару үшін ZeroCopySource пайдалана алады. Мұнда оқылатын байттардың бірінші массиві шақыру әдісінің атауы, одан кейін әдіс параметрлері болады.

Келісімшартты орындау нәтижесі қалай қайтарылады?

ontio_std кітапханасы қамтамасыз ететін runtime::ret функциясы әдісті орындау нәтижесін қайтарады.

Аяқталған шақыру функциясы келесідей көрінеді:

Ontology желісінде WebAssembly смарт келісімшартын қалай жазуға болады? 1-бөлім: Тот

Келісімшарт деректерін сериялау және сериядан шығару

Келісімшарттарды әзірлеу процесінде әзірлеушілер әрқашан сериалдау және сериядан шығару мәселелерімен, атап айтқанда, дерекқорда құрылымдық деректер түрін сақтау және құрылымдық деректер түрін алу үшін дерекқордан оқылған байт массивін сериядан шығару жолымен қиындықтарға тап болады.

ontio_std кітапханасы деректерді сериялау және сериядан шығару үшін декодер және кодтау интерфейстерін қамтамасыз етеді. Құрылымның өрістері дешифратор және кодтаушы интерфейстерін де жүзеге асырады, осылайша құрылымды сериялауға және сериядан шығаруға болады. Әртүрлі деректер түрлері серияланған кезде Sink класының даналары қажет. Sink сыныбының данасында байт түрінің деректерін сақтайтын жиын типті өріс буфі бар және барлық серияланған деректер буф ішінде сақталады.

Тұрақты ұзындықтағы деректер үшін (мысалы: байт, u16, u32, u64 және т.б.) деректер байт массивіне тікелей түрлендіріліп, содан кейін буфта сақталады; тұрақты емес ұзындықтағы деректер үшін ұзындықты алдымен сериялау керек, содан кейін Ddata (мысалы, белгісіз өлшемдегі таңбасыз бүтін сандар, соның ішінде u16, u32 немесе u64 және т.б.).

Сериясыздандыру - бұл мүлдем керісінше. Әрбір сериялау әдісі үшін сәйкес сериядан шығару әдісі бар. Сериясыздандыру Source класының даналарын пайдалануды талап етеді. Бұл класс данасында buf және pos екі өрісі бар. Buf сериядан шығарылатын деректерді сақтау үшін, ал pos ағымдағы оқу орнын сақтау үшін пайдаланылады. Деректердің белгілі бір түрі оқылып жатқанда, оның ұзындығын білсеңіз, оны тікелей оқуға болады, белгісіз ұзындықтағы деректер үшін — алдымен ұзындықты оқыңыз, содан кейін мазмұнын оқыңыз.

Тізбектегі деректерге қол жеткізіңіз және жаңартыңыз

онтология-wasm-cdt-rust - тізбектегі деректермен жұмыс істеудің операциялық әдісі инкапсуляцияланған, бұл әзірлеушілерге тізбектегі деректерді қосу, жою, өзгерту және сұрау сияқты операцияларды орындауға ыңғайлы:

  • дерекқор ::get(кілт) - тізбектен мәліметтерді сұрау үшін қолданылады, ал кілт AsRef интерфейсін жүзеге асыруды сұрайды;
  • дерекқор ::put(кілт, мән) - желіде деректерді сақтау үшін қолданылады. Кілт AsRef интерфейсін іске асыруды сұрайды, ал мән Encoder интерфейсін енгізуді сұрайды;
  • дерекқор :: жою (кілт) - тізбектен деректерді жою үшін пайдаланылады және кілт AsRef интерфейсін жүзеге асыруды сұрайды.

Келісімшарттық тестілеу

Келісім-шарттың әдістері іске асырылған кезде, бізге тізбектегі деректерге қол жеткізу қажет және келісімшарттың байт кодын орындау үшін сәйкес виртуалды машина қажет, сондықтан әдетте сынақ үшін келісімшартты тізбекте орналастыру қажет. Бірақ бұл тестілеу әдісі проблемалы болып табылады. Әзірлеушілерге келісім-шарттарды тексеруді жеңілдету үшін ontio_std кітапханасы тестілеуге арналған жалған модульді ұсынады. Бұл модуль схемадағы деректерді модельдеуді қамтамасыз етеді, бұл әзірлеушілерге келісім-шарттағы әдістерді бірлік сынауды жеңілдетеді. Нақты мысалдарды табуға болады осында.

Келісімшартты жөндеу

console::debug(msg) келісім-шартты жөндеу кезінде жөндеу туралы ақпаратты көрсетеді. Хабарлама ақпараты түйін журналының файлына қосылады. Жергілікті Ontology сынақ түйіні іске қосылған кезде журнал файлының деңгейін жөндеу режиміне орнату міндетті шарт болып табылады.

орындалу уақыты::notify(msg) келісім-шарт түзетіліп жатқанда тиісті жөндеу ақпаратын шығарады. Бұл әдіс тізбекке енгізілген ақпаратты сақтайды және getSmartCodeEvent әдісі арқылы тізбектен сұрауға болады.

Мақаланы Hashrate&Shares редакторлары әсіресе OntologyRussia үшін аударған. нұқыңыз

Сіз әзірлеушісіз бе? Біздің технологиялық қауымдастыққа қосылыңыз Арасындағы айырмашылық. Сондай-ақ, қараңыз Әзірлеушілер орталығы әзірлеуші ​​құралдарын, құжаттаманы және т.б. таба алатын веб-сайтымызда.

Онтология

Ақпарат көзі: www.habr.com

пікір қалдыру