Sitemap
SubQuery-th

About SubQuery

Module 4 Exercise_ Aggregation v3

5 min readMar 29, 2022

--

Press enter or click to view image in full size

บทนำ

ในบทนี้ เราจะมาศึกษาว่า 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 ขึ้นมาด้วยคำสั่งดังต่อไปนี้

Press enter or click to view image in full size

ขั้นตอนที่ 2: อัปเดตไฟล์สคีมาของ graphql

เพิ่มเอนทิตีที่เอาไว้เรียก StakingReward มีฟิลด์ที่ช่วยให้เราสามารถบันทึกรางวัลในบัญชีพร้อมกับยอดเงินคงเหลือ โดยสามารถรีเช็คจากการตรวจสอบความสูงของบล็อกได้

Press enter or click to view image in full size

ขั้นตอนที่ 3: อัปเดตไฟล์ manifest (project.yaml)

ทำการอัปเดตไฟล์ manifest เพื่อรวบรวมเฉพาะตัวจัดการ handleStakingRewarded และอัปเดตเมธอดฟิลเตอร์เป็น Staking/Rewarded

Press enter or click to view image in full size

หมายเหตุ: เมธอด Rewarded จะเริ่มตั้งแต่บล็อก 6,713,249 เป็นต้นไป ซึ่งก่อนหน้านี้เรียกว่ารางวัล ในแบบฝึกหัดนี้จะใช้รูปแบบที่ใหม่กว่านี้และใช้ startBlock ที่ 7,000,000

ไฟล์ Manifest แบบเต็มควรมีลักษณะดังนี้:

Press enter or click to view image in full size

หมายเหตุ: ในตัวอย่างจะกำหนดให้เริ่มต้นความสูงของบล็อกที่ 7,000,000 มิฉะนั้นจะเกิดข้อผิดพลาดต่อไปนี้:

Press enter or click to view image in full size

ขั้นตอนที่ 4: handleStakingRewarded

คำสั่งเริ่มต้นจะทำการสร้างไฟล์ mapping ซึ่งมี 3 ฟังก์ชัน ได้แก่ handleBlock, handleEvent และ handleCall ให้ทำการลบทั้งหมด

Press enter or click to view image in full size

ต่อไปให้ทำการประกาศอ็อบเจ็กต์ event ดังนี้:

Press enter or click to view image in full size

จากนั้นทำการประกาศอินสแตนซ์ใหม่ของอ็อบเจ็กต์ StakeReward และส่งผ่าน blockheight + เครื่องหมายขีด + eventid เพื่อสร้างตัวระบุที่ไม่ซ้ำกัน

Press enter or click to view image in full size

จากนั้นเราจะได้รับ account, newReward และการประทับเวลาของบล็อก และเก็บไว้ในฟิลด์ที่เกี่ยวข้องภายในออบเจ็กต์เอนทิตี จากนั้นทำการบันทึกเอนทิตี

Press enter or click to view image in full size

ไฟล์ mapping แบบเต็มควรมีลักษณะดังนี้:

Press enter or click to view image in full size

ขั้นตอนที่ 5: สร้างโครงการ

เรียกใช้คำสั่ง yarn install, codegen, build และ docker-compose pull & docker-compose up

Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size

ขั้นตอนที่ 4: คิวรี่โครงการ

เมื่อคอนเทนเนอร์ Docker เริ่มทำงานแล้ว ซึ่งอาจใช้เวลาสักครู่หนึ่ง จากนั้นให้เปิดเบราว์เซอร์ของคุณและไปที่ www.localhost:3000

ซึ่งจะเป็นการเปิด playground ซึ่งคุณสามารถสร้างคำค้นหาได้ โดยคัดลอกตัวอย่างด้านล่างนี้:

Press enter or click to view image in full size

ผลลัพธ์ที่ได้จะคล้ายกับด้านล่างนี้:

Press enter or click to view image in full size
Press enter or click to view image in full size

ยินดีด้วย ตอนนี้คุณได้ทำการจัดทำดัชนี staking rewards ทั้งหมดสำหรับทุกบัญชีตั้งแต่บล็อก 7 ล้านเป็นต้นไปแล้ว ต่อไปจะเป็นการรวบรวมหรือสรุปรางวัลของแต่ละบัญชี

แบบฝึกหัดที่ 2: Aggregate Staking Rewards

ในการรวม staking rewards ก่อนอื่นจะต้องทำการสร้างเอนทิตีขึ้นมา

ขั้นตอนโดยละเอียด

ขั้นตอนที่ 1: เพิ่มเอนทิตีที่เรียกว่า Sum Reward

เพิ่มเอนทิตีใหม่ชื่อ SumReward พร้อมฟิลด์พิเศษดังที่แสดงด้านล่าง

Press enter or click to view image in full size

ไฟล์สคีมาใหม่ควรมีลักษณะดังนี้:

Press enter or click to view image in full size
Press enter or click to view image in full size

ขั้นตอนที่ 2: อัปเดตไฟล์ manifest

เพิ่มตัวจัดการพิเศษชื่อ handleSumRewarded และกรองโดย staking/Rewarded

Press enter or click to view image in full size

ไฟล์ manifest ที่สมบูรณ์ควรมีลักษณะดังนี้:

Press enter or click to view image in full size
Press enter or click to view image in full size

หมายเหตุ: นี่คือวิธีที่คุณสามารถเพิ่มตัวจัดการ mapping มากกว่า 1 รายการในโครงการ โปรดทราบว่าคำสั่งซื้อมีความสำคัญเช่นกัน มิฉะนั้น คุณอาจพบข้อผิดพลาดเช่น:

Press enter or click to view image in full size

ขั้นตอนที่ 3: handleSumRewarded

ต่อมาทำการสร้างฟังก์ชันชื่อ handleSumRewarded พร้อมกับฟังก์ชันตัวช่วยชื่อ createSumReward

Press enter or click to view image in full size

หมายเหตุ: เรียกใช้คำสั่ง yarn codegen และนำเข้าเอนทิตีใหม่เพื่อลบข้อผิดพลาด

Get Piyapoj Kasempakdeepong’s stories in your inbox

Join Medium for free to get updates from this writer.

ไฟล์ mappings ควรมีลักษณะดังนี้:

ขั้นตอนที่ 4: สร้างโครงการใหม่

ดูการสร้างโครงการในแบบฝึกหัดก่อนหน้า

หมายเหตุ: เนื่องจากเราได้แก้ไขสคีมาให้ลบอินสแตนซ์ฐานข้อมูลของคุณในโฟลเดอร์ .data

ขั้นตอนที่ 5: คิวรี่โครงการ

คิวรี่ต่อไปนี้จะแสดงรายการรางวัลทั้งหมดสำหรับแต่ละบัญชี

Press enter or click to view image in full size

ควรเห็นสิ่งที่คล้ายกับด้านล่างนี้:

Press enter or click to view image in full size
Press enter or click to view image in full size

ยอดเยี่ยม แต่จะดีกว่าไหมถ้าเราไม่เพียงแต่แสดง TotalReward เท่านั้น แต่ยังแสดงรางวัลส่วนบุคคลที่ประกอบเป็น TotalReward ได้ด้วย เราจะดูสิ่งนี้ในแบบฝึกหัดถัดไป

แบบฝึกหัดที่ 3: การดูรางวัล Staking ทั้งแบบรวมและแบบรายบุคคล

ในเวิร์กบุ๊กนี้ เราได้พยายามค้นหารางวัล Staking ทั้งหมด จากนั้นจึงรวมรวมหรือเพิ่มเข้าด้วยกันสำหรับแต่ละบัญชี ตอนนี้เราจะทำการปรับปรุงเพื่อให้เราสามารถดูจำนวนเงินรวมและจำนวนเงินแต่ละชุดเป็นชุดย่อย

ขั้นตอนโดยละเอียด

ขั้นตอนที่ 1: แก้ไขไฟล์สคีมา

อัปเดตฟิลด์สคีมา graphql ชื่อ SumReward ซึ่งเป็นสร้างความสัมพันธ์แบบเอนทิตีแบบ one-many โดยที่ sumReward จะประกอบด้วยรางวัล staking รายบุคคลจำนวนมาก

Press enter or click to view image in full size

ขั้นตอนที่ 2: ตรวจสอบไฟล์ manifest

ตรวจสอบไฟล์ Manifest ควรลักษณะดังนี้:

Press enter or click to view image in full size
Press enter or click to view image in full size

ขั้นตอนที่ 3: อัปเดต handleStakingRewarded

ใน handleStakingRewarded, แก้ไข:

Press enter or click to view image in full size

ถึง:

Press enter or click to view image in full size

เนื่องจากเรากำลังสร้างความสัมพันธ์หรือลิงก์ระหว่างสองเอนทิตีหรือตารางของเราอย่างมีประสิทธิภาพ เอนทิตี StakingReward จำเป็นต้องมีคอลัมน์ที่เป็นค่าเดียวกับคอลัมน์คีย์หลักในเอนทิตี SumReward

เนื่องจากเอนทิตี SumReward ได้รับการกำหนดค่าบัญชี (account.toString()) เราจึงต้องดำเนินการเช่นเดียวกันนี้

อัปเดตไฟล์ mappings ให้มีลักษณะดังนี้:

ขั้นตอนที่ 4: สร้างโครงการใหม่

ดูการสร้างโครงการในแบบฝึกหัดก่อนหน้า

ขั้นตอนที่ 5: คิวรี่โครงการ

ตอนนี้สามารถเรียกใช้คิวรี่และใช้ช่อง stakingRewardsByAccountId ที่สร้างขึ้นโดยอัตโนมัติเพื่อค้นหารางวัล staking แต่ละรายการ

ด้านล่างนี้คือตัวอย่างการคิวรี่ของบัญชีหนึ่ง

Press enter or click to view image in full size

ผลลัพธ์ที่ได้แสดงให้เห็นว่ารางวัลรวม 4049635655 ประกอบด้วยสองยอดคงเหลือ

Press enter or click to view image in full size

แบบฝึกหัดที่ 4: Reward v Rewarded

จนถึงตอนนี้เราได้ใช้วิธี Rewarded ในไฟล์ Manifest ซึ่งเพิ่งเปิดตัวจากบล็อก 6713249 เป็นต้นไปตามที่กล่าวไว้ก่อนหน้า ซึ่งก่อนหน้านี้มันถูกเรียกว่า Reward ดังนั้นเพื่อเก็บรางวัล staking ทั้งหมดก่อนการเปลี่ยนแปลงนี้ เราจำเป็นต้องอัปเดตโค้ดของเรา

ขั้นตอนที่ 1: อัปเดตไฟล์ manifest

เพิ่มตัวกรอง mapping ต่อไปนี้ในไฟล์ manifest โดยพื้นฐานแล้วเราได้ลบ “ed” ออกจากชื่อตัวจัดการและเมธอด

Press enter or click to view image in full size
Press enter or click to view image in full size

นอกจากนี้ การเปลี่ยนบล็อกเริ่มต้นเป็น 6,000,000 จะส่งผลให้ข้อมูลรางวัล staking ถูกส่งกลับ

เมื่อคุณทำการเปลี่ยนบล็อกเริ่มต้น อย่าลืมลบฐานข้อมูลและทำดัชนีใหม่

ขั้นตอนที่ 2: อัปเดตไฟล์ mapping

เราสามารถสร้างฟังก์ชันเปลี่ยนเส้นทางจากเมธอดแบบเก่าเพื่อใช้โค้ดเดียวกันกับที่เราได้บันทึกเหตุการณ์ไว้แล้ว

Press enter or click to view image in full size

ขั้นตอนที่ 3: สร้างโครงการใหม่

ดูการสร้างโครงการในแบบฝึกหัดก่อนหน้า

ขั้นตอนที่ 4: คิวรี่โครงการ

เรียกใช้คิวรี่ก่อนหน้าและข้อมูลควรปรากฏขึ้นอีกครั้งสำหรับบล็อกที่เริ่มต้นจาก 6M หมายเหตุ คุณอาจต้องรอจนกว่าจะสร้างดัชนีบล็อกที่เกี่ยวข้องก่อน

Press enter or click to view image in full size

คุณควรเห็น:

Press enter or click to view image in full size

--

--