Bagaimana untuk menulis kontrak pintar WebAssembly pada rangkaian Ontologi? Bahagian 1: Karat

Bagaimana untuk menulis kontrak pintar WebAssembly pada rangkaian Ontologi? Bahagian 1: Karat

Teknologi Wasm Ontologi mengurangkan kos pemindahan kontrak pintar dApp dengan logik perniagaan yang kompleks ke rantaian blok, sekali gus memperkaya ekosistem dApp.

Sekarang Ontologi Wasm Pada masa yang sama menyokong pembangunan Rust dan C++. Bahasa Rust menyokong Wasm dengan lebih baik, dan bytecode yang dihasilkan adalah lebih mudah, yang boleh mengurangkan lagi kos panggilan kontrak. Jadi, bagaimana untuk menggunakan Rust untuk membangunkan kontrak pada rangkaian Ontologi?

Membangunkan Kontrak WASM dengan Rust

Buat kontrak

Cargo ialah alat penciptaan projek dan pengurusan pakej yang baik untuk pembangunan Rust, yang membantu pembangun untuk mengatur interaksi kod dan perpustakaan pihak ketiga dengan lebih baik. Untuk mencipta kontrak Ontology Wasm baharu, jalankan arahan berikut:

Bagaimana untuk menulis kontrak pintar WebAssembly pada rangkaian Ontologi? Bahagian 1: Karat

Struktur projek yang dihasilkannya:

Bagaimana untuk menulis kontrak pintar WebAssembly pada rangkaian Ontologi? Bahagian 1: Karat

Fail Cargo.toml digunakan untuk menyediakan maklumat projek asas dan maklumat perpustakaan bergantung. Bahagian [lib] fail mesti ditetapkan kepada jenis peti = ["cdylib"]. Fail lib.rs digunakan untuk menulis kod logik kontrak. Selain itu, anda perlu menambah parameter kebergantungan pada bahagian [dependencies] fail konfigurasi Cargo.toml:

Bagaimana untuk menulis kontrak pintar WebAssembly pada rangkaian Ontologi? Bahagian 1: Karat

Dengan pergantungan ini, pembangun boleh memanggil antara muka yang berinteraksi dengan blok Ontology dan alatan seperti parameter bersiri.

Fungsi kemasukan kontrak

Setiap program mempunyai fungsi input, seperti fungsi utama yang biasa kita lihat, tetapi kontrak tidak mempunyai fungsi utama. Apabila kontrak Wasm dibangunkan menggunakan Rust, fungsi invoke lalai digunakan sebagai fungsi input untuk menggunakan kontrak. Nama fungsi dalam Rust akan menjadi tidak jelas apabila menyusun kod sumber Rust ke dalam bytecode yang boleh dilaksanakan oleh mesin maya. Untuk menghalang pengkompil daripada menjana kod berlebihan dan mengurangkan saiz kontrak, fungsi invoke menambah anotasi #[no_mangle].

Bagaimanakah fungsi invoke mendapatkan parameter untuk melaksanakan transaksi?

Pustaka ontio_std menyediakan fungsi runtime::input() untuk mendapatkan parameter untuk melaksanakan transaksi. Pembangun boleh menggunakan ZeroCopySource untuk menyahsiri tatasusunan bait yang terhasil. Di mana tatasusunan pertama bait dibaca ialah nama kaedah invoke, diikuti dengan parameter kaedah.

Bagaimanakah hasil pelaksanaan kontrak dikembalikan?

Fungsi runtime::ret yang disediakan oleh perpustakaan ontio_std mengembalikan hasil pelaksanaan kaedah.

Fungsi invoke yang lengkap kelihatan seperti ini:

Bagaimana untuk menulis kontrak pintar WebAssembly pada rangkaian Ontologi? Bahagian 1: Karat

Mensiri dan Menyahseri Data Kontrak

Dalam proses membangunkan kontrak, pembangun sentiasa menghadapi masalah dengan bersiri dan penyahseririan, khususnya dengan cara menyimpan jenis data struktur dalam pangkalan data dan cara menyahsiri tatasusunan bait yang dibaca daripada pangkalan data untuk mendapatkan jenis data struktur.

Pustaka ontio_std menyediakan antara muka penyahkod dan pengekod untuk pensirilan data dan penyahsirilan. Medan struct juga melaksanakan antara muka penyahkod dan pengekod supaya struktur boleh disiri dan dinyahsiri. Contoh kelas Sink diperlukan apabila pelbagai jenis data bersiri. Contoh kelas Sink mempunyai buf medan jenis set yang menyimpan data jenis bait dan semua data bersiri disimpan dalam buf.

Untuk data panjang tetap (cth: bait, u16, u32, u64, dsb.), data ditukar terus kepada tatasusunan bait dan kemudian disimpan dalam buf; untuk data dengan panjang tidak tetap, panjang mesti bersiri dahulu, kemudian Ddata (contohnya, integer tidak bertanda saiz yang tidak diketahui, termasuk u16, u32, atau u64, dsb.).

Penyahserialisasian adalah sebaliknya. Untuk setiap kaedah penyirian, terdapat kaedah penyahserikan yang sepadan. Penyahserialisasian memerlukan penggunaan contoh kelas Sumber. Contoh kelas ini mempunyai dua medan buf dan pos. Buf digunakan untuk menyimpan data untuk dinyahsiri dan pos digunakan untuk menyimpan kedudukan baca semasa. Apabila jenis data tertentu sedang dibaca, jika anda mengetahui panjangnya, anda boleh membacanya secara langsung, untuk data yang tidak diketahui panjangnyaβ€”baca panjangnya dahulu, kemudian baca kandungannya.

Akses dan kemas kini data dalam rantaian

ontologi-wasm-cdt-rust - merangkum kaedah operasi untuk bekerja dengan data dalam rantaian, yang memudahkan pembangun melaksanakan operasi seperti menambah, memadam, menukar dan menanyakan data dalam rantaian seperti berikut:

  • pangkalan data::get(key) - digunakan untuk meminta data daripada rantaian, dan kunci meminta pelaksanaan antara muka AsRef;
  • pangkalan data::put(kunci, nilai) - digunakan untuk menyimpan data pada rangkaian. Kunci meminta pelaksanaan antara muka AsRef, dan nilai meminta pelaksanaan antara muka Pengekod;
  • pangkalan data:: padam (kunci) - digunakan untuk mengalih keluar data daripada rantaian, dan kunci meminta pelaksanaan antara muka AsRef.

Ujian kontrak

Apabila kaedah kontrak dilaksanakan, kami memerlukan akses kepada data pada rantaian dan kami memerlukan mesin maya yang sesuai untuk melaksanakan kod bait kontrak, jadi secara amnya, kontrak pada rantaian perlu digunakan untuk ujian. Tetapi kaedah ujian ini bermasalah. Untuk memudahkan pembangun menguji kontrak, perpustakaan ontio_std menyediakan modul tiruan untuk ujian. Modul ini menyediakan simulasi data dalam litar, menjadikannya lebih mudah bagi pembangun untuk menguji unit kaedah dalam kontrak. Contoh khusus boleh didapati di sini.

Penyahpepijatan Kontrak

console::debug(msg) memaparkan maklumat nyahpepijat semasa menyahpepijat kontrak. Maklumat msg akan ditambahkan pada fail log nod. Prasyarat adalah untuk menetapkan tahap fail log kepada mod nyahpepijat apabila nod ujian Ontologi tempatan sedang berjalan.

runtime::notify(msg) mengeluarkan maklumat nyahpepijat yang sesuai semasa kontrak sedang dinyahpepijat. Kaedah ini akan menyimpan maklumat yang dimasukkan ke dalam rantaian dan boleh ditanya daripada rantai menggunakan kaedah getSmartCodeEvent.

Artikel tersebut telah diterjemahkan oleh editor Hashrate&Shares khas untuk OntologyRussia. menangis

Adakah anda seorang pemaju? Sertai komuniti teknologi kami di Perpecahan. Juga, lihat Pusat Pembangun di tapak web kami, tempat anda boleh menemui alatan pembangun, dokumentasi dan banyak lagi.

Ontologi

Sumber: www.habr.com

Tambah komen