Hello!
Baru-baru ini, Waves Labs
Kami memilih kes DAO kerana
Kami bermula dengan contoh mudah dalam
Mari kita lihat contoh ini, uji hipotesis dan lihat beberapa keanehan:
Biar kami mempunyai Alice - Pemilik dApp
Boob dan Cooper ialah rakan kongsi Alice, pengasas bersama Alice-BC DAO
Neli merupakan pemilik perniagaan yang memerlukan pembiayaan
Bank - bank yang mengedarkan token
Peringkat 1. Permulaan baki
Untuk menerima token pada rangkaian ujian gelombang, anda perlu menghubungi
Anda boleh mencari alamat dalam IDE dengan membuka butiran akaun anda.
Kami menyerlahkan Bank 10 WAVES. Kemudian kami menyemak sama ada mereka tiba melalui penyemak imbas blok dan transaksi:
Sekarang mari kita edarkan token dari bank kepada peserta yang lain. (Nota: Semua transaksi di rangkaian waves tidak percuma, jadi baki positif minimum diperlukan untuk semua peserta membuat transaksi).
1 GELOMBANG = 100000000 unit (gelombang), kerana jumlah hanya boleh integer
0.01 GELOMBANG (Yuran Transaksi) = 1000000
Bank -> [3 GELOMBANG] -> Alice, melalui TransferTransaction (Jenis: 4).
Kami menyemak bahawa env.SEED dari mana transaksi ditandatangani sepadan dengan Bank kami:
οΏΌ
Jika anda tidak mempunyai frasa benih yang sepadan, cuma tukar kepadanya dalam tab Akaun dan semak semula.
Selepas ini, kami membuat, mengumumkan dan menandatangani transaksi untuk pemindahan 3 WAVES Alice.
Anda juga boleh mengetahui data Alice melalui pembolehubah env.accounts. Penomboran bermula dari 0, jadi Alice ialah env.accounts[1].
broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))
Hasilnya juga boleh diperhatikan dalam penyemak imbas, pautan kepadanya akan dikembalikan kepada kami sejurus selepas pelaksanaan
Kami memastikan bahawa baki Alice diisi semula sebanyak 3 GELOMBANG dan baki bank kekal pada 10 - 3 - 0.01 = 0.699.
Kami menghantar Boob dan Cooper 3 WAVES setiap satu, dan Neli, Xena dan Mark 0.2 WAVES setiap satu dengan cara yang sama.
(Nota: Kami membuat ralat satu aksara dan menghantar Neli 0.02 WAVES. Berhati-hati!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))
Selepas mengisi semula baki semua peserta, kami melihat:
Peringkat 2. Buat akaun dApp
Kami bersetuju bahawa Alice akan menjadi pencipta dan pemilik aplikasi terdesentralisasi.
Pergi ke Akaun, tetapkannya sebagai SEED dan semak env.SEED sepadan dengan Alice.
Mari cuba pasang skrip (kontrak) paling mudah pada akaun Alice.
Kenalan pintar dalam Waves ialah predikat yang melarang atau membenarkan sebarang jenis transaksi keluar berlaku dalam keadaan tertentu. Dalam kes ini, keadaan ini SELALU. Kod kontrak adalah benar. Panggilan deploy().
Yuran setiap setSkrip transaksi 1400000/100000000 = 0.014 GELOMBANG. Alice mempunyai baki 2.986 GELOMBANG pada bakinya.
Sekarang mari cuba memasang logik kontrak pintar yang lebih kompleks pada akaun Alice, yang diterangkan dalam
Ride4Dapps kini termasuk 2 jenis anotasi baharu:
- @Boleh dipanggil(i) β mengambil sebagai parameter i, data tentang akaun yang dipanggil/menandatangani transaksi. Hasil daripada fungsi inilah yang menentukan perubahan dalam keadaan akaun dApp. Akaun lain boleh membuat transaksi dan melaksanakan fungsi dengan anotasi ini dan menukar keadaan akaun dApp.
- @Verifier(tx) β Pengesah transaksi dengan parameter tx transaksi. Sepadan dengan logik predikat dari RIDE. Dalam ungkapan ini anda boleh membenarkan atau melarang perubahan lanjut pada logik kontrak pintar pada akaun dApp.
Jom buat dApp akaun sebagai dompet biasa untuk semua peserta.
Untuk menyemak kontrak mana yang aktif pada akaun anda pada masa ini, anda boleh menyalin kod base64 kontrak pintar dalam penjelajah blok dan mengenalinya menggunakan decompiler (
Kami memastikan bahawa logik kontrak pintar sepadan dengan apa yang kami jangkakan.
Alice mempunyai baki 2.972 GELOMBANG pada bakinya.
DApp ini menjejaki jumlah sumbangan setiap peserta kepada dana bersama melalui mekanisme transaksi data β DataEntry(currentKey, newAmount), dengan currentKey ialah akaun yang memanggil fungsi deposit, dan newAmount ialah nilai baki yang diisi semula.
Boob dan Cooper membuat deposit mereka ke akaun dApp dengan 1 WAVES.
Kami membuat kesilapan dan transaksi tidak berjaya. Memandangkan, walaupun pada hakikatnya kami yakin bahawa kami membuat transaksi bagi pihak Bob, kami membuat kesilapan dalam indeks dan menunjukkan akaun Bank yang tidak mempunyai kontrak pintar. Perlu diperhatikan satu perkara penting di sini - terdapat bayaran untuk percubaan yang tidak berjaya untuk memulakan transaksi tidak boleh dikeluarkan! Alice mempunyai baki 2.972 GELOMBANG pada bakinya. Bob mempunyai 3 GELOMBANG.
Bob menghantar 1 WAVES ke Akaun dApp.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
Bob mempunyai 1.99 GELOMBANG lagi. Iaitu, Bob membayar komisen 0.01 WAVES
Alice mempunyai 2.972 GELOMBANG pada bakinya, kini 3.972. Transaksi juga telah didaftarkan pada akaun Alice, tetapi tiada komisen dikenakan daripada Akaun dApp (Alice).
Selepas Cooper juga mengisi semula akaun itu, baki Alice menjadi 4.972 GELOMBANG.
Anda boleh mengetahui siapa yang memiliki bilangan WAVES dalam dompet biasa dalam penjelajah blok dalam tab Data.
Cooper mengubah fikirannya tentang meninggalkan jumlah 1 WAVES pada dompet umum dan memutuskan untuk menarik balik separuh daripada pertalian. Untuk melakukan ini, dia mesti memanggil fungsi pengeluaran.
Walau bagaimanapun, kami silap sekali lagi, kerana fungsi penarikan mempunyai parameter yang sama sekali berbeza dan tandatangan yang berbeza. Apabila anda mereka bentuk kontrak pintar pada RIDE4DAPPS, anda harus memberi perhatian kepada perkara ini
Cooper kini mempunyai 2.48 WAVES pada kunci kira-kiranya. Sehubungan itu, 3 GELOMBANG - 1 - 0.01, dan kemudian + 0.5 - 0.01. Sehubungan itu, setiap panggilan untuk mendeposit dan mengeluarkan kos 0.01 WAVES. Akibatnya, entri dalam jadual pemilik dApps berubah seperti berikut.
Bob juga memutuskan untuk mengeluarkan sedikit wang daripada dompet kongsi, tetapi tersilap dan cuba mengeluarkan 1.5 GELOMBANG.
Walau bagaimanapun, kontrak pintar telah menyemak keadaan ini.
Xena ni penipu, dia cuba keluarkan 1 GELOMBANG dari jumlah akaun.
Ia juga tidak berjaya untuknya.
Dalam bahagian seterusnya, kita akan melihat isu yang lebih kompleks yang berkaitan dengan ketidaksempurnaan Akaun Alice dApp.
Sumber: www.habr.com