قم بتثبيت Surfboard، وهي أداة تسمح لك بإجراء الاختبارات على عقدة موجودة.
npm install -g @waves/surfboard
3. البرنامج المساعد Visual Studio Code
هذه الخطوة اختيارية إذا لم تكن من محبي IDEs وتفضل برامج تحرير النصوص. جميع الأدوات اللازمة هي أدوات مساعدة لسطر الأوامر. إذا كنت تستخدم vim، انتبه إلى البرنامج المساعد ركوب vim.
قم بتنزيل وتثبيت كود Visual Studio: https://code.visualstudio.com/
افتح VS Code وقم بتثبيت البرنامج الإضافي Waves-Ride:
Envs هو قسم مهم. يتم تكوين كل بيئة على النحو التالي:
نقطة نهاية REST API للعقدة التي سيتم استخدامها لتشغيل dApp وCHAIN_ID للشبكة.
عبارة سرية لحساب يحتوي على الرموز المميزة التي ستكون مصادر الرموز الاختبارية الخاصة بك.
كما ترون، يدعم Surfboard.config.json بيئات متعددة بشكل افتراضي. الافتراضي هو البيئة المحلية (مفتاح defaultEnv هو معلمة قابلة للتغيير).
تطبيق المحفظة التجريبي
هذا القسم ليس مرجعًا للغة RIDE. بدلاً من ذلك، قم بإلقاء نظرة على التطبيق الذي نقوم بنشره واختباره لفهم ما يحدث في blockchain بشكل أفضل.
دعونا نلقي نظرة على تطبيق Wallet-demo البسيط. يمكن لأي شخص إرسال الرموز المميزة إلى عنوان dApp. يمكنك فقط سحب موجاتك. تتوفر وظيفتانCallable عبر InvocScriptTransaction:
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"
دعنا ننظر إلى ملف الاختبار. مدعوم من إطار عمل جافا سكريبت Mocha. هناك وظيفة "قبل" وثلاثة اختبارات:
تقوم "قبل" بتمويل حسابات متعددة عبر MassTransferTransaction، وتجميع البرنامج النصي ونشره على blockchain.
يرسل خيار "إمكانية الإيداع" InvocScriptTransaction إلى الشبكة، مما يؤدي إلى تنشيط وظيفة الإيداع () لكل حساب من الحسابين.
اختبارات "لا يمكن سحب أكثر مما تم إيداعه" لا يمكن لأحد أن يسرق رموز الآخرين.
يتحقق "إمكانية الإيداع" من معالجة عمليات السحب بشكل صحيح.
قم بإجراء الاختبارات من Surfboard وتحليل النتائج في 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. استيراد عبارة سرية مع الرموز المميزة للشبكة؟ للتبسيط، استخدم البذرة الأولية للعقدة الخاصة بك: waves private node seed with waves tokens. عنوان: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.