Ինչպե՞ս գրել WebAssembly խելացի պայմանագիր Ontology ցանցում: Մաս 1. Ժանգ

Ինչպե՞ս գրել WebAssembly խելացի պայմանագիր Ontology ցանցում: Մաս 1. Ժանգ

Ontology Wasm տեխնոլոգիան նվազեցնում է բարդ բիզնես տրամաբանությամբ dApp խելացի պայմանագրերը բլոկչեյն տեղափոխելու արժեքը՝ դրանով իսկ մեծապես հարստացնելով dApp էկոհամակարգը:

Հիմա Օնտոլոգիա Wasm Միաժամանակ աջակցում է Rust-ի և C++-ի մշակմանը: Rust լեզուն ավելի լավ է աջակցում Wasm-ին, իսկ ստեղծվող բայթկոդն ավելի պարզ է, ինչը կարող է է՛լ ավելի նվազեցնել պայմանագրային զանգերի արժեքը: Այսպիսով, Ինչպե՞ս օգտագործել Rust-ը Ontology ցանցի վրա պայմանագիր մշակելու համար:

Rust-ի հետ WASM պայմանագրի մշակում

Ստեղծեք պայմանագիր

բեռ Rust-ի մշակման համար նախագծերի ստեղծման և փաթեթների կառավարման լավ գործիք է, որն օգնում է մշակողներին ավելի լավ կազմակերպել կոդի և երրորդ կողմի գրադարանների փոխազդեցությունը: Ontology Wasm նոր պայմանագիր ստեղծելու համար պարզապես գործարկեք հետևյալ հրամանը.

Ինչպե՞ս գրել WebAssembly խելացի պայմանագիր Ontology ցանցում: Մաս 1. Ժանգ

Ծրագրի կառուցվածքը, որը առաջացնում է.

Ինչպե՞ս գրել WebAssembly խելացի պայմանագիր Ontology ցանցում: Մաս 1. Ժանգ

Cargo.toml ֆայլն օգտագործվում է ծրագրի հիմնական տեղեկատվությունը և կախյալ գրադարանային տեղեկատվությունը կարգավորելու համար: Ֆայլի [lib] բաժինը պետք է սահմանվի crate-type = ["cdylib"]: lib.rs ֆայլն օգտագործվում է պայմանագրի տրամաբանական կոդը գրելու համար: Բացի այդ, դուք պետք է ավելացնեք կախվածության պարամետրեր Cargo.toml կազմաձևման ֆայլի [կախվածություններ] բաժնում.

Ինչպե՞ս գրել WebAssembly խելացի պայմանագիր Ontology ցանցում: Մաս 1. Ժանգ

Այս կախվածությամբ մշակողները կարող են զանգահարել ինտերֆեյսներ, որոնք փոխազդում են Ontology բլոկչեյնի և գործիքների հետ, ինչպիսիք են սերիալացման պարամետրը:

Պայմանագրի մուտքագրման գործառույթ

Յուրաքանչյուր ծրագիր ունի մուտքագրման գործառույթ, ինչպես հիմնական գործառույթը, որը մենք սովորաբար տեսնում ենք, բայց պայմանագիրը չունի հիմնական գործառույթ: Երբ Wasm պայմանագիրը մշակվում է Rust-ի միջոցով, լռելյայն կանչի ֆունկցիան օգտագործվում է որպես մուտքային ֆունկցիա՝ պայմանագիրն օգտագործելու համար: Rust-ում ֆունկցիայի անվանումը անհասկանալի կլինի Rust-ի սկզբնական կոդը բայթկոդի մեջ կազմելիս, որը կարող է իրականացվել վիրտուալ մեքենայի կողմից: Որպեսզի կոմպիլյատորը ավելորդ կոդ չստեղծի և նվազեցնի պայմանագրի չափը, invoke ֆունկցիան ավելացնում է #[no_mangle] ծանոթագրությունը:

Ինչպե՞ս է invoke ֆունկցիան ստանում պարամետրեր գործարքը կատարելու համար:

Ontio_std գրադարանը տրամադրում է Runtime::input() ֆունկցիա՝ գործարքը կատարելու պարամետրերը ստանալու համար: Մշակողները կարող են օգտագործել ZeroCopySource-ը՝ արդյունքում բայթերի զանգվածը ապասերիալացնելու համար: Որում կարդացված բայթերի առաջին զանգվածը կանչի մեթոդի անվանումն է, որին հաջորդում են մեթոդի պարամետրերը:

Ինչպե՞ս է վերադարձվում պայմանագրի կատարման արդյունքը:

Runtime::ret ֆունկցիան, որը տրամադրվում է ontio_std գրադարանի կողմից, վերադարձնում է մեթոդի կատարման արդյունքը:

Ավարտված invoke ֆունկցիան ունի հետևյալ տեսքը.

Ինչպե՞ս գրել WebAssembly խելացի պայմանագիր Ontology ցանցում: Մաս 1. Ժանգ

Պայմանագրի տվյալների սերիականացում և ապասերիալիզացում

Պայմանագրերի մշակման գործընթացում ծրագրավորողները միշտ բախվում են սերիալացման և ապասերիալացման հետ կապված խնդիրների հետ, մասնավորապես, թե ինչպես պահել struct տվյալների տեսակը տվյալների բազայում և ինչպես ապասերիալացնել բայթային զանգվածը, որը կարդացվում է տվյալների բազայից, որպեսզի ստանա struct տվյալների տեսակը:

Ontio_std գրադարանը տրամադրում է ապակոդավորող և կոդավորող միջերեսներ տվյալների սերիալացման և ապասերիալիզացիայի համար: Կառուցվածքի դաշտերը նաև ներդնում են ապակոդավորիչի և կոդավորողի միջերեսները, որպեսզի կառուցվածքը կարողանա սերիականացվել և ապասերիալացվել: Sink դասի օրինակները պահանջվում են, երբ տվյալների տարբեր տեսակներ սերիականացվում են: Sink դասի օրինակն ունի set-type դաշտի buf, որը պահում է բայթի տիպի տվյալները, և բոլոր սերիականացված տվյալները պահվում են buf-ում։

Ֆիքսված երկարությամբ տվյալների համար (օրինակ՝ բայթ, u16, u32, u64 և այլն), տվյալներն ուղղակիորեն փոխարկվում են բայթ զանգվածի և այնուհետև պահվում buf-ում; ոչ ֆիքսված երկարության տվյալների համար նախ պետք է սերիականացնել երկարությունը, ապա Ddata-ն (օրինակ՝ անհայտ չափի անստորագիր ամբողջ թվերը, ներառյալ u16, u32 կամ u64 և այլն):

Ապասերիալացումը ճիշտ հակառակն է։ Յուրաքանչյուր սերիականացման մեթոդի համար կա համապատասխան ապասերիալիզացիայի մեթոդ: Ապասերիալիզացիան պահանջում է Source դասի օրինակների օգտագործումը: Այս դասի օրինակն ունի երկու դաշտ buf և pos: Buf-ն օգտագործվում է ապասերիալիզացվող տվյալները պահելու համար, իսկ pos-ը՝ ընթացիկ ընթերցման դիրքը պահելու համար: Երբ ընթերցվում է որոշակի տեսակի տվյալ, եթե գիտեք դրա երկարությունը, կարող եք ուղղակիորեն կարդալ այն, իսկ անհայտ երկարության տվյալների դեպքում՝ սկզբում կարդացեք երկարությունը, ապա կարդացեք բովանդակությունը:

Մուտք գործեք և թարմացրեք տվյալները շղթայում

ontology-wasm-cdt-rust - պարփակել է շղթայում տվյալների հետ աշխատելու գործառնական մեթոդ, որը հարմար է մշակողների համար՝ իրականացնելու այնպիսի գործողություններ, ինչպիսիք են շղթայում տվյալների ավելացումը, ջնջումը, փոփոխումը և հարցումը հետևյալ կերպ.

  • տվյալների բազա:: ստանալ (բանալի) - օգտագործվում է շղթայից տվյալներ պահանջելու համար, իսկ բանալին պահանջում է AsRef ինտերֆեյսի իրականացում;
  • տվյալների բազա::put (բանալին, արժեք) - օգտագործվում է ցանցում տվյալների պահպանման համար: Key-ը պահանջում է AsRef ինտերֆեյսի ներդրում, իսկ արժեքը պահանջում է Encoder ինտերֆեյսի ներդրում;
  • տվյալների բազա::ջնջել(բանալին) - օգտագործվում է շղթայից տվյալները հեռացնելու համար, և բանալին պահանջում է AsRef ինտերֆեյսի իրականացում:

Պայմանագրի փորձարկում

Երբ պայմանագրի մեթոդներն իրականացվում են, մեզ անհրաժեշտ է մուտք դեպի շղթայի տվյալները, և մեզ անհրաժեշտ է համապատասխան վիրտուալ մեքենա՝ պայմանագրի բայթկոդը գործարկելու համար, ուստի, ընդհանուր առմամբ, անհրաժեշտ է պայմանագիրը շղթայի վրա տեղադրել փորձարկման համար: Սակայն փորձարկման այս մեթոդը խնդրահարույց է: Մշակողների համար պայմանագրերի փորձարկումը հեշտացնելու համար ontio_std գրադարանը տրամադրում է փորձարկման կեղծ մոդուլ: Այս մոդուլը տրամադրում է տվյալների մոդելավորում շղթայում՝ հեշտացնելով ծրագրավորողների համար միավորի փորձարկումը պայմանագրում առկա մեթոդները: Կոնկրետ օրինակներ կարելի է գտնել այստեղ.

Պայմանագրի վրիպազերծում

console::debug(msg) ցուցադրում է վրիպազերծման մասին տեղեկատվությունը պայմանագիրը վրիպազերծելիս: Հաղորդագրության տեղեկատվությունը կավելացվի հանգույցի մատյան ֆայլին: Նախապայման է մատյան ֆայլի մակարդակը կարգաբերել վրիպազերծման ռեժիմի, երբ աշխատում է տեղական Ontology թեստային հանգույցը:

Runtime::notify(msg)-ը թողարկում է վրիպազերծման համապատասխան տեղեկատվությունը, մինչ պայմանագիրը վրիպազերծվում է: Այս մեթոդը կպահի շղթայում մուտքագրված տեղեկատվությունը և կարող է պահանջվել շղթայից՝ օգտագործելով getSmartCodeEvent մեթոդը:

Հոդվածը թարգմանվել է Hashrate&Shares-ի խմբագիրների կողմից հատուկ OntologyRussia-ի համար։ լաց

Դուք ծրագրավորող եք: Միացեք մեր տեխնոլոգիական համայնքին Discord. Բացի այդ, նայեք Մշակողների կենտրոն մեր կայքում, որտեղ կարող եք գտնել մշակողի գործիքներ, փաստաթղթեր և այլն:

Ontology- ը

Source: www.habr.com

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