Module 4 Exercise_ Aggregation v3
บทนำ
ในบทนี้ เราจะมาศึกษาว่า SubQuery Project คืออะไร, มีการสร้างโปรเจคบน SubQuery Project ได้อย่างไร และ ศึกษาการใช้งาน SubQuery Explorer
NB: “SubQuery Project” (uppercase P) is โซลูชั่นหลักที่ทาง SubQuery เป็นผู้ทำ
SubQuery project (lowercase p) หมายถึง โปรเจคทั่วไปบน SubQuery เช่น “account transfer SubQuery project”.
ข้อกำหนดเบื้องต้น
ไม่มี
แบบฝึกหัดที่ 1: Index Staking Rewards
ก่อนที่เราจะสามารถรวบรวมรางวัลการ stake ทั้งหมดที่ผู้ใช้ได้รับหรือจะให้เฉพาะเจาะจงกว่านั้นคือการที่เจ้าของบัญชี DOT ต้องทำการจัดการรางวัลทั้งหมดจากทำการ index staking
ขั้นตอนแบบย่อ
1. สร้างโปรเจ็กต์เริ่มต้น
2. อัปเดต mapping, ไฟล์ manifest และไฟล์สคีมาของ graphql
3. ทำการ generate, build และ deploy โค้ด
4. Deploy โค้ดไปยัง Docker
5. คิวรี่ยอดคงเหลือของ address บน playground
รายละเอียดของแต่ละขั้นตอน
ขั้นตอนที่ 1: สร้างโปรเจ็กต์เริ่มต้น
ในขั้นตอนแรกจะเป็นการสร้างโปรเจ็กต์ SubQuery ขึ้นมาด้วยคำสั่งดังต่อไปนี้
ขั้นตอนที่ 2: อัปเดตไฟล์สคีมาของ graphql
เพิ่มเอนทิตีที่เอาไว้เรียก StakingReward มีฟิลด์ที่ช่วยให้เราสามารถบันทึกรางวัลในบัญชีพร้อมกับยอดเงินคงเหลือ โดยสามารถรีเช็คจากการตรวจสอบความสูงของบล็อกได้
ขั้นตอนที่ 3: อัปเดตไฟล์ manifest (project.yaml)
ทำการอัปเดตไฟล์ manifest เพื่อรวบรวมเฉพาะตัวจัดการ handleStakingRewarded และอัปเดตเมธอดฟิลเตอร์เป็น Staking/Rewarded
หมายเหตุ: เมธอด Rewarded จะเริ่มตั้งแต่บล็อก 6,713,249 เป็นต้นไป ซึ่งก่อนหน้านี้เรียกว่ารางวัล ในแบบฝึกหัดนี้จะใช้รูปแบบที่ใหม่กว่านี้และใช้ startBlock ที่ 7,000,000
ไฟล์ Manifest แบบเต็มควรมีลักษณะดังนี้:
หมายเหตุ: ในตัวอย่างจะกำหนดให้เริ่มต้นความสูงของบล็อกที่ 7,000,000 มิฉะนั้นจะเกิดข้อผิดพลาดต่อไปนี้:
ขั้นตอนที่ 4: handleStakingRewarded
คำสั่งเริ่มต้นจะทำการสร้างไฟล์ mapping ซึ่งมี 3 ฟังก์ชัน ได้แก่ handleBlock, handleEvent และ handleCall ให้ทำการลบทั้งหมด
ต่อไปให้ทำการประกาศอ็อบเจ็กต์ event ดังนี้:
จากนั้นทำการประกาศอินสแตนซ์ใหม่ของอ็อบเจ็กต์ StakeReward และส่งผ่าน blockheight + เครื่องหมายขีด + eventid เพื่อสร้างตัวระบุที่ไม่ซ้ำกัน
จากนั้นเราจะได้รับ account, newReward และการประทับเวลาของบล็อก และเก็บไว้ในฟิลด์ที่เกี่ยวข้องภายในออบเจ็กต์เอนทิตี จากนั้นทำการบันทึกเอนทิตี
ไฟล์ mapping แบบเต็มควรมีลักษณะดังนี้:
ขั้นตอนที่ 5: สร้างโครงการ
เรียกใช้คำสั่ง yarn install, codegen, build และ docker-compose pull & docker-compose up
ขั้นตอนที่ 4: คิวรี่โครงการ
เมื่อคอนเทนเนอร์ Docker เริ่มทำงานแล้ว ซึ่งอาจใช้เวลาสักครู่หนึ่ง จากนั้นให้เปิดเบราว์เซอร์ของคุณและไปที่ www.localhost:3000
ซึ่งจะเป็นการเปิด playground ซึ่งคุณสามารถสร้างคำค้นหาได้ โดยคัดลอกตัวอย่างด้านล่างนี้:
ผลลัพธ์ที่ได้จะคล้ายกับด้านล่างนี้:
ยินดีด้วย ตอนนี้คุณได้ทำการจัดทำดัชนี staking rewards ทั้งหมดสำหรับทุกบัญชีตั้งแต่บล็อก 7 ล้านเป็นต้นไปแล้ว ต่อไปจะเป็นการรวบรวมหรือสรุปรางวัลของแต่ละบัญชี
แบบฝึกหัดที่ 2: Aggregate Staking Rewards
ในการรวม staking rewards ก่อนอื่นจะต้องทำการสร้างเอนทิตีขึ้นมา
ขั้นตอนโดยละเอียด
ขั้นตอนที่ 1: เพิ่มเอนทิตีที่เรียกว่า Sum Reward
เพิ่มเอนทิตีใหม่ชื่อ SumReward พร้อมฟิลด์พิเศษดังที่แสดงด้านล่าง
ไฟล์สคีมาใหม่ควรมีลักษณะดังนี้:
ขั้นตอนที่ 2: อัปเดตไฟล์ manifest
เพิ่มตัวจัดการพิเศษชื่อ handleSumRewarded และกรองโดย staking/Rewarded
ไฟล์ manifest ที่สมบูรณ์ควรมีลักษณะดังนี้:
หมายเหตุ: นี่คือวิธีที่คุณสามารถเพิ่มตัวจัดการ mapping มากกว่า 1 รายการในโครงการ โปรดทราบว่าคำสั่งซื้อมีความสำคัญเช่นกัน มิฉะนั้น คุณอาจพบข้อผิดพลาดเช่น:
ขั้นตอนที่ 3: handleSumRewarded
ต่อมาทำการสร้างฟังก์ชันชื่อ handleSumRewarded พร้อมกับฟังก์ชันตัวช่วยชื่อ createSumReward
หมายเหตุ: เรียกใช้คำสั่ง yarn codegen และนำเข้าเอนทิตีใหม่เพื่อลบข้อผิดพลาด
Get Piyapoj Kasempakdeepong’s stories in your inbox
Join Medium for free to get updates from this writer.
ไฟล์ mappings ควรมีลักษณะดังนี้:
ขั้นตอนที่ 4: สร้างโครงการใหม่
ดูการสร้างโครงการในแบบฝึกหัดก่อนหน้า
หมายเหตุ: เนื่องจากเราได้แก้ไขสคีมาให้ลบอินสแตนซ์ฐานข้อมูลของคุณในโฟลเดอร์ .data
ขั้นตอนที่ 5: คิวรี่โครงการ
คิวรี่ต่อไปนี้จะแสดงรายการรางวัลทั้งหมดสำหรับแต่ละบัญชี
ควรเห็นสิ่งที่คล้ายกับด้านล่างนี้:
ยอดเยี่ยม แต่จะดีกว่าไหมถ้าเราไม่เพียงแต่แสดง TotalReward เท่านั้น แต่ยังแสดงรางวัลส่วนบุคคลที่ประกอบเป็น TotalReward ได้ด้วย เราจะดูสิ่งนี้ในแบบฝึกหัดถัดไป
แบบฝึกหัดที่ 3: การดูรางวัล Staking ทั้งแบบรวมและแบบรายบุคคล
ในเวิร์กบุ๊กนี้ เราได้พยายามค้นหารางวัล Staking ทั้งหมด จากนั้นจึงรวมรวมหรือเพิ่มเข้าด้วยกันสำหรับแต่ละบัญชี ตอนนี้เราจะทำการปรับปรุงเพื่อให้เราสามารถดูจำนวนเงินรวมและจำนวนเงินแต่ละชุดเป็นชุดย่อย
ขั้นตอนโดยละเอียด
ขั้นตอนที่ 1: แก้ไขไฟล์สคีมา
อัปเดตฟิลด์สคีมา graphql ชื่อ SumReward ซึ่งเป็นสร้างความสัมพันธ์แบบเอนทิตีแบบ one-many โดยที่ sumReward จะประกอบด้วยรางวัล staking รายบุคคลจำนวนมาก
ขั้นตอนที่ 2: ตรวจสอบไฟล์ manifest
ตรวจสอบไฟล์ Manifest ควรลักษณะดังนี้:
ขั้นตอนที่ 3: อัปเดต handleStakingRewarded
ใน handleStakingRewarded, แก้ไข:
ถึง:
เนื่องจากเรากำลังสร้างความสัมพันธ์หรือลิงก์ระหว่างสองเอนทิตีหรือตารางของเราอย่างมีประสิทธิภาพ เอนทิตี StakingReward จำเป็นต้องมีคอลัมน์ที่เป็นค่าเดียวกับคอลัมน์คีย์หลักในเอนทิตี SumReward
เนื่องจากเอนทิตี SumReward ได้รับการกำหนดค่าบัญชี (account.toString()) เราจึงต้องดำเนินการเช่นเดียวกันนี้
อัปเดตไฟล์ mappings ให้มีลักษณะดังนี้:
ขั้นตอนที่ 4: สร้างโครงการใหม่
ดูการสร้างโครงการในแบบฝึกหัดก่อนหน้า
ขั้นตอนที่ 5: คิวรี่โครงการ
ตอนนี้สามารถเรียกใช้คิวรี่และใช้ช่อง stakingRewardsByAccountId ที่สร้างขึ้นโดยอัตโนมัติเพื่อค้นหารางวัล staking แต่ละรายการ
ด้านล่างนี้คือตัวอย่างการคิวรี่ของบัญชีหนึ่ง
ผลลัพธ์ที่ได้แสดงให้เห็นว่ารางวัลรวม 4049635655 ประกอบด้วยสองยอดคงเหลือ
แบบฝึกหัดที่ 4: Reward v Rewarded
จนถึงตอนนี้เราได้ใช้วิธี Rewarded ในไฟล์ Manifest ซึ่งเพิ่งเปิดตัวจากบล็อก 6713249 เป็นต้นไปตามที่กล่าวไว้ก่อนหน้า ซึ่งก่อนหน้านี้มันถูกเรียกว่า Reward ดังนั้นเพื่อเก็บรางวัล staking ทั้งหมดก่อนการเปลี่ยนแปลงนี้ เราจำเป็นต้องอัปเดตโค้ดของเรา
ขั้นตอนที่ 1: อัปเดตไฟล์ manifest
เพิ่มตัวกรอง mapping ต่อไปนี้ในไฟล์ manifest โดยพื้นฐานแล้วเราได้ลบ “ed” ออกจากชื่อตัวจัดการและเมธอด
นอกจากนี้ การเปลี่ยนบล็อกเริ่มต้นเป็น 6,000,000 จะส่งผลให้ข้อมูลรางวัล staking ถูกส่งกลับ
เมื่อคุณทำการเปลี่ยนบล็อกเริ่มต้น อย่าลืมลบฐานข้อมูลและทำดัชนีใหม่
ขั้นตอนที่ 2: อัปเดตไฟล์ mapping
เราสามารถสร้างฟังก์ชันเปลี่ยนเส้นทางจากเมธอดแบบเก่าเพื่อใช้โค้ดเดียวกันกับที่เราได้บันทึกเหตุการณ์ไว้แล้ว
ขั้นตอนที่ 3: สร้างโครงการใหม่
ดูการสร้างโครงการในแบบฝึกหัดก่อนหน้า
ขั้นตอนที่ 4: คิวรี่โครงการ
เรียกใช้คิวรี่ก่อนหน้าและข้อมูลควรปรากฏขึ้นอีกครั้งสำหรับบล็อกที่เริ่มต้นจาก 6M หมายเหตุ คุณอาจต้องรอจนกว่าจะสร้างดัชนีบล็อกที่เกี่ยวข้องก่อน
คุณควรเห็น:






