GraphQL ด้วย Graph Node บน JIB Chain
Wed Jan 18 2023
2 min read
ผมไม่ได้เข้ามา blog นานพอสมควร เนื่องด้วยภาระกิจต่าง ๆ (ด้าน Blockchain นี่แหละครับ)
เดี๋ยวผมขอสรุป GraphQL กันหน่อยคืออะไร ถ้าสรุปสั้นๆ ก็เป็น A query language for your API ปกติเวลาเราทำ RESTFul API เราต้องไปดึงข้อมูลจาก database มาให้บริการ ไม่ว่าจะเป็น RMDB หรือ Documents DB แต่สุดท้ายตอนที่เราต้องส่งกลับ เราต้อง define structure กลับอยู่ดี ซึ่งตอน define structure นี้ ก็จะแล้วแต่ว่าฝั่งผู้เรียกต้องการใช้ข้อมูลอะไรบ้าง เราก็ส่งกลับไปให้ ซึ่งก็เป็นท่าปกติครับ
แต่ถ้าผู้ขอข้อมูลคนอื่น ต้องการข้อมูลบางอย่างเพิ่ม ฝั่งที่ดูและ API ก็จะมาปรับ Code โดยการเพิ่ม Data Fields ที่ผู้ข้อต้องการกลับไปให้แทนที่จะสร้างใหม่ เพราะเห็นว่าข้อมูลบางอย่างสามารถใช้ร่วมกันได้ ผู้ขอก็จะใช้งานได้ ซึ่งปัญหาเกิดขึ้นตรงนี้ครับ คือผู้ขอคนแรกๆ หรือคนก่อนหน้า เมื่อเรียก API ก็จะได้ข้อมูลที่ตัวเองไม่ต้องการใช้กลับไปด้วยครับ GraphQL มาช่วยแก้ปัญหาตรงนี้ครับ คือผู้ขอข้อมูลต้องการอะไรก็ส่งคำขอพร้อมแนบ Structure query ที่ตัวเองต้องการมาเลย ทำให้ระบบยืดหยุ่นมากครับ
เอาล่ะมาเข้าเรื่อง GraphQL บน JIB Chain ครับ (ผมติ้งต่างว่าผู้อ่านเข้าใช้เรื่องของ Blockchain มาพอสมควรนะครับ) สำหรับคนที่ทำ DApp บน Blockchain สาย EVM Compatible จะพอทราบกันดีอยู่แล้วว่า การ Query ข้อมูลบน Blockchain เป็นอะไรที่ทั้งซับซ้อนและช้าครับ The Graph จึงผุดโปรเจค Graph Node ขึ้นมาเพื่อทำการ Sync and Index ข้อมูลจาก Blockchain ออกมาไว้ให้ที่ PostgreSQL และเพิ่ม GraphQL library เข้าไปเผื่อให้ผู้ใช้สามารถใช้ได้ง่ายขึ้นผ่านหน้า WebUI เท่าที่ผมได้ทราบหากต้องการใช้ GraphQL ของ Chain สามารถใช้ได้ 2 วิธีดังนี้ครับ
1. ผ่านบริการของ The Graph เอง ลองเข้าไปเล่นดูได้ที่ https://thegraph.com/explorer ครับ ข้อดีของที่นี่คือใช้บริการได้เลย สามารถเอา Subgraph ไป Deploy ได้ แต่ข้อเสียคือรองรับเฉพาะ Chain ใหญ่ ๆ มีชื่อเสียง ครับ หากเราทำ DApp สำหรับ Chain ที่ยังไม่มีชื่อเสียง วิธีการนี้จะใช้ไม่ได้
2. ติดตั้ง Graph Node เอง ซึ่งขึ้นตอนการติดตั้งก็ไม่ยากมากนะครับ ลองไปดูตามลิงค์นี้ได้ครับ https://github.com/graphprotocol/graph-node (ผมขออนุญาตไม่ลงรายละเอียดนะครับ) วิธีการนี้เราจะ Sync and Index ข้อมูลจาก Chain ใดๆ ก็ได้ที่ทราบ RPC ครับ แต่วิธีการนี้เราก็ต้องเตรียมเครื่อง Server ไว้ติดตั้งและ sync data ครับ
แต่สำหรับคนที่สนในพัฒนา DApp บน JIB Chain ตอนนี้ทาง Chain มีบริการ Graph Node แบบ Official แล้วครับ เบื้องต้นเราสามารถใช้งานได้เลย (เข้าใจว่าจะสามารถ Deploy Subgraph ได้ด้วย แต่ผมยังไม่ได้ลองนะครับ)
GraphQL ของทาง JIB Chain เบื้องต้นสามารถลองเข้าไปใช้งานได้ที่ https://graph.jibchain.net/subgraphs/name/jbc/all/graphql
ในครั้งแรกก็จะเจอหน้าจอประมาณนี้ครับ
ให้ลองคลิกที่ Tab Explorer ลองดูครับ
ก็จะเห็น Query ต่างๆ ของ Subgraph นี้เตรียมไว้ให้ ว่าเราสามารถ Query ข้อมูลอะไรได้บ้าง ซึ่ง Query เองก็จะแตกต่างกันไปตามแต่ละ Subgraph ที่ได้ Deploy ขึ้นไปเพื่อให้ใช้งานครับ
จาก Query ด้านบนผมจะลองค้นหาดูว่ามี NFT Contracts อยู่เท่าไรบน JIB Chain ผมจะสามารถหาได้ง่ายๆ โดยการเลือกไปที่ Query ที่ชื่อว่า erc721Contracts ตัว UI จะทำการแปลงความต้องการของเรามาให้เป็น Query ในรูปแบบของ GraphQL ดังนี้ครับ
จากนั้นลองคลิกปุ่ม RUN ด้านบนดูครับ เราก็จะเห็นผลลัพธ์ของ Query ของเรา ซึ่งจากที่แสดงนี้เราจะเห็นรายการของ NTF Contract ทั้งหมดบน JIB Chain ครับ และการ Query จนได้ผลลัพธ์นั้นใช้เวลาน้อยมากครับ เร็วจัดเลยครับ
ผมจะลองหาต่อว่า แต่ละ NFT Contract มี Name และ Symbol อะไรผมก็เพียงแต่ทำตาม Step ดังนี้วนไปครับ
หรือถ้าพอเข้าใจโครงสร้างแล้วเราก็สามารถพิมพ์บน Query Edtitor ได้เลยครับ มี intellisense ให้ด้วยสบายกันไป
ผมจะลองหาต่อดูว่ามี NFT JIBLOOT (0x25c06d2b04bdd7e8cf07ce41c77a68b011b320cc) ตอนนี้ Mint ออกมาแล้วเท่าไรและมีใครถืออยู่บ้างก็เขียน Query ออกมาได้แบบนี้ครับ
และผมต้องการหาต่อไปไว้ว่ากระเป๋าที่ Mint JIBLOOT ได้ TokenID ที่ 1 (0x93743a270b02dfb28f0d4b81f54a2ab565ac124b) ถือ NFT อะไรบ้างผมก็สามารถเขียน Query ออกมาแบบนี้ครับ
และผมอยากรู้ต่อไปว่ากระเป๋าใบนี้ถือ NFT รายการสุดท้ายที่มี TokenID : 2188 คืออะไร ผมก็หาต่อไปอีก โดยเขียน Query ออกมาแบบนี้ครับ คือเอา Contract Address ไปหาต่อนั้นเองครับ เราก็ทราบว่าคือ NFT อะไรครับ ดั้งนี้ครับ
เบื้องต้นก็จะประมาณนี้ครับ ขอให้สนุกการค้นหาข้อมูลบน Chain นะครับ ไว้เผื่อมีเวลาผมจะมาพาเขียนเพื่อดึงมาใช้ในงานใน Application ต่อไปครับ ขอบคุณที่อ่านมาจนถึงตรงนี้ครับ