Bagaimana cara menulis kontrak pintar WebAssembly di jaringan Ontology? Bagian 1: Karat

Bagaimana cara menulis kontrak pintar WebAssembly di jaringan Ontology? Bagian 1: Karat

Teknologi Ontology Wasm mengurangi biaya migrasi kontrak pintar dApp dengan logika bisnis kompleks ke blockchain, sehingga sangat memperkaya ekosistem dApp.

sekarang Wasma Ontologi Secara bersamaan mendukung pengembangan Rust dan C++. Bahasa Rust mendukung Wasm dengan lebih baik, dan bytecode yang dihasilkan lebih sederhana, yang selanjutnya dapat mengurangi biaya panggilan kontrak. Jadi, bagaimana cara menggunakan Rust untuk mengembangkan kontrak di jaringan Ontology?

Mengembangkan Kontrak WASM dengan Rust

Buat kontrak

Muatan adalah alat pembuatan proyek dan manajemen paket yang bagus untuk pengembangan Rust, yang membantu pengembang mengatur interaksi kode dan pustaka pihak ketiga dengan lebih baik. Untuk membuat kontrak Ontology Wasm baru, cukup jalankan perintah berikut:

Bagaimana cara menulis kontrak pintar WebAssembly di jaringan Ontology? Bagian 1: Karat

Struktur proyek yang dihasilkannya:

Bagaimana cara menulis kontrak pintar WebAssembly di jaringan Ontology? Bagian 1: Karat

File Cargo.toml digunakan untuk menyiapkan informasi proyek dasar dan informasi perpustakaan yang bergantung. Bagian [lib] dari file harus disetel ke tipe peti = ["cdylib"]. File lib.rs digunakan untuk menulis kode logika kontrak. Selain itu, Anda perlu menambahkan parameter dependensi ke bagian [dependencies] pada file konfigurasi Cargo.toml:

Bagaimana cara menulis kontrak pintar WebAssembly di jaringan Ontology? Bagian 1: Karat

Dengan ketergantungan ini, pengembang dapat memanggil antarmuka yang berinteraksi dengan blockchain Ontology dan alat-alat seperti parameter serialisasi.

Fungsi entri kontrak

Setiap program memiliki fungsi input, seperti fungsi utama yang biasa kita lihat, tetapi kontraknya tidak memiliki fungsi utama. Saat kontrak Wasm dikembangkan menggunakan Rust, fungsi pemanggilan default digunakan sebagai fungsi input untuk menggunakan kontrak. Nama fungsi di Rust akan menjadi tidak jelas saat mengkompilasi kode sumber Rust menjadi bytecode yang dapat dijalankan oleh mesin virtual. Untuk mencegah kompiler menghasilkan kode yang berlebihan dan mengurangi ukuran kontrak, fungsi pemanggilan menambahkan anotasi #[no_mangle].

Bagaimana fungsi pemanggilan mendapatkan parameter untuk melakukan transaksi?

Pustaka ontio_std menyediakan fungsi runtime::input() untuk mendapatkan parameter untuk mengeksekusi transaksi. Pengembang dapat menggunakan ZeroCopySource untuk melakukan deserialisasi array byte yang dihasilkan. Di mana larik byte pertama yang dibaca adalah nama metode pemanggilan, diikuti oleh parameter metode.

Bagaimana hasil pelaksanaan kontrak dikembalikan?

Fungsi runtime::ret yang disediakan oleh pustaka ontio_std mengembalikan hasil eksekusi metode.

Fungsi pemanggilan yang sudah selesai terlihat seperti ini:

Bagaimana cara menulis kontrak pintar WebAssembly di jaringan Ontology? Bagian 1: Karat

Serialisasi dan Deserialisasi Data Kontrak

Dalam proses pengembangan kontrak, pengembang selalu mengalami masalah dengan serialisasi dan deserialisasi, khususnya dengan cara menyimpan tipe data struct di database dan cara deserialize array byte yang dibaca dari database untuk mendapatkan tipe data struct.

Pustaka ontio_std menyediakan antarmuka decoder dan encoder untuk serialisasi dan deserialisasi data. Bidang struct juga mengimplementasikan antarmuka decoder dan encoder sehingga struktur dapat diserialisasi dan deserialisasi. Instance dari kelas Sink diperlukan saat berbagai tipe data diserialkan. Instance dari kelas Sink memiliki bidang set-type buf yang menyimpan data tipe byte, dan semua data serial disimpan dalam buf.

Untuk data dengan panjang tetap (misalnya: byte, u16, u32, u64, dll.), data langsung dikonversi ke array byte dan kemudian disimpan di buf; untuk data dengan panjang tidak tetap, panjang harus diserialisasi terlebih dahulu, kemudian Ddata (misalnya, bilangan bulat tidak bertanda dengan ukuran yang tidak diketahui, termasuk u16, u32, atau u64, dll.).

Deserialisasi adalah kebalikannya. Untuk setiap metode serialisasi, ada metode deserialisasi yang sesuai. Deserialisasi membutuhkan penggunaan instance dari kelas Sumber. Instance kelas ini memiliki dua bidang buf dan pos. Buf digunakan untuk menyimpan data yang akan dideserialisasi dan pos digunakan untuk menyimpan posisi baca saat ini. Ketika jenis data tertentu sedang dibaca, jika Anda tahu panjangnya, Anda bisa langsung membacanya, untuk data yang tidak diketahui panjangnyaβ€”baca dulu panjangnya, lalu baca isinya.

Akses dan perbarui data dalam rantai

ontologi-wasm-cdt-rust - merangkum metode operasional untuk bekerja dengan data dalam rantai, yang memudahkan pengembang untuk mengimplementasikan operasi seperti menambah, menghapus, mengubah, dan menanyakan data dalam rantai sebagai berikut:

  • basis data::dapatkan(kunci) - digunakan untuk meminta data dari rantai, dan kunci meminta penerapan antarmuka AsRef;
  • basis data::letakkan(kunci, nilai) - digunakan untuk menyimpan data di jaringan. Kunci meminta penerapan antarmuka AsRef, dan nilai meminta penerapan antarmuka Encoder;
  • basis data::hapus(kunci) - digunakan untuk menghapus data dari rantai, dan kunci meminta penerapan antarmuka AsRef.

Pengujian kontrak

Saat metode kontrak diimplementasikan, kami memerlukan akses ke data pada rantai dan kami memerlukan mesin virtual yang sesuai untuk mengeksekusi kode byte kontrak, sehingga umumnya perlu menerapkan kontrak pada rantai untuk pengujian. Tetapi metode pengujian ini bermasalah. Untuk memudahkan pengembang menguji kontrak, pustaka ontio_std menyediakan modul tiruan untuk pengujian. Modul ini menyediakan simulasi data dalam rangkaian, sehingga memudahkan pengembang untuk menguji metode dalam kontrak. Contoh spesifik dapat ditemukan di sini.

Kontrak Debug

console::debug(msg) menampilkan informasi debug saat men-debug kontrak. Informasi pesan akan ditambahkan ke file log node. Prasyaratnya adalah menyetel level file log ke mode debug saat node pengujian Ontologi lokal sedang berjalan.

runtime::notify(msg) menampilkan informasi debug yang sesuai saat kontrak sedang di-debug. Metode ini akan menyimpan informasi yang dimasukkan ke dalam rantai dan dapat ditanyakan dari rantai menggunakan metode getSmartCodeEvent.

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

Apakah Anda seorang pengembang? Bergabunglah dengan komunitas teknologi kami di Discord. Juga, lihatlah Pusat Pengembang di situs web kami, tempat Anda dapat menemukan alat pengembang, dokumentasi, dan lainnya.

Ontologi

Sumber: www.habr.com

Tambah komentar