Ontology şəbəkəsində WebAssembly smart müqaviləsini necə yazmaq olar? 1-ci hissə: Pas

Ontology şəbəkəsində WebAssembly smart müqaviləsini necə yazmaq olar? 1-ci hissə: Pas

Ontology Wasm texnologiyası mürəkkəb biznes məntiqi ilə dApp smart müqavilələrinin blokçeynə köçürülməsi xərclərini azaldır və bununla da dApp ekosistemini xeyli zənginləşdirir.

Indi Ontologiya Wasm Eyni zamanda həm Rust, həm də C++ inkişafını dəstəkləyir. Rust dili Wasm-ı daha yaxşı dəstəkləyir və yaradılan bayt kodu daha sadədir, bu da müqavilə zənglərinin qiymətini daha da azalda bilər. Belə ki, Ontologiya şəbəkəsində müqavilə hazırlamaq üçün Rustdan necə istifadə etmək olar?

Rust ilə WASM Müqaviləsinin hazırlanması

Müqavilə yaradın

Yük Rust inkişafı üçün yaxşı layihənin yaradılması və paketin idarə edilməsi vasitəsidir ki, bu da tərtibatçılara kod və üçüncü tərəf kitabxanalarının qarşılıqlı əlaqəsini daha yaxşı təşkil etməyə kömək edir. Yeni Ontology Wasm müqaviləsi yaratmaq üçün aşağıdakı əmri yerinə yetirmək kifayətdir:

Ontology şəbəkəsində WebAssembly smart müqaviləsini necə yazmaq olar? 1-ci hissə: Pas

Onun yaratdığı layihə strukturu:

Ontology şəbəkəsində WebAssembly smart müqaviləsini necə yazmaq olar? 1-ci hissə: Pas

Cargo.toml faylı əsas layihə məlumatlarını və asılı kitabxana məlumatlarını qurmaq üçün istifadə olunur. Faylın [lib] bölməsi crate-type = ["cdylib"] olaraq təyin edilməlidir. lib.rs faylı müqavilənin məntiq kodunu yazmaq üçün istifadə olunur. Bundan əlavə, Cargo.toml konfiqurasiya faylının [asılılıqlar] bölməsinə asılılıq parametrləri əlavə etməlisiniz:

Ontology şəbəkəsində WebAssembly smart müqaviləsini necə yazmaq olar? 1-ci hissə: Pas

Bu asılılıq ilə tərtibatçılar Ontology blockchain ilə qarşılıqlı əlaqədə olan interfeyslərə və seriallaşdırma parametri kimi alətlərə zəng edə bilərlər.

Müqaviləyə giriş funksiyası

Hər bir proqramın adətən gördüyümüz əsas funksiya kimi bir giriş funksiyası var, lakin müqavilənin əsas funksiyası yoxdur. Rust istifadə edərək Wasm müqaviləsi hazırlandıqda, müqavilədən istifadə etmək üçün giriş funksiyası kimi standart çağırış funksiyası istifadə olunur. Rust mənbə kodunu virtual maşın tərəfindən icra oluna bilən baytkoda tərtib edərkən Rust-dakı funksiyanın adı qeyri-müəyyən olacaq. Kompilyatorun lazımsız kod yaratmasının qarşısını almaq və müqavilənin ölçüsünü azaltmaq üçün invoke funksiyası #[no_mangle] annotasiyasını əlavə edir.

İnvoke funksiyası əməliyyatı yerinə yetirmək üçün parametrləri necə əldə edir?

Ontio_std kitabxanası əməliyyatın icrası üçün parametrləri əldə etmək üçün runtime::input() funksiyasını təmin edir. Tərtibatçılar yaranan bayt massivini sıradan çıxarmaq üçün ZeroCopySource-dan istifadə edə bilərlər. Burada oxunan baytların ilk massivi çağırış metodunun adı, sonra isə metod parametrləridir.

Müqavilənin icrasının nəticəsi necə qaytarılır?

Ontio_std kitabxanası tərəfindən təmin edilən runtime::ret funksiyası metodun icrasının nəticəsini qaytarır.

Tamamlanmış çağırış funksiyası belə görünür:

Ontology şəbəkəsində WebAssembly smart müqaviləsini necə yazmaq olar? 1-ci hissə: Pas

Müqavilə məlumatlarının seriyalaşdırılması və sıradan çıxarılması

Müqavilələrin işlənib hazırlanması prosesində tərtibatçılar həmişə seriallaşdırma və sıradan çıxarma, xüsusən də struktur məlumat növünün verilənlər bazasında saxlanması və struktur məlumat tipini əldə etmək üçün verilənlər bazasından oxunan bayt massivinin seriyadan çıxarılması ilə bağlı problemlərlə üzləşirlər.

Ontio_std kitabxanası verilənlərin seriyalaşdırılması və seriyadan çıxarılması üçün dekoder və kodlayıcı interfeysləri təmin edir. Strukturun sahələri, həmçinin dekoder və kodlayıcı interfeyslərini həyata keçirir ki, struktur seriallaşdırıla və seriyasızlaşdırıla bilsin. Sink sinfinin nümunələri müxtəlif məlumat növləri seriallaşdırıldıqda tələb olunur. Sink sinfinin nümunəsində bayt tipli məlumatları saxlayan dəst tipli sahə buf var və bütün seriallaşdırılmış məlumatlar bufda saxlanılır.

Sabit uzunluqlu verilənlər üçün (məsələn: bayt, u16, u32, u64 və s.) verilənlər birbaşa bayt massivinə çevrilir və sonra buf-da saxlanılır; sabit olmayan uzunluqlu verilənlər üçün əvvəlcə uzunluq, sonra Ddata seriyalaşdırılmalıdır (məsələn, naməlum ölçülü işarəsiz tam ədədlər, o cümlədən u16, u32 və ya u64 və s.).

Deserializasiya tam əksidir. Hər bir serializasiya metodu üçün müvafiq sıradan çıxarma üsulu mövcuddur. Deserializasiya Mənbə sinfinin nümunələrindən istifadəni tələb edir. Bu sinif nümunəsinin iki buf və pos sahəsi var. Buf seriyadan çıxarılacaq məlumatları saxlamaq üçün, pos isə cari oxunma mövqeyini saxlamaq üçün istifadə olunur. Müəyyən bir növ məlumat oxunarkən, onun uzunluğunu bilirsinizsə, onu birbaşa oxuya bilərsiniz, naməlum uzunluqdakı məlumatlar üçün - əvvəlcə uzunluğu oxuyun, sonra məzmunu oxuyun.

Zəncirdəki məlumatlara daxil olun və yeniləyin

ontologiya-wasm-cdt-pas - zəncirdə verilənlərlə işləmək üçün əməliyyat metodunu əhatə edir ki, bu da tərtibatçılar üçün zəncirdə məlumatların əlavə edilməsi, silinməsi, dəyişdirilməsi və sorğulanması kimi əməliyyatları aşağıdakı kimi həyata keçirmək üçün əlverişlidir:

  • verilənlər bazası ::get (açar) - zəncirdən məlumat tələb etmək üçün istifadə olunur və açar AsRef interfeysinin həyata keçirilməsini tələb edir;
  • verilənlər bazası::put (açar, dəyər) - məlumatların şəbəkədə saxlanması üçün istifadə olunur. Açar AsRef interfeysinin həyata keçirilməsini, dəyər isə Encoder interfeysinin həyata keçirilməsini tələb edir;
  • verilənlər bazası :: sil (açar) - zəncirdən məlumatları silmək üçün istifadə olunur və açar AsRef interfeysinin həyata keçirilməsini tələb edir.

Müqavilə testi

Müqavilənin üsulları həyata keçirildikdə, zəncirdəki məlumatlara daxil olmamız lazımdır və müqavilənin bayt kodunu yerinə yetirmək üçün müvafiq virtual maşına ehtiyacımız var, buna görə də sınaq üçün müqaviləni zəncirdə yerləşdirmək ümumiyyətlə lazımdır. Ancaq bu test üsulu problemlidir. Tərtibatçıların müqavilələri sınaqdan keçirməsini asanlaşdırmaq üçün ontio_std kitabxanası sınaq üçün saxta modul təqdim edir. Bu modul sxemdəki məlumatların simulyasiyasını təmin edir, tərtibatçılar üçün müqavilədəki metodları vahid sınaqdan keçirməyi asanlaşdırır. Konkret misallar tapmaq olar burada.

Müqavilə Sazlanması

console::debug(msg) müqaviləni sazlayarkən sazlama məlumatını göstərir. Mesaj məlumatı node log faylına əlavə olunacaq. İlkin şərt, yerli Ontologiya test qovşağı işləyərkən log faylı səviyyəsini sazlama rejiminə təyin etməkdir.

runtime::notify(msg) müqavilənin sazlanması zamanı müvafiq sazlama məlumatını verir. Bu üsul zəncirə daxil edilmiş məlumatları saxlayacaq və getSmartCodeEvent metodundan istifadə edərək zəncirdən sorğulana bilər.

Məqalə Hashrate&Shares redaktorları tərəfindən xüsusilə OntologyRussia üçün tərcümə edilmişdir. ağlamaq

Siz tərtibatçısınız? texnoloji icmamıza qoşulun Diskordur. Həmçinin, bir nəzər salın İnkişaf etdirici Mərkəzi tərtibatçı alətləri, sənədləri və s. tapa biləcəyiniz vebsaytımızda.

Ontologiya

Mənbə: www.habr.com

Добавить комментарий