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 тохиргооны файлын [dependencies] хэсэгт хамаарлын параметрүүдийг нэмэх хэрэгтэй:

Ontology сүлжээнд WebAssembly ухаалаг гэрээг хэрхэн бичих вэ? 1-р хэсэг: Зэв

Энэ хамаарлын тусламжтайгаар хөгжүүлэгчид Ontology блокчейнтэй харилцан үйлчилдэг интерфэйсүүд болон цуваачлалын параметр зэрэг хэрэгслүүдийг дуудаж болно.

Гэрээ оруулах функц

Програм бүр бидний ихэвчлэн хардаг үндсэн функцтэй адил оролтын функцтэй байдаг боловч гэрээнд үндсэн функц байдаггүй. Rust ашиглан Wasm гэрээг боловсруулах үед анхдагч дуудах функцийг гэрээг ашиглах оролтын функц болгон ашигладаг. Rust дахь функцийн нэр нь Rust-ийн эх кодыг виртуал машинаар гүйцэтгэх боломжтой байт код болгон хөрвүүлэх үед тодорхойгүй байх болно. Хөрвүүлэгч нэмэлт код үүсгэхээс сэргийлж, гэрээний хэмжээг багасгахын тулд invoke функц нь #[no_mangle] тэмдэглэгээг нэмдэг.

Дуудлага хийх функц нь гүйлгээг гүйцэтгэх параметрүүдийг хэрхэн авдаг вэ?

ontio_std номын сан нь гүйлгээг гүйцэтгэх параметрүүдийг авахын тулд runtime::input() функцээр хангадаг. Хөгжүүлэгчид ZeroCopySource-г ашиглан үүссэн байт массивыг цувралаас гаргах боломжтой. Уншсан байтуудын эхний массив нь дуудах аргын нэр, дараа нь аргын параметрүүд байна.

Гэрээний гүйцэтгэлийн үр дүнг хэрхэн буцаадаг вэ?

ontio_std номын сангаас өгсөн runtime::ret функц нь аргын гүйцэтгэлийн үр дүнг буцаана.

Дууссан дуудлагын функц дараах байдалтай байна.

Ontology сүлжээнд WebAssembly ухаалаг гэрээг хэрхэн бичих вэ? 1-р хэсэг: Зэв

Гэрээний өгөгдлийг цуваа болгох ба цувралаас гаргах

Гэрээ боловсруулах явцад хөгжүүлэгчид цуваа болон цуваа тайлах, ялангуяа бүтцийн өгөгдлийн төрлийг өгөгдлийн санд хэрхэн хадгалах, бүтцийн өгөгдлийн төрлийг авахын тулд өгөгдлийн сангаас уншсан байт массивыг хэрхэн цуваа болгох зэрэг асуудалтай тулгардаг.

ontio_std номын сан нь өгөгдлийн цуваа болон цуваа салгахад зориулсан декодер болон кодлогчийн интерфейсээр хангадаг. Бүтцийн талбарууд нь декодчилогч болон кодлогчийн интерфейсийг хэрэгжүүлдэг бөгөөд ингэснээр бүтцийг цуваа болгож, цувралаас ангижруулж болно. Төрөл бүрийн өгөгдлийн төрлийг цуваа болгох үед Sink ангиллын тохиолдлууд шаардлагатай. Sink ангийн жишээ нь байт төрлийн өгөгдлийг хадгалдаг багц төрлийн талбартай ба бүх цуваа өгөгдөл нь buf-д хадгалагддаг.

Тогтмол урттай өгөгдлийн хувьд (жишээ нь: байт, u16, u32, u64 гэх мэт) өгөгдлийг байт массив руу шууд хөрвүүлж, дараа нь buf-д хадгална; Тогтмол бус урттай өгөгдлийн хувьд эхлээд урт, дараа нь Ddata (жишээ нь, u16, u32, u64 гэх мэт үл мэдэгдэх хэмжээтэй тэмдэггүй бүхэл тоонууд) цуваачлагдсан байх ёстой.

Цувралгүй болгох нь яг эсрэгээрээ. Цуваа болгох арга бүрийн хувьд цуваа арилгах арга байдаг. Цувралыг арилгах нь Source ангийн жишээнүүдийг ашиглахыг шаарддаг. Энэ ангийн жишээ нь buf болон pos гэсэн хоёр талбартай. Buf нь цувралаас ангижрах өгөгдлийг хадгалахад, pos нь одоогийн унших байрлалыг хадгалахад ашиглагддаг. Тодорхой төрлийн өгөгдлийг уншиж байх үед түүний уртыг мэдэж байвал шууд уншиж болно, тодорхойгүй урттай бол эхлээд уртыг уншаад дараа нь агуулгыг нь уншаарай.

Гинжин дэх өгөгдөлд хандах, шинэчлэх

онтологи-wasm-cdt-зэв - Гинжин дэх өгөгдөлтэй ажиллах үйлдлийн аргыг багтаасан бөгөөд энэ нь хөгжүүлэгчдэд гинжин хэлхээнд өгөгдөл нэмэх, устгах, өөрчлөх, асуулга хийх зэрэг үйлдлүүдийг хэрэгжүүлэхэд тохиромжтой:

  • мэдээллийн сан :: авах (түлхүүр) - гинжин хэлхээнээс өгөгдөл хүсэхэд ашиглагддаг бөгөөд гол түлхүүр нь AsRef интерфэйсийг хэрэгжүүлэхийг хүсдэг;
  • мэдээллийн сан:: тавих (түлхүүр, утга) - сүлжээнд өгөгдөл хадгалахад ашигладаг. Түлхүүр нь AsRef интерфейсийг хэрэгжүүлэх хүсэлт, утга нь Encoder интерфейсийг хэрэгжүүлэх хүсэлт;
  • мэдээллийн сан :: устгах (түлхүүр) - нь гинжин хэлхээнээс өгөгдлийг устгахад ашиглагддаг бөгөөд гол түлхүүр нь AsRef интерфейсийг хэрэгжүүлэхийг шаарддаг.

Гэрээний туршилт

Гэрээний аргуудыг хэрэгжүүлэхэд бид гинжин хэлхээний өгөгдөлд хандах шаардлагатай бөгөөд гэрээний байт кодыг гүйцэтгэхэд тохирох виртуал машин хэрэгтэй байдаг тул ерөнхийдөө гэрээг туршилтын гинжин хэлхээнд байрлуулах шаардлагатай болдог. Гэхдээ энэ туршилтын арга нь асуудалтай байдаг. Хөгжүүлэгчид гэрээг шалгахад хялбар болгохын тулд ontio_std номын сан нь туршилт хийх хуурамч модулийг өгдөг. Энэхүү модуль нь хэлхээн дэх өгөгдлийн симуляцийг бий болгож, хөгжүүлэгчид гэрээнд заасан аргуудыг нэгжээр шалгахад хялбар болгодог. Тодорхой жишээг олж болно энд.

Гэрээний дибаг хийх

console::debug(msg) нь гэрээний дибаг хийх явцад дибаг хийх мэдээллийг харуулдаг. Мессежийн мэдээлэл нь зангилааны бүртгэлийн файлд нэмэгдэх болно. Орон нутгийн Онтологийн тестийн зангилаа ажиллаж байх үед бүртгэлийн файлын түвшинг дибаг хийх горимд тохируулах нь урьдчилсан нөхцөл юм.

runtime::notify(msg) нь гэрээний дибаг хийж байх үед тохирох дибаг хийх мэдээллийг гаргадаг. Энэ арга нь гинжин хэлхээнд оруулсан мэдээллийг хадгалах бөгөөд getSmartCodeEvent аргыг ашиглан сүлжээнээс асууж болно.

Уг нийтлэлийг Hashrate&Shares сэтгүүлийн редакторууд ялангуяа Орос улсад онтологиод зориулан орчуулсан. дарна уу

Та хөгжүүлэгч мөн үү? Манай технологийн нийгэмлэгт нэгдээрэй Discord. Бас нэг үзээрэй Хөгжүүлэгчийн төв Манай вэбсайтаас та хөгжүүлэгчийн хэрэгсэл, баримт бичиг болон бусад зүйлийг олж авах боломжтой.

Ontology

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх