สวัสดี! ในบทความนี้ ฉันจะแสดงวิธีการเขียนและเรียกใช้ dApp ปกติบนโหนด Waves มาดูเครื่องมือ วิธีการ และตัวอย่างการพัฒนาที่จำเป็นกัน
รูปแบบการพัฒนาสำหรับ dApps และแอปพลิเคชันทั่วไปเกือบจะเหมือนกัน:
- เราเขียนรหัส
- การเขียนการทดสอบอัตโนมัติ
- เปิดตัวแอปพลิเคชั่น
- การทดสอบ
เครื่องมือ
1. docker
เพื่อรันโหนดและ Waves Explorer
หากคุณไม่ต้องการเริ่มโหนด คุณสามารถข้ามขั้นตอนนี้ได้ ท้ายที่สุดแล้วก็มีเครือข่ายการทดสอบและการทดลอง แต่หากไม่มีการปรับใช้โหนดของคุณเอง กระบวนการทดสอบอาจใช้เวลานาน
- คุณจะต้องมีบัญชีใหม่ที่มีโทเค็นทดสอบอยู่ตลอดเวลา faucet เครือข่ายทดสอบจะถ่ายโอน 10 WAVES ทุก ๆ 10 นาที
- เวลาบล็อกโดยเฉลี่ยในเครือข่ายทดสอบคือ 1 นาที ในโหนด – 15 วินาที สิ่งนี้จะสังเกตได้ชัดเจนเป็นพิเศษเมื่อธุรกรรมต้องมีการยืนยันหลายครั้ง
- การแคชเชิงรุกสามารถทำได้บนโหนดทดสอบสาธารณะ
- นอกจากนี้ยังอาจไม่สามารถใช้งานได้ชั่วคราวเนื่องจากการบำรุงรักษา
จากนี้ไป ฉันจะถือว่าคุณกำลังทำงานกับโหนดของคุณเอง
2. เครื่องมือบรรทัดคำสั่งกระดานโต้คลื่น
- ดาวน์โหลดและติดตั้ง Node.js โดยใช้ ppa, homebrew หรือ exe ที่นี่:
https://nodejs.org/en/download/ . - ติดตั้ง Surfboard ซึ่งเป็นเครื่องมือที่ช่วยให้คุณสามารถรันการทดสอบบนโหนดที่มีอยู่ได้
npm install -g @waves/surfboard
3. ปลั๊กอินรหัส Visual Studio
ขั้นตอนนี้เป็นทางเลือกหากคุณไม่ใช่แฟนของ IDE และชอบโปรแกรมแก้ไขข้อความ เครื่องมือที่จำเป็นทั้งหมดคือยูทิลิตี้บรรทัดคำสั่ง หากคุณใช้เป็นกลุ่ม ให้ใส่ใจกับปลั๊กอิน
ดาวน์โหลดและติดตั้งรหัส Visual Studio:
เปิด VS Code และติดตั้งปลั๊กอิน wave-ride:
ส่วนขยายเบราว์เซอร์ Waves Keeper:
Done!
เรียกใช้โหนดและ Waves Explorer
1. เริ่มต้นโหนด:
docker run -d -p 6869:6869 wavesplatform/waves-private-node
ตรวจสอบให้แน่ใจว่าโหนดถูกเปิดใช้งานผ่าน REST API
Swagger REST API สำหรับโหนด
2. เริ่มต้นอินสแตนซ์ของ Waves Explorer:
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
เปิดเบราว์เซอร์และไปที่
Waves Explorer แสดงอินสแตนซ์โหนดในเครื่อง
โครงสร้าง RIDE และเครื่องมือเซิร์ฟบอร์ด
สร้างไดเร็กทอรีว่างและรันคำสั่งในนั้น
surfboard init
คำสั่งเริ่มต้นไดเร็กทอรีด้วยโครงสร้างโปรเจ็กต์ แอปพลิเคชัน "hello world" และการทดสอบ หากคุณเปิดโฟลเดอร์นี้ด้วย VS Code คุณจะเห็น:
เซิร์ฟบอร์ด.config.json
- ภายใต้โฟลเดอร์ ./ride/ คุณจะพบไฟล์เดียว wallet.ride ซึ่งเป็นไดเร็กทอรีที่มีโค้ด dApp อยู่ เราจะวิเคราะห์ dApps สั้นๆ ในบล็อกถัดไป
- ภายใต้โฟลเดอร์ ./test/ คุณจะพบไฟล์ *.js การทดสอบจะถูกเก็บไว้ที่นี่
- ./surfboard.config.json – ไฟล์กำหนดค่าสำหรับการรันการทดสอบ
Envs เป็นส่วนสำคัญ แต่ละสภาพแวดล้อมได้รับการกำหนดค่าดังนี้:
- ตำแหน่งข้อมูล REST API ของโหนดที่จะใช้ในการเปิดใช้ dApp และ CHAIN_ID ของเครือข่าย
- วลีลับสำหรับบัญชีที่มีโทเค็นที่จะเป็นแหล่งที่มาของโทเค็นทดสอบของคุณ
อย่างที่คุณเห็น surfboard.config.json รองรับหลายสภาพแวดล้อมตามค่าเริ่มต้น ค่าเริ่มต้นคือสภาพแวดล้อมภายในเครื่อง (คีย์ defaultEnv เป็นพารามิเตอร์ที่เปลี่ยนแปลงได้)
แอปพลิเคชั่น Wallet-สาธิต
ส่วนนี้ไม่ใช่การอ้างอิงถึงภาษา RIDE แต่ให้ดูที่แอปพลิเคชันที่เราปรับใช้และทดสอบเพื่อทำความเข้าใจกับสิ่งที่เกิดขึ้นในบล็อกเชนให้ดียิ่งขึ้น
มาดูแอปพลิเคชัน Wallet-demo ง่ายๆ กัน ใครๆ ก็สามารถส่งโทเค็นไปยังที่อยู่ dApp ได้ คุณสามารถถอนได้เฉพาะ WAVES ของคุณเท่านั้น ฟังก์ชัน @Callable สองฟังก์ชันมีให้ใช้งานได้ผ่าน InvokeScriptTransaction:
deposit()
ซึ่งต้องแนบการชำระเงินเป็น WAVESwithdraw(amount: Int)
ซึ่งส่งคืนโทเค็น
ตลอดวงจรการใช้งาน dApp โครงสร้าง (ที่อยู่ → จำนวน) จะถูกรักษาไว้:
การกระทำ
สถานะผลลัพธ์
แรกเริ่ม
ไม่มีข้อมูล
อลิซฝาก 5 WAVES
ที่อยู่อลิซ → 500000000
บ๊อบฝาก 2 WAVES
ที่อยู่อลิซ → 500000000
ที่อยู่บ๊อบ → 200000000
บ๊อบถอน 7 WAVES
ปฏิเสธ!
อลิซถอน 4 WAVES
ที่อยู่อลิซ → 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
สามารถดูโค้ดตัวอย่างได้ที่
ปลั๊กอิน VSCode รองรับการคอมไพล์อย่างต่อเนื่องในขณะที่แก้ไขไฟล์ ดังนั้น คุณสามารถตรวจสอบข้อผิดพลาดได้ตลอดเวลาในแท็บปัญหา
หากคุณต้องการใช้โปรแกรมแก้ไขข้อความอื่นเมื่อรวบรวมไฟล์ ให้ใช้
surfboard compile ride/wallet.ride
สิ่งนี้จะส่งออกชุดรหัส RIDE ที่คอมไพล์แล้ว base64
สคริปต์ทดสอบสำหรับ 'wallet.ride'
มาดูกัน
- “ก่อน” ระดมทุนหลายบัญชีผ่าน MassTransferTransaction รวบรวมสคริปต์และปรับใช้กับบล็อกเชน
- “สามารถฝากเงิน” จะส่ง InvokeScriptTransaction ไปยังเครือข่าย เพื่อเปิดใช้งานฟังก์ชันการฝากเงิน() สำหรับแต่ละบัญชีของทั้งสองบัญชี
- “ไม่สามารถถอนออกได้มากกว่าที่ฝากไว้” การทดสอบที่ไม่มีใครสามารถขโมยโทเค็นของผู้อื่นได้
- “ฝากได้” เช็คว่าการถอนเงินดำเนินการอย่างถูกต้อง
เรียกใช้การทดสอบจาก 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 ไฟล์ไบนารีที่ถอดรหัสแล้ว
นักสำรวจคลื่น แอปพลิเคชันที่เพิ่งถูกปรับใช้
เคล็ดลับการเล่นกระดานโต้คลื่น:
1. หากต้องการทดสอบในสภาพแวดล้อม testnet ให้ใช้:
surfboard test --env=testnet
2. หากคุณต้องการดูธุรกรรมเวอร์ชัน JSON และวิธีประมวลผลโดยโหนด ให้รันการทดสอบด้วย -v (หมายถึง 'verbose'):
surfboard test -v
การใช้งานแอพด้วย Waves Keeper
1. ตั้งค่า Waves Keeper ให้ทำงาน:
การตั้งค่า Waves Keeper ให้ทำงานกับโหนดในเครื่อง
2. นำเข้าวลีลับพร้อมโทเค็นสำหรับเครือข่ายหรือไม่ เพื่อความง่าย ให้ใช้ seed เริ่มต้นของโหนดของคุณ: waves private node seed with waves tokens
. ที่อยู่: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF
.
3. คุณสามารถเรียกใช้แอปพลิเคชันหน้าเดียวแบบไร้เซิร์ฟเวอร์ได้ด้วยตัวเองโดยใช้ npm หรือไปที่อันที่มีอยู่:
4. ป้อนที่อยู่กระเป๋าสตางค์จากการทดสอบ (ขีดเส้นใต้ด้านบน) ลงในกล่องข้อความที่อยู่ dApp
5. ป้อนจำนวนเล็กน้อยในช่อง “เงินฝาก” แล้วคลิกปุ่ม:
Waves Keeper ร้องขอการอนุญาตให้ลงนามใน InvokeScriptTransaction โดยชำระเงิน 10 WAVES
6. ยืนยันการทำรายการ:
ธุรกรรมถูกสร้างขึ้นและออกอากาศไปยังเครือข่าย ตอนนี้คุณสามารถดู ID ของเธอได้แล้ว
7. ตรวจสอบธุรกรรมโดยใช้ Waves Explorer ป้อน ID ในช่องค้นหา
บทสรุปและข้อมูลเพิ่มเติม
เราพิจารณาเครื่องมือสำหรับการพัฒนา ทดสอบ ปรับใช้ และใช้งาน dApps อย่างง่ายบนแพลตฟอร์ม Waves:
- ภาษาขี่
- โปรแกรมแก้ไขรหัส VS
- นักสำรวจคลื่น
- กระดานโต้คลื่น
- ผู้ดูแลคลื่น
ลิงค์สำหรับผู้ที่ต้องการเรียนรู้ RIDE ต่อไป:
ดำดิ่งสู่หัวข้อ RIDE ต่อไปและสร้าง dApp แรกของคุณ!
TL; DR:
ที่มา: will.com