Cara membina, menggunakan dan menguji dApp Waves RIDE
hello! Dalam artikel ini saya akan menunjukkan kepada anda cara menulis dan menjalankan dApp biasa pada nod Waves. Mari lihat alat, kaedah dan contoh pembangunan yang diperlukan.
Skim pembangunan untuk dApps dan aplikasi biasa adalah hampir sama:
Menulis kod
Menulis ujian automatik
Melancarkan aplikasi
Menguji
Tools
1. docker untuk menjalankan nod dan Waves Explorer
Jika anda tidak mahu memulakan nod, anda boleh melangkau langkah ini. Lagipun, terdapat rangkaian ujian dan percubaan. Tetapi tanpa menggunakan nod anda sendiri, proses ujian mungkin berlarutan.
Anda akan sentiasa memerlukan akaun baharu dengan token ujian. Keran rangkaian ujian memindahkan 10 GELOMBANG setiap 10 minit.
Purata masa blok dalam rangkaian ujian ialah 1 minit, dalam nod - 15 saat. Ini amat ketara apabila transaksi memerlukan berbilang pengesahan.
Caching agresif boleh dilakukan pada nod ujian awam.
Ia juga mungkin tidak tersedia buat sementara waktu kerana penyelenggaraan.
Mulai sekarang saya akan menganggap bahawa anda sedang bekerja dengan nod anda sendiri.
Pasang Surfboard, alat yang membolehkan anda menjalankan ujian pada nod sedia ada.
npm install -g @waves/surfboard
3. Pemalam Kod Visual Studio
Langkah ini adalah pilihan jika anda bukan peminat IDE dan lebih suka editor teks. Semua alat yang diperlukan adalah utiliti baris arahan. Jika anda menggunakan vim, perhatikan pemalam vim-ride.
Muat turun dan pasang Kod 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 penyemak imbas dan pergi ke http://localhost:3000. Anda akan melihat seberapa cepat litar nod tempatan kosong dibina.
Waves Explorer memaparkan contoh nod setempat
Struktur RIDE dan alat Papan Luncur
Buat direktori kosong dan jalankan arahan di dalamnya
surfboard init
Perintah ini memulakan direktori dengan struktur projek, aplikasi dan ujian "hello world". Jika anda membuka folder ini dengan Kod VS, anda akan melihat:
Surfboard.config.json
Di bawah folder ./ride/ anda akan menemui satu fail wallet.ride - direktori tempat kod dApp berada. Kami akan menganalisis secara ringkas dApps dalam blok seterusnya.
Di bawah folder ./test/ anda akan menemui fail *.js. Ujian disimpan di sini.
./surfboard.config.json – fail konfigurasi untuk menjalankan ujian.
Envs ialah bahagian penting. Setiap persekitaran dikonfigurasikan seperti ini:
Titik akhir API REST nod yang akan digunakan untuk melancarkan dApp dan CHAIN_ID rangkaian.
Frasa rahsia untuk akaun dengan token yang akan menjadi sumber token ujian anda.
Seperti yang anda lihat, surfboard.config.json menyokong berbilang persekitaran secara lalai. Lalai ialah persekitaran setempat (kunci defaultEnv ialah parameter yang boleh diubah).
Aplikasi dompet-demo
Bahagian ini bukan rujukan kepada bahasa RIDE. Sebaliknya, lihat aplikasi yang kami gunakan dan uji untuk lebih memahami perkara yang berlaku dalam rantaian blok.
Mari lihat aplikasi Wallet-demo yang ringkas. Sesiapa sahaja boleh menghantar token ke alamat dApp. Anda hanya boleh menarik balik WAVES anda. Dua fungsi @Callable tersedia melalui InvokeScriptTransaction:
deposit()yang memerlukan bayaran yang dilampirkan dalam WAVES
withdraw(amount: Int)yang mengembalikan token
Sepanjang kitaran hayat dApp, struktur (alamat → jumlah) akan dikekalkan:
Tindakan
Keadaan terhasil
awal
kosong
Alice mendepositkan 5 GELOMBANG
alice-alamat → 500000000
Bob deposit 2 GELOMBANG
alice-alamat → 500000000
alamat bob → 200000000
Bob menarik balik 7 GELOMBANG
DITOLAK!
Alice menarik balik 4 GELOMBANG
alice-alamat → 100000000
alamat bob → 200000000
Berikut ialah kod untuk memahami keadaan 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
Pemalam VSCode menyokong kompilasi berterusan semasa mengedit fail. Oleh itu, anda sentiasa boleh memantau ralat dalam tab MASALAH.
Jika anda ingin menggunakan editor teks yang berbeza semasa menyusun fail, gunakan
surfboard compile ride/wallet.ride
Ini akan mengeluarkan satu siri kod RIDE yang disusun base64.
Skrip ujian untuk 'wallet.ride'
Jom tengok fail ujian. Dikuasakan oleh rangka kerja Mocha JavaScript. Terdapat fungsi "Sebelum" dan tiga ujian:
“Sebelum” membiayai berbilang akaun melalui MassTransferTransaction, menyusun skrip dan menggunakan ia ke blockchain.
“Boleh mendepositkan” menghantar InvokeScriptTransaction ke rangkaian, mengaktifkan fungsi deposit() untuk setiap dua akaun.
Ujian “Tidak boleh mengeluarkan lebih daripada yang telah didepositkan” yang tiada siapa boleh mencuri token orang lain.
“Boleh mendepositkan” menyemak bahawa pengeluaran diproses dengan betul.
Jalankan ujian dari Papan Selancar dan analisis keputusan dalam Waves Explorer
Untuk menjalankan ujian, jalankan
surfboard test
Jika anda mempunyai berbilang skrip (contohnya, anda memerlukan skrip penggunaan berasingan), anda boleh menjalankan
surfboard test my-scenario.js
Papan luncur akan mengumpul fail ujian dalam folder ./test/ dan menjalankan skrip pada nod yang dikonfigurasikan dalam surfboard.config.json. Selepas beberapa saat 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 telah berlalu. Sekarang mari kita lihat apa yang berlaku apabila menggunakan Waves Explorer: lihat pada blok atau tampal salah satu alamat di atas ke dalam carian (contohnya, yang sepadan wallet#. Di sana anda boleh menemui sejarah urus niaga, status dApp, fail binari yang dinyahkompilasi.
Penjelajah Gelombang. Aplikasi yang baru sahaja digunakan.
Beberapa Petua Papan Luncur:
1. Untuk menguji dalam persekitaran testnet, gunakan:
Menyediakan Waves Keeper untuk berfungsi dengan nod setempat
2. Import frasa rahsia dengan token untuk rangkaian? Untuk kesederhanaan, gunakan benih awal nod anda: waves private node seed with waves tokens. Alamat: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.