سلام! در این مقاله به شما نشان خواهم داد که چگونه یک dApp معمولی را روی گره Waves بنویسید و اجرا کنید. بیایید ابزارها، روش ها و نمونه ای از توسعه را بررسی کنیم.
طرح توسعه برای dApps و برنامه های معمولی تقریباً یکسان است:
ما کد را می نویسیم
نوشتن تست خودکار
راه اندازی برنامه
آزمایش کردن
ابزارهای
1. docker برای اجرای گره و Waves Explorer
اگر نمی خواهید یک گره راه اندازی کنید، می توانید از این مرحله رد شوید. بالاخره یک شبکه آزمایشی و آزمایشی وجود دارد. اما بدون استقرار گره خود، فرآیند آزمایش ممکن است طولانی شود.
شما دائماً به حساب های جدید با توکن های آزمایشی نیاز خواهید داشت. شیر آب آزمایشی شبکه هر 10 دقیقه 10 موج انتقال می دهد.
میانگین زمان بلوک در شبکه آزمایشی 1 دقیقه، در گره - 15 ثانیه است. این امر به ویژه زمانی قابل توجه است که یک تراکنش نیاز به تأییدهای متعدد داشته باشد.
ذخیره سازی تهاجمی در گره های آزمایشی عمومی امکان پذیر است.
همچنین ممکن است به دلیل تعمیر و نگهداری موقتاً در دسترس نباشند.
از این به بعد من فرض می کنم که شما با گره خود کار می کنید.
Surfboard را نصب کنید، ابزاری که به شما امکان میدهد آزمایشها را روی یک گره موجود اجرا کنید.
npm install -g @waves/surfboard
3. افزونه Visual Studio Code
اگر طرفدار IDE نیستید و ویرایشگرهای متن را ترجیح می دهید، این مرحله اختیاری است. تمام ابزارهای لازم ابزارهای خط فرمان هستند. اگر از vim استفاده می کنید به افزونه توجه کنید vim-ride.
کد ویژوال استودیو را دانلود و نصب کنید: https://code.visualstudio.com/
VS Code را باز کنید و افزونه waves-ride را نصب کنید:
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
یک مرورگر باز کنید و به آن بروید http://localhost:3000. خواهید دید که با چه سرعتی یک مدار گره محلی خالی ساخته می شود.
Waves Explorer یک نمونه گره محلی را نمایش می دهد
ساختار سوار و ابزار تخته موج سواری
یک دایرکتوری خالی ایجاد کنید و دستور را در آن اجرا کنید
surfboard init
این دستور یک دایرکتوری را با ساختار پروژه، برنامههای کاربردی و آزمایشهای «hello world» مقداردهی اولیه میکند. اگر این پوشه را با VS Code باز کنید، خواهید دید:
Surfboard.config.json
در زیر پوشه ./ride/ یک فایل wallet.ride را پیدا خواهید کرد - دایرکتوری که کد dApp در آن قرار دارد. در بلوک بعدی به طور خلاصه dApps را تحلیل خواهیم کرد.
در زیر پوشه ./test/ یک فایل *.js پیدا خواهید کرد. تست ها در اینجا ذخیره می شوند.
./surfboard.config.json – فایل پیکربندی برای اجرای آزمایش ها.
Envs بخش مهمی است. هر محیط به صورت زیر پیکربندی شده است:
نقطه پایانی REST API گره که برای راهاندازی dApp و CHAIN_ID شبکه استفاده میشود.
یک عبارت مخفی برای یک حساب کاربری با توکن هایی که منابع توکن های آزمایشی شما خواهند بود.
همانطور که می بینید، surfboard.config.json به طور پیش فرض از چندین محیط پشتیبانی می کند. پیش فرض محیط محلی است (کلید defaultEnv یک پارامتر قابل تغییر است).
برنامه کیف پول نمایشی
این بخش اشاره ای به زبان RIDE نیست. در عوض، نگاهی به برنامهای که برای درک بهتر آنچه در بلاک چین رخ میدهد، استقرار و آزمایش میکنیم.
بیایید به یک برنامه ساده Wallet-demo نگاه کنیم. هر کسی می تواند توکن ها را به آدرس dApp ارسال کند. شما فقط می توانید WAVES خود را خارج کنید. دو تابع @Callable از طریق InvokeScriptTransaction در دسترس هستند:
deposit()که نیاز به پرداخت پیوست در WAVES دارد
withdraw(amount: Int)که توکن ها را برمی گرداند
در طول چرخه عمر dApp، ساختار (آدرس → مقدار) حفظ خواهد شد:
عمل
حالت حاصل
اول
خالی
آلیس 5 موج رسوب می دهد
آدرس آلیس ← 500000000
باب 2 موج رسوب می کند
آدرس آلیس ← 500000000
آدرس باب → 200000000
باب 7 موج را برمی دارد
تکذیب کرد!
آلیس 4 موج را پس می گیرد
آدرس آلیس ← 100000000
آدرس باب → 200000000
این کد برای درک کامل وضعیت است:
# 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
کد نمونه را نیز می توانید در این آدرس پیدا کنید GitHub.
افزونه VSCode از کامپایل مداوم در حین ویرایش فایل پشتیبانی می کند. بنابراین، همیشه می توانید خطاها را در برگه مشکلات نظارت کنید.
اگر می خواهید هنگام کامپایل کردن فایل از ویرایشگر متن دیگری استفاده کنید، استفاده کنید
surfboard compile ride/wallet.ride
با این کار یک سری کد RIDE کامپایل شده در base64 تولید می شود.
اسکریپت تست برای "wallet.ride"
بیایید نگاهی بیندازیم به فایل تست. پشتیبانی شده توسط چارچوب موکای جاوا اسکریپت. یک تابع "قبل" و سه تست وجود دارد:
«پیش از» چندین حساب را از طریق MassTransferTransaction تأمین مالی می کند، اسکریپت را کامپایل می کند و آن را در بلاک چین مستقر می کند.
"Can depozit" یک InvokeScriptTransaction را به شبکه ارسال می کند و تابع ()deposit را برای هر یک از دو حساب فعال می کند.
تستهای «نمیتوان بیش از آنچه واریز شده برداشت کرد» که هیچکس نمیتواند توکنهای دیگران را بدزدد.
«می توانم واریز کنم» چک می کند که برداشت ها به درستی پردازش شده اند.
تست ها را از تخته موج سواری اجرا کنید و نتایج را در Waves Explorer تجزیه و تحلیل کنید
برای اجرای تست، اجرا کنید
surfboard test
اگر چندین اسکریپت دارید (به عنوان مثال، به یک اسکریپت استقرار جداگانه نیاز دارید)، می توانید اجرا کنید
surfboard test my-scenario.js
Surfboard فایل های آزمایشی را در پوشه ./test/ جمع آوری می کند و اسکریپت را روی گره ای که در surfboard.config.json پیکربندی شده است اجرا می کند. بعد از چند ثانیه چیزی شبیه به این خواهید دید:
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)
هورا! تست ها پاس شد. حال بیایید به اتفاقاتی که هنگام استفاده از Waves Explorer روی می دهد نگاهی بیندازیم: به بلوک ها نگاه کنید یا یکی از آدرس های بالا را در جستجو قرار دهید (به عنوان مثال، آدرس مربوطه wallet#. در آنجا می توانید تاریخچه تراکنش، وضعیت dApp، فایل باینری دیکامپایل شده را پیدا کنید.
کاوشگر امواج. برنامه ای که به تازگی راه اندازی شده است.
2. عبارت مخفی را با توکن برای شبکه وارد کنید؟ برای سادگی، از seed اولیه گره خود استفاده کنید: waves private node seed with waves tokens. نشانی: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.