
Halo semuanya!
Baru-baru ini, Waves Labs mengumumkan kompetisi untuk pengembang yang didedikasikan untuk merilis ekstensi bahasa kontrak pintar RIDE untuk aplikasi terdesentralisasi Ride4Dapps ke jaringan uji!
Kami memilih kasus DAO, karena Ventuary berencana untuk mengembangkan dApp dengan fungsi sosial: voting, penggalangan dana, manajemen kepercayaan, dll.
Kami mulai dengan contoh sederhana di sesi Tanya Jawab dan di IDE RIDE - contoh dengan dompet umum .
Mari kita lihat contoh ini, uji hipotesis dan pertimbangkan beberapa keanehan:
Biarkan kami memiliki Alice - Pemilik dApp
Boob dan Cooper adalah mitra Alice, salah satu pendiri Alice-BC DAO
Neli adalah pemilik bisnis yang membutuhkan pembiayaan
Bank - bank yang mendistribusikan token
Tahap 1. Inisialisasi saldo
Untuk menerima token di jaringan uji gelombang, Anda perlu menghubungi faucet dan menentukan alamat token yang harus dikirim.
Alamat tersebut dapat ditemukan di IDE dengan mengungkapkan informasi akun.
Pilih Bank 10 GELOMBANG. Setelah kami memverifikasi bahwa mereka datang melalui blok dan penjelajah transaksi: browser
Sekarang mari kita bagikan token dari bank ke peserta lain. (Catatan: Semua transaksi dalam jaringan ombak tidak gratis, oleh karena itu, keseimbangan positif minimum diperlukan untuk semua peserta untuk menyelesaikan transaksi).
1 GELOMBANG = 100000000 unit (wavelet), karena jumlah hanya bisa bilangan bulat
0,01 GELOMBANG (Biaya Transaksi) = 1000000
Bank -> [3 WAVES] -> Alice, melalui TransferTransaction (Tipe: 4).
Kami memverifikasi bahwa env.SEED dari mana transaksi ditandatangani sesuai dengan Bank kami:

๏ฟผ
Jika Anda tidak memiliki frasa unggulan yang cocok, cukup alihkan ke sana di tab Akun dan periksa lagi.
Setelah itu, kami membuat, mengumumkan dan menandatangani transaksi pada transfer 3 GELOMBANG Alice.
Anda juga dapat mempelajari data Alice melalui variabel env.accounts. Penomoran dimulai dari 0, masing-masing Alice adalah env.accounts [1].

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))
Hasilnya juga dapat diamati di browser, tautannya akan kembali kepada kami segera setelah transaksi .
Kami memastikan bahwa saldo Alice diisi kembali oleh 3 GELOMBANG, dan bahwa 10 - 3 - 0,01 = 0,699 tetap pada saldo bank.


Kami mengirim Boob dan Cooper dalam 3 GELOMBANG, dan Neli, Xena dan Mark dalam 0,2 GELOMBANG dengan cara yang sama.
(Catatan: Kami membuat satu kesalahan karakter dan mengirim Neli 0,02 WAVES. Hati-hati!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))
Setelah mengisi saldo semua peserta, kita melihat:

Tahap 2. Membuat akun dApp
Kami sepakat bahwa pencipta dan pemilik aplikasi yang didesentralisasi adalah Alice.
Di Akun, buka untuk menginstalnya sebagai SEED dan periksa cocok env.SEED Alice.
Mari kita coba instal di akun Alice script (kontrak) paling sederhana yang mungkin.
Kontak pintar di Waves adalah predikat yang melarang atau mengizinkan segala jenis transaksi keluar dijalankan dalam kondisi tertentu. Dalam hal ini, kondisi ini SELALU. Kode kontrak itu benar. Kami memanggil deploy ().

Biaya untuk transaksi setScript 1400000/100000000 = 0,014 GELOMBANG. Alice memiliki 2.986 GELOMBANG pada keseimbangannya.
Mari kita coba sekarang untuk menginstal pada akun Alice logika kontrak pintar yang lebih kompleks yang dijelaskan dalam contoh
Ride4Dapps sekarang mencakup 2 jenis anotasi baru:
- @Callable (i) - mengambil sebagai parameter i, data tentang akun mana yang menyebabkan / menandatangani transaksi. Hasil dari fungsi ini menentukan perubahan dalam status akun dApp. Akun lain dapat membuat transaksi dan melakukan fungsi dengan anotasi ini dan mengubah status akun dApp.
- @ Verifier (tx) - Verifikasi transaksi dengan parameter tx transaksi. Sesuai dengan logika predikat dari RIDE. Dalam ungkapan ini Anda dapat mengaktifkan atau menonaktifkan perubahan lebih lanjut pada logika kontrak pintar pada akun dApp.
Berhati-hatilah! Poin penting adalah bahwa secara default skrip pada akun tidak sama dengan true , tetapi menggunakan perbandingan tanda tangan dan hanya memungkinkan pemilik tanda tangan untuk melakukan transaksi.
sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPk)
Tanpa verifikasi semacam itu, siapa pun dapat melakukan transaksi dari akun!
Mari menjadikan akun dApp sebagai dompet umum untuk semua peserta.

Untuk memeriksa kontrak mana yang saat ini aktif di akun Anda, Anda dapat menyalin kode base64 kontrak pintar di browser blok dan mengenalinya melalui dekompiler ( misalnya )



Kami memastikan bahwa logika kontrak pintar sesuai dengan yang kami harapkan.
Alice memiliki 2,972 GELOMBANG pada keseimbangannya.
DApp ini melacak berapa banyak masing-masing peserta berkontribusi pada dana bersama melalui mekanisme transaksi data - DataEntry (currentKey, newAmount) , di mana currentKey adalah akun yang memanggil fungsi setoran, dan newAmount adalah nilai saldo yang diisi ulang.
Boob dan Cooper melakukan setoran mereka di akun dApp masing-masing dengan 1 GELOMBANG.

Kami membuat kesalahan dan transaksi tidak lulus. Karena kami, terlepas dari kenyataan bahwa kami yakin bahwa kami melakukan transaksi atas nama Bob, membuat kesalahan dalam indeks dan menunjukkan rekening Bank yang tidak memiliki kontrak pintar. Di sini perlu diperhatikan poin penting - untuk usaha yang gagal untuk memulai transaksi, komisi tidak ditarik! Alice memiliki 2,972 GELOMBANG pada keseimbangannya. Bob 3 memiliki GELOMBANG.
Bob mengirim 1 GELOMBANG ke Akun dApp.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))

Bob memiliki 1,99 GELOMBANG tersisa. Artinya, Bob membayar komisi 0,01 WAVES

Alice memiliki 2,972 GELOMBANG di neraca, menjadi 3,972. Sebuah transaksi juga terdaftar di akun Alice, namun, tidak ada komisi yang dikurangkan dari Akun dApp (Alice).
Setelah Cooper juga mengisi kembali akun Alice, 4,972 GELOMBANG menjadi di neraca.

Anda dapat mengetahui berapa banyak GELOMBANG di dompet umum milik dalam blok explorer di tab Data.
Cooper berubah pikiran tentang meninggalkan jumlah 1 GELOMBANG di dompet umum dan memutuskan untuk menarik setengah dari afinitas. Untuk melakukan ini, ia harus memanggil fungsi penarikan.

Namun, kami kembali salah, karena fungsi penarikan memiliki parameter yang sama sekali berbeda, tanda tangan yang berbeda. Saat merancang kontrak cerdas pada RIDE4DAPPS, Anda harus memperhatikan momen ini.

Cooper memiliki 2,48 GELOMBANG di neraca. Dengan demikian, 3 GELOMBANG - 1 - 0,01, dan kemudian + 0,5 - 0,01. Dengan demikian, setiap panggilan untuk menyetor dan menarik biaya 0,01 GELOMBANG. Akibatnya, entri dalam tabel kepemilikan dApps telah berubah sebagai berikut.

Bob juga memutuskan untuk menarik sejumlah tertentu dari total dompet, tetapi keliru dan mencoba untuk mengekstrak 1,5 GELOMBANG.

Namun, kontrak pintar itu memeriksa situasi semacam itu.
Xena seorang penipu, dia mencoba menarik 1 GELOMBANG dari akun umum.

Dia juga gagal.
Pada bagian selanjutnya , kami akan mempertimbangkan masalah yang lebih kompleks yang terkait dengan ketidaksempurnaan Akun Alice dApp.