Cara Membangun, Menerapkan, dan Menguji Waves RIDE dApp
Halo! Pada artikel ini saya akan menunjukkan cara menulis dan menjalankan dApp reguler pada node Waves. Mari kita lihat alat, metode, dan contoh pengembangan yang diperlukan.
Skema pengembangan dApps dan aplikasi reguler hampir sama:
Kami menulis kodenya
Menulis pengujian otomatis
Meluncurkan aplikasi
Pengujian
Alat
1. docker untuk menjalankan node dan Waves Explorer
Jika Anda tidak ingin memulai sebuah node, Anda dapat melewati langkah ini. Bagaimanapun, ada jaringan uji dan eksperimental. Namun tanpa menerapkan node Anda sendiri, proses pengujian mungkin akan berlarut-larut.
Anda akan selalu membutuhkan akun baru dengan token uji. Faucet jaringan uji mentransfer 10 GELOMBANG setiap 10 menit.
Waktu blok rata-rata di jaringan uji adalah 1 menit, di node – 15 detik. Hal ini terutama terlihat ketika suatu transaksi memerlukan banyak konfirmasi.
Caching yang agresif dimungkinkan pada node pengujian publik.
Mereka mungkin juga tidak tersedia untuk sementara karena pemeliharaan.
Mulai sekarang saya akan berasumsi bahwa Anda bekerja dengan node Anda sendiri.
Instal Surfboard, alat yang memungkinkan Anda menjalankan pengujian pada node yang ada.
npm install -g @waves/surfboard
3. Plugin Kode Visual Studio
Langkah ini opsional jika Anda bukan penggemar IDE dan lebih menyukai editor teks. Semua alat yang diperlukan adalah utilitas baris perintah. Jika Anda menggunakan vim, perhatikan pluginnya vim-naik.
Unduh dan instal Kode Visual Studio: https://code.visualstudio.com/
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Buka browser dan pergi ke http://localhost:3000. Anda akan melihat seberapa cepat sirkuit node lokal yang kosong dibangun.
Waves Explorer menampilkan contoh node lokal
Struktur RIDE dan alat Papan Selancar
Buat direktori kosong dan jalankan perintah di dalamnya
surfboard init
Perintah ini menginisialisasi direktori dengan struktur proyek, aplikasi dan pengujian “hello world”. Jika Anda membuka folder ini dengan VS Code, Anda akan melihat:
Papan Selancar.config.json
Di bawah folder ./ride/ Anda akan menemukan satu file wallet.ride - direktori tempat kode dApp berada. Kami akan menganalisis dApps secara singkat di blok berikutnya.
Di bawah folder ./test/ Anda akan menemukan file *.js. Tes disimpan di sini.
./surfboard.config.json – file konfigurasi untuk menjalankan pengujian.
Envs adalah bagian penting. Setiap lingkungan dikonfigurasi seperti ini:
Titik akhir REST API dari node yang akan digunakan untuk meluncurkan dApp dan CHAIN_ID jaringan.
Frasa rahasia untuk akun dengan token yang akan menjadi sumber token pengujian Anda.
Seperti yang Anda lihat, surfboard.config.json mendukung banyak lingkungan secara default. Defaultnya adalah lingkungan lokal (kunci defaultEnv adalah parameter yang dapat diubah).
Aplikasi demo dompet
Bagian ini bukan referensi ke bahasa RIDE. Sebaliknya, lihat aplikasi yang kami terapkan dan uji untuk lebih memahami apa yang terjadi di blockchain.
Mari kita lihat aplikasi demo Wallet sederhana. Siapa pun dapat mengirim token ke alamat dApp. Anda hanya dapat menarik WAVES Anda. Dua fungsi @Callable tersedia melalui InvokeScriptTransaction:
deposit()yang memerlukan pembayaran terlampir dalam WAVES
withdraw(amount: Int)yang mengembalikan token
Sepanjang siklus hidup dApp, struktur (alamat → jumlah) akan dipertahankan:
Tindakan
Keadaan yang dihasilkan
mulanya
kosong
Alice menyetor 5 GELOMBANG
alamat alice → 500000000
Bob menyetor 2 GELOMBANG
alamat alice → 500000000
alamat bob → 200000000
Bob menarik 7 GELOMBANG
DITOLAK!
Alice menarik 4 GELOMBANG
alamat alice → 100000000
alamat bob → 200000000
Berikut ini kode untuk memahami situasinya sepenuhnya:
# In this example multiple accounts can deposit their funds and safely take them back. No one can interfere with this.
# An inner state is maintained as mapping `address=>waves`.
{-# STDLIB_VERSION 3 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}
@Callable(i)
func deposit() = {
let pmt = extract(i.payment)
if (isDefined(pmt.assetId))
then throw("works with waves only")
else {
let currentKey = toBase58String(i.caller.bytes)
let currentAmount = match getInteger(this, currentKey) {
case a:Int => a
case _ => 0
}
let newAmount = currentAmount + pmt.amount
WriteSet([DataEntry(currentKey, newAmount)])
}
}
@Callable(i)
func withdraw(amount: Int) = {
let currentKey = toBase58String(i.caller.bytes)
let currentAmount = match getInteger(this, currentKey) {
case a:Int => a
case _ => 0
}
let newAmount = currentAmount - amount
if (amount < 0)
then throw("Can't withdraw negative amount")
else if (newAmount < 0)
then throw("Not enough balance")
else ScriptResult(
WriteSet([DataEntry(currentKey, newAmount)]),
TransferSet([ScriptTransfer(i.caller, amount, unit)])
)
}
@Verifier(tx)
func verify() = false
Plugin VSCode mendukung kompilasi berkelanjutan saat mengedit file. Oleh karena itu, Anda selalu dapat memantau kesalahan di tab MASALAH.
Jika Anda ingin menggunakan editor teks lain saat mengkompilasi file, gunakan
surfboard compile ride/wallet.ride
Ini akan menampilkan serangkaian kode RIDE yang dikompilasi base64.
Skrip pengujian untuk 'wallet.ride'
Mari lihat berkas tes. Didukung oleh kerangka Mocha JavaScript. Ada fungsi "Sebelum" dan tiga tes:
“Sebelum” mendanai banyak akun melalui MassTransferTransaction, mengkompilasi skrip dan menyebarkannya ke blockchain.
“Dapat menyetor” mengirimkan InvokeScriptTransaction ke jaringan, mengaktifkan fungsi deposit() untuk masing-masing dua akun.
Tes “Tidak dapat menarik lebih dari yang disetorkan” bahwa tidak ada yang dapat mencuri token orang lain.
“Dapat menyetor” memeriksa apakah penarikan diproses dengan benar.
Jalankan tes dari Surfboard dan analisis hasilnya di Waves Explorer
Untuk menjalankan pengujian, jalankan
surfboard test
Jika Anda memiliki beberapa skrip (misalnya, Anda memerlukan skrip penerapan terpisah), Anda dapat menjalankannya
surfboard test my-scenario.js
Surfboard akan mengumpulkan file pengujian di folder ./test/ dan menjalankan skrip pada node yang dikonfigurasi di surfboard.config.json. Setelah beberapa detik Anda akan melihat sesuatu seperti ini:
wallet test suite
Generating accounts with nonce: ce8d86ee
Account generated: foofoofoofoofoofoofoofoofoofoofoo#ce8d86ee - 3M763WgwDhmry95XzafZedf7WoBf5ixMwhX
Account generated: barbarbarbarbarbarbarbarbarbar#ce8d86ee - 3MAi9KhwnaAk5HSHmYPjLRdpCAnsSFpoY2v
Account generated: wallet#ce8d86ee - 3M5r6XYMZPUsRhxbwYf1ypaTB6MNs2Yo1Gb
Accounts successfully funded
Script has been set
√ Can deposit (4385ms)
√ Cannot withdraw more than was deposited
√ Can withdraw (108ms)
3 passing (15s)
Hore! Ujian berlalu. Sekarang mari kita lihat apa yang terjadi saat menggunakan Waves Explorer: lihat blok atau tempel salah satu alamat di atas ke dalam pencarian (misalnya, alamat yang sesuai wallet#. Di sana Anda dapat menemukan riwayat transaksi, status dApp, file biner yang didekompilasi.
Penjelajah Gelombang. Aplikasi yang baru saja dikerahkan.
Menyiapkan Waves Keeper untuk bekerja dengan node lokal
2. Impor frase rahasia dengan token untuk jaringan? Untuk mempermudah, gunakan seed awal dari node Anda: waves private node seed with waves tokens. Alamat: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.