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

gambar

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

Saat ini, Ontology Wasm secara bersamaan mendukung pengembangan Rust dan C ++ . Rust mendukung Wasm 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 Ontologi?

Pengembangan kontrak WASM dengan Rust


Pembuatan kontrak


Cargo adalah alat yang baik untuk membuat proyek dan mengelola paket ketika mengembangkan program di Rust, yang membantu pengembang mengatur interaksi kode dan perpustakaan pihak ketiga dengan lebih baik. Untuk membuat kontrak Ontologi Wasm baru, cukup jalankan perintah berikut:

gambar

Struktur proyek yang dihasilkannya:

gambar

File Cargo.toml digunakan untuk mengonfigurasi informasi proyek dasar dan informasi pustaka dependen. Bagian [lib] dalam file harus diatur ke crate-type = [β€œcdylib”]. File lib.rs digunakan untuk menulis kode logika kontrak. Selain itu, Anda perlu menambahkan parameter dependensi ke bagian [dependensi] pada file konfigurasi Cargo.toml:

gambar

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

Fungsi Pemasukan Kontrak


Setiap program memiliki fungsi input, seperti fungsi utama, yang biasanya kita lihat, tetapi kontrak tidak memiliki fungsi utama. Ketika kontrak Wasm dikembangkan menggunakan Rust, invoke digunakan secara default sebagai fungsi input untuk menggunakan kontrak. Nama fungsi di Rust tidak akan jelas saat mengkompilasi kode sumber Rust ke bytecode yang dapat dijalankan oleh mesin virtual. Untuk memperingatkan kompiler terhadap pembuatan kode yang berlebihan dan mengurangi ukuran kontrak, fungsi yang dipanggil menambahkan anotasi # [no_mangle].

Bagaimana cara mendapatkan parameter untuk menjalankan transaksi?


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

Bagaimana hasil kontrak dikembalikan?


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

Fungsi selesai dipanggil adalah sebagai berikut:

gambar

Serialisasi dan deserialisasi data kontrak


Dalam proses pengembangan kontrak, pengembang selalu menghadapi masalah serialisasi dan deserialisasi, dan khususnya cara menyimpan tipe struct data ke database dan cara byte array membaca byte dari database untuk deserialize untuk mendapatkan tipe struct data.

Pustaka ontio_std menyediakan antarmuka decoder dan encoder untuk serialisasi dan deserialisasi data. Bidang struktur struct juga mengimplementasikan antarmuka decoder dan enkoder, sehingga struktur tersebut dapat diserialisasi dan diserialisasi. Diperlukan instance sink saat membuat serial berbagai jenis data. Sebuah instance dari kelas Sink memiliki buf bidang tipe-set, yang menyimpan data tipe byte, dan semua data serial disimpan dalam buf.
Untuk data dengan panjang tetap (misalnya: byte, u16, u32, u64, dll.), Data secara langsung dikonversi ke array byte dan kemudian disimpan dalam buf; untuk data yang panjangnya tidak tetap, pertama-tama Anda harus membuat serial panjangnya, dan kemudian data D \ (misalnya, bilangan bulat tak bertanda dari 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 Source. Instance kelas ini memiliki dua field buf dan pos. Buf digunakan untuk menyimpan data yang akan dideeralisasi, dan pos digunakan untuk menyimpan posisi baca saat ini. Ketika tipe data tertentu dibaca, jika Anda tahu panjangnya, Anda bisa membacanya secara langsung, untuk data yang panjangnya tidak diketahui - pertama baca panjangnya, lalu baca isinya.

Akses dan perbarui data dalam rantai


Ontology-wasm-cdt-rust - merangkum metode operasional bekerja dengan data dalam sebuah rantai, yang nyaman bagi pengembang untuk mengimplementasikan operasi seperti menambah, menghapus, mengubah, dan menanyakan data dalam suatu rantai sebagai berikut:

  • database :: get (key) - digunakan untuk meminta data dari rantai, dan kunci meminta implementasi antarmuka AsRef;
  • database :: put (key, value) - digunakan untuk menyimpan data di jaringan. Key meminta eksekusi antarmuka AsRef, dan nilai meminta implementasi antarmuka Encoder;
  • database :: delete (key) - digunakan untuk menghapus data dari rantai, dan kunci meminta implementasi antarmuka AsRef.

Pengujian kontrak


Ketika metode kontrak diterapkan, kita perlu akses ke data di sirkuit dan kita membutuhkan mesin virtual yang sesuai untuk mengeksekusi kode bytec dari kontrak, oleh karena itu, sebagai suatu peraturan, kita perlu menggunakan kontrak dalam rantai untuk pengujian. Tetapi metode pengujian seperti itu bermasalah. Untuk membuat kontrak pengujian lebih mudah bagi pengembang, perpustakaan ontio_std menyediakan modul tiruan untuk pengujian. Modul ini memberikan simulasi data dalam suatu rangkaian, sehingga memudahkan pengembang untuk menyatukan metode pengujian dalam suatu kontrak. Contoh spesifik dapat ditemukan di sini .

Debugging kontrak


console :: debug (msg) mencetak informasi debug saat melakukan debug kontrak. Informasi Pesan akan dimasukkan ke dalam file log simpul. Prasyarat adalah mengatur tingkat file log dalam mode debug ketika simpul uji Ontologi lokal sedang berjalan.

runtime :: notify (msg) menampilkan informasi debugging yang tepat saat debugging kontrak. Metode ini akan menyimpan informasi yang dimasukkan ke sirkuit dan dapat diminta dari sirkuit menggunakan metode getSmartCodeEvent.



Artikel ini diterjemahkan oleh Hashrate & Shares khusus untuk OntologyRussia. klik

Apakah Anda seorang pengembang? Bergabunglah dengan komunitas teknologi kami di Discord . Selain itu, lihat Pusat Pengembang di situs web kami, tempat Anda dapat menemukan alat pengembang, dokumentasi, dan banyak lagi.

Ontologi


Source: https://habr.com/ru/post/id471878/


All Articles