Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

Hello!

Baru-baru ini, Waves Labs diumumkan persaingan untuk pembangun khusus untuk mengeluarkan sambungan bahasa kontrak pintar RIDE untuk aplikasi terdesentralisasi Ride4Dapps ke dalam rangkaian ujian!

Kami memilih kes DAO kerana Ventuari merancang untuk membangunkan dApps dengan fungsi sosial: mengundi, mengumpul dana, pengurusan amanah, dsb.
Kami bermula dengan contoh mudah dalam Sesi soal jawab dan IDE RIDE - contoh dengan dompet kongsi.

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 keran dan nyatakan alamat untuk menghantar token.
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: pengulas

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:
Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)
οΏΌ
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].
Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

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 urus niaga.

Kami memastikan bahawa baki Alice diisi semula sebanyak 3 GELOMBANG dan baki bank kekal pada 10 - 3 - 0.01 = 0.699.
Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

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:
Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

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().

Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

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 contoh

Ride4Dapps kini termasuk 2 jenis anotasi baharu:

  1. @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.
  2. @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.
Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

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 (sebagai contoh)
Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)
Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)
Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

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.
Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

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 }]}))

Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

Bob mempunyai 1.99 GELOMBANG lagi. Iaitu, Bob membayar komisen 0.01 WAVES

Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

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.

Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

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.

Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

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

Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

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.

Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

Bob juga memutuskan untuk mengeluarkan sedikit wang daripada dompet kongsi, tetapi tersilap dan cuba mengeluarkan 1.5 GELOMBANG.

Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

Walau bagaimanapun, kontrak pintar telah menyemak keadaan ini.

Xena ni penipu, dia cuba keluarkan 1 GELOMBANG dari jumlah akaun.

Belajar menulis kontrak pintar Waves pada RIDE dan RIDE4DAPPS. Bahagian 1 (Dompet berbilang pengguna)

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

Tambah komen