Prohoster > Blog > quản lý > Cách xây dựng, triển khai và thử nghiệm Waves RIDE dApp
Cách xây dựng, triển khai và thử nghiệm Waves RIDE dApp
Xin chào! Trong bài viết này, tôi sẽ hướng dẫn bạn cách viết và chạy một dApp thông thường trên nút Waves. Hãy xem xét các công cụ, phương pháp cần thiết và một ví dụ về phát triển.
Sơ đồ phát triển cho dApps và các ứng dụng thông thường gần như giống nhau:
Chúng tôi viết mã
Viết bài kiểm tra tự động
Khởi chạy ứng dụng
Kiểm tra
Dụng cụ
1. docker để chạy nút và Waves Explorer
Nếu bạn không muốn bắt đầu một nút, bạn có thể bỏ qua bước này. Rốt cuộc, có một mạng thử nghiệm và thử nghiệm. Nhưng nếu không triển khai nút của riêng bạn, quá trình thử nghiệm có thể kéo dài.
Bạn sẽ liên tục cần các tài khoản mới có mã thông báo thử nghiệm. Vòi mạng thử nghiệm truyền 10 WAVES cứ sau 10 phút.
Thời gian chặn trung bình trong mạng thử nghiệm là 1 phút, trong nút – 15 giây. Điều này đặc biệt đáng chú ý khi một giao dịch yêu cầu nhiều xác nhận.
Có thể lưu vào bộ nhớ đệm tích cực trên các nút kiểm tra công khai.
Chúng cũng có thể tạm thời không khả dụng do bảo trì.
Từ bây giờ tôi sẽ cho rằng bạn đang làm việc với nút của riêng mình.
Cài đặt Surfboard, một công cụ cho phép bạn chạy thử nghiệm trên nút hiện có.
npm install -g @waves/surfboard
3. Plugin mã Visual Studio
Bước này là tùy chọn nếu bạn không phải là người yêu thích IDE và thích các trình soạn thảo văn bản. Tất cả các công cụ cần thiết đều là tiện ích dòng lệnh. Nếu bạn sử dụng vim, hãy chú ý đến plugin vim-đi xe.
Tải xuống và cài đặt Visual Studio Code: 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
Mở trình duyệt và truy cập http://localhost:3000. Bạn sẽ thấy mạch nút cục bộ trống được xây dựng nhanh như thế nào.
Waves Explorer hiển thị phiên bản nút cục bộ
Cấu trúc RIDE và công cụ Ván lướt sóng
Tạo một thư mục trống và chạy lệnh trong đó
surfboard init
Lệnh khởi tạo một thư mục có cấu trúc dự án, các ứng dụng và thử nghiệm “hello world”. Nếu bạn mở thư mục này bằng VS Code, bạn sẽ thấy:
Ván lướt sóng.config.json
Trong thư mục ./ride/, bạn sẽ tìm thấy một tệp wallet.ride - thư mục chứa mã dApp. Chúng tôi sẽ phân tích ngắn gọn về dApp trong khối tiếp theo.
Trong thư mục ./test/ bạn sẽ tìm thấy tệp *.js. Các bài kiểm tra được lưu trữ ở đây.
./surfboard.config.json – tệp cấu hình để chạy thử nghiệm.
Envs là một phần quan trọng. Mỗi môi trường được cấu hình như thế này:
Điểm cuối API REST của nút sẽ được sử dụng để khởi chạy dApp và CHAIN_ID của mạng.
Cụm từ bí mật dành cho tài khoản có mã thông báo sẽ là nguồn mã thông báo thử nghiệm của bạn.
Như bạn có thể thấy, theo mặc định, Surfboard.config.json hỗ trợ nhiều môi trường. Mặc định là môi trường cục bộ (khóa defaultEnv là tham số có thể thay đổi).
Ứng dụng ví-demo
Phần này không phải là tài liệu tham khảo về ngôn ngữ RIDE. Thay vào đó, hãy xem xét ứng dụng mà chúng tôi triển khai và thử nghiệm để hiểu rõ hơn những gì đang xảy ra trong chuỗi khối.
Hãy xem xét một ứng dụng Ví-demo đơn giản. Bất kỳ ai cũng có thể gửi mã thông báo đến địa chỉ dApp. Bạn chỉ có thể rút WAVES của mình. Hai hàm @Callable có sẵn thông qua InvokeScriptTransaction:
deposit()yêu cầu thanh toán đính kèm bằng WAVES
withdraw(amount: Int)trả về mã thông báo
Trong suốt vòng đời của dApp, cấu trúc (địa chỉ → số tiền) sẽ được duy trì:
Hoạt động
Trạng thái kết quả
ban đầu
trống
Alice gửi 5 WAVES
địa chỉ alice → 500000000
Bob gửi 2 WAVES
địa chỉ alice → 500000000
địa chỉ bob → 200000000
Bob rút 7 WAVES
TỪ CHỐI!
Alice rút 4 WAVES
địa chỉ alice → 100000000
địa chỉ bob → 200000000
Đây là mã để hiểu đầy đủ tình hình:
# 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 hỗ trợ biên dịch liên tục trong khi chỉnh sửa tệp. Do đó, bạn luôn có thể theo dõi lỗi trong tab VẤN ĐỀ.
Nếu bạn muốn sử dụng trình soạn thảo văn bản khác khi biên dịch tệp, hãy sử dụng
surfboard compile ride/wallet.ride
Điều này sẽ xuất ra một loạt mã RIDE được biên dịch base64.
Tập lệnh thử nghiệm cho 'wallet.ride'
Chúng ta hãy nhìn vào tập tin kiểm tra. Được hỗ trợ bởi khung Mocha của JavaScript. Có chức năng “Trước” và ba bài kiểm tra:
“Trước” cấp tiền cho nhiều tài khoản thông qua MassTransferTransaction, biên dịch tập lệnh và triển khai nó vào chuỗi khối.
“Có thể gửi tiền” gửi InvokeScriptTransaction tới mạng, kích hoạt chức năng Deposit() cho mỗi tài khoản trong số hai tài khoản.
Thử nghiệm “Không thể rút nhiều hơn số tiền đã gửi” cho thấy không ai có thể đánh cắp token của người khác.
“Có thể gửi tiền” kiểm tra xem việc rút tiền có được xử lý chính xác hay không.
Chạy thử nghiệm từ Surfboard và phân tích kết quả trong Waves Explorer
Để chạy thử nghiệm, hãy chạy
surfboard test
Nếu bạn có nhiều tập lệnh (ví dụ: bạn cần một tập lệnh triển khai riêng), bạn có thể chạy
surfboard test my-scenario.js
Surfboard sẽ thu thập các tệp kiểm tra trong thư mục ./test/ và chạy tập lệnh trên nút được định cấu hình trong Surfboard.config.json. Sau vài giây, bạn sẽ thấy một cái gì đó như thế này:
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)
Hoan hô! Các thử nghiệm đã được thông qua. Bây giờ chúng ta hãy xem điều gì xảy ra khi sử dụng Waves Explorer: nhìn vào các khối hoặc dán một trong các địa chỉ trên vào tìm kiếm (ví dụ: địa chỉ tương ứng wallet#. Ở đó bạn có thể tìm thấy lịch sử giao dịch, trạng thái dApp, tệp nhị phân được dịch ngược.
Nhà thám hiểm sóng. Một ứng dụng vừa được triển khai.
Một số mẹo về ván lướt sóng:
1. Để kiểm tra trong môi trường testnet, hãy sử dụng:
Thiết lập Waves Keeper để hoạt động với nút cục bộ
2. Nhập cụm từ bí mật bằng mã thông báo cho mạng? Để đơn giản, hãy sử dụng hạt giống ban đầu của nút của bạn: waves private node seed with waves tokens. Địa chỉ: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.