Ontologiya tarmog'ida WebAssembly aqlli shartnomasini qanday yozish mumkin? 1-qism: zang

Ontologiya tarmog'ida WebAssembly aqlli shartnomasini qanday yozish mumkin? 1-qism: zang

Ontology Wasm texnologiyasi murakkab biznes mantiqiga ega bo'lgan dApp smart-kontraktlarini blokcheynga ko'chirish xarajatlarini kamaytiradi va shu bilan dApp ekotizimini sezilarli darajada boyitadi.

В настоящее время Ontologiya Wasm Bir vaqtning o'zida Rust va C++ ishlanmalarini qo'llab-quvvatlaydi. Rust tili Wasm-ni yaxshiroq qo'llab-quvvatlaydi va yaratilgan bayt-kod oddiyroq, bu esa shartnoma qo'ng'iroqlari narxini yanada kamaytirishi mumkin. Shunday qilib, Ontologiya tarmog'ida shartnomani ishlab chiqish uchun Rustdan qanday foydalanish kerak?

Rust bilan WASM shartnomasini ishlab chiqish

Shartnoma tuzing

yuk Rustni rivojlantirish uchun yaxshi loyiha yaratish va paketlarni boshqarish vositasi bo'lib, ishlab chiquvchilarga kod va uchinchi tomon kutubxonalarining o'zaro ta'sirini yaxshiroq tashkil etishga yordam beradi. Yangi Ontology Wasm shartnomasini yaratish uchun quyidagi buyruqni bajaring:

Ontologiya tarmog'ida WebAssembly aqlli shartnomasini qanday yozish mumkin? 1-qism: zang

U yaratadigan loyiha tuzilishi:

Ontologiya tarmog'ida WebAssembly aqlli shartnomasini qanday yozish mumkin? 1-qism: zang

Cargo.toml fayli asosiy loyiha ma'lumotlarini va bog'liq kutubxona ma'lumotlarini o'rnatish uchun ishlatiladi. Faylning [lib] bo'limi crate-type = ["cdylib"] ga o'rnatilishi kerak. Lib.rs fayli shartnoma mantiqiy kodini yozish uchun ishlatiladi. Bundan tashqari, Cargo.toml konfiguratsiya faylining [bog'liqlar] bo'limiga bog'liqlik parametrlarini qo'shishingiz kerak:

Ontologiya tarmog'ida WebAssembly aqlli shartnomasini qanday yozish mumkin? 1-qism: zang

Ushbu bog'liqlik bilan ishlab chiquvchilar Ontology blockchain va serializatsiya parametri kabi vositalar bilan o'zaro ta'sir qiluvchi interfeyslarni chaqirishlari mumkin.

Shartnomaga kirish funktsiyasi

Har bir dastur biz odatda ko'rib turgan asosiy funksiya kabi kiritish funksiyasiga ega, lekin shartnomada asosiy funksiya yo'q. Rust yordamida Wasm shartnomasi ishlab chiqilganda, standart chaqiruv funksiyasi shartnomadan foydalanish uchun kiritish funktsiyasi sifatida ishlatiladi. Rust-dagi funktsiyaning nomi Rust manba kodini virtual mashina tomonidan bajarilishi mumkin bo'lgan bayt-kodga kompilyatsiya qilishda noaniq bo'ladi. Kompilyatorning ortiqcha kod yaratishini oldini olish va shartnoma hajmini kamaytirish uchun chaqiruv funksiyasi #[no_mangle] izohini qo'shadi.

Invoke funksiyasi tranzaktsiyani bajarish uchun parametrlarni qanday oladi?

Ontio_std kutubxonasi tranzaktsiyani bajarish uchun parametrlarni olish uchun runtime::input() funksiyasini taqdim etadi. Ishlab chiquvchilar ZeroCopySource-dan natijada bayt massivini seriyadan chiqarish uchun foydalanishlari mumkin. Bunda o'qilgan baytlarning birinchi massivi chaqiruv usulining nomi, keyin esa usul parametrlari.

Shartnomani bajarish natijasi qanday qaytariladi?

Ontio_std kutubxonasi tomonidan taqdim etilgan runtime::ret funksiyasi usulning bajarilishi natijasini qaytaradi.

Tugallangan chaqiruv funktsiyasi quyidagicha ko'rinadi:

Ontologiya tarmog'ida WebAssembly aqlli shartnomasini qanday yozish mumkin? 1-qism: zang

Shartnoma ma'lumotlarini ketma-ketlashtirish va seriyadan chiqarish

Shartnomalarni ishlab chiqish jarayonida ishlab chiquvchilar har doim ketma-ketlashtirish va seriyasizlashtirish bilan bog'liq muammolarga duch kelishadi, xususan, ma'lumotlar bazasida strukturaviy ma'lumotlar turini qanday saqlash va strukturaviy ma'lumotlar turini olish uchun ma'lumotlar bazasidan o'qilgan bayt massivini seriyadan chiqarish.

Ontio_std kutubxonasi ma'lumotlarni ketma-ketlashtirish va seriyadan chiqarish uchun dekoder va kodlovchi interfeyslarni taqdim etadi. Strukturaning maydonlari dekoder va kodlovchi interfeyslarini ham amalga oshiradi, shunda strukturani ketma-ketlashtirish va seriyadan chiqarish mumkin. Turli ma'lumotlar turlari ketma-ketlashtirilganda Sink sinfining namunalari talab qilinadi. Sink klassining namunasi bayt tipidagi ma'lumotlarni saqlaydigan o'rnatilgan turdagi maydon bufiga ega va barcha ketma-ketlashtirilgan ma'lumotlar bufda saqlanadi.

Ruxsat etilgan uzunlikdagi ma'lumotlar uchun (masalan: bayt, u16, u32, u64 va boshqalar) ma'lumotlar to'g'ridan-to'g'ri bayt massiviga aylantiriladi va keyin bufda saqlanadi; aniq bo'lmagan uzunlikdagi ma'lumotlar uchun avval uzunlik, so'ngra Ddata seriyali bo'lishi kerak (masalan, noma'lum o'lchamdagi belgisiz butun sonlar, jumladan u16, u32 yoki u64 va boshqalar).

Deserializatsiya - bu mutlaqo teskari. Har bir ketma-ketlashtirish usuli uchun tegishli ketma-ketlikdan chiqarish usuli mavjud. Seriyadan chiqarish Source sinfining misollaridan foydalanishni talab qiladi. Bu sinf misolida ikkita buf va pos maydonlari mavjud. Buf seriyadan chiqariladigan ma'lumotlarni saqlash uchun ishlatiladi va pos joriy o'qish holatini saqlash uchun ishlatiladi. Muayyan turdagi ma'lumotlar o'qilayotganda, agar siz uning uzunligini bilsangiz, uni to'g'ridan-to'g'ri o'qishingiz mumkin, noma'lum uzunlikdagi ma'lumotlar uchun - avval uzunlikni o'qing, keyin tarkibini o'qing.

Zanjirdagi ma'lumotlarga kirish va yangilash

ontologiya-wasm-cdt-zang - zanjirdagi ma'lumotlar bilan ishlashning operativ usuli inkapsullangan bo'lib, ishlab chiquvchilar uchun zanjirdagi ma'lumotlarni qo'shish, o'chirish, o'zgartirish va so'rash kabi operatsiyalarni amalga oshirish uchun qulaydir:

  • ma'lumotlar bazasi :: get (kalit) - zanjirdan ma'lumotlarni so'rash uchun ishlatiladi va kalit AsRef interfeysini amalga oshirishni so'raydi;
  • ma'lumotlar bazasi ::put (kalit, qiymat) - tarmoqdagi ma'lumotlarni saqlash uchun ishlatiladi. Kalit AsRef interfeysini amalga oshirishni so'raydi va qiymat Encoder interfeysini amalga oshirishni so'raydi;
  • ma'lumotlar bazasi :: o'chirish (kalit) - zanjirdan ma'lumotlarni olib tashlash uchun ishlatiladi va kalit AsRef interfeysini amalga oshirishni so'raydi.

Shartnoma sinovi

Shartnoma usullari amalga oshirilganda, biz zanjirdagi ma'lumotlarga kirishimiz kerak va shartnomaning bayt kodini bajarish uchun tegishli virtual mashinaga muhtojmiz, shuning uchun odatda sinov uchun shartnomani zanjirga joylashtirish kerak. Ammo bu sinov usuli muammoli. Ishlab chiquvchilarga shartnomalarni sinab ko'rishni osonlashtirish uchun ontio_std kutubxonasi sinov uchun soxta modulni taqdim etadi. Ushbu modul sxemadagi ma'lumotlarning simulyatsiyasini ta'minlaydi, bu esa ishlab chiquvchilarga shartnomada ko'rsatilgan usullarni sinovdan o'tkazishni osonlashtiradi. Muayyan misollarni topish mumkin shu yerda.

Shartnomani tuzatish

console::debug(msg) shartnomani tuzatish paytida disk raskadrovka ma'lumotlarini ko'rsatadi. Xabar ma'lumotlari tugun jurnali fayliga qo'shiladi. Mahalliy Ontologiya test tuguni ishlayotganda jurnal fayli darajasini disk raskadrovka rejimiga o'rnatish zaruriy shartdir.

ish vaqti::notify(msg) shartnoma tuzatilayotganda tegishli disk raskadrovka ma'lumotlarini chiqaradi. Ushbu usul zanjirga kiritilgan ma'lumotlarni saqlaydi va getSmartCodeEvent usuli yordamida zanjirdan so'rash mumkin.

Maqola Hashrate&Shares muharrirlari tomonidan ayniqsa OntologyRussia uchun tarjima qilingan. yig'lamoq

Siz dasturchimisiz? Bizning texnologik hamjamiyatimizga qo'shiling Tanqid. Bundan tashqari, ko'rib chiqing Dasturchilar markazi veb-saytimizda ishlab chiquvchi vositalari, hujjatlar va boshqalarni topishingiz mumkin.

Ontologiya

Manba: www.habr.com

a Izoh qo'shish