8 मिनट
आरवीव पर सब-ग्राफ्र्स बनाना
Arweave समर्थन Graph Node और सबग्राफ Studio में बीटा में है: कृपया हमसे Discord पर संपर्क करें यदि आपके पास Arweave सबग्राफ बनाने के बारे में कोई प्रश्न हैं!
इस गाइड में आप आरवीव ब्लॉकचेन पर सब ग्राफ्स बनाना और डेप्लॉय करना सीखेंगे!
आरवीव क्या है?
आरवीव प्रोटोकॉल डेवेलपर्स को स्थायी तौर पर डाटा स्टोर करने की क्षमता देता है जो कि IPFS और आरवीव के बीच का मुख्या अंतर भी है, जहाँ IPFS में इस क्षमता की कमी है, वहीँ आरवीवे पर फाइल्स डिलीट या बदली नहीं जा सकती |
अरवीव द्वारा पहले से ही कई लाइब्रेरी विभिन्न प्रोग्रामिंग भाषाओं में विकशित की गई हैं| अधिक जानकारी के लिए आप इनका रुख कर सकते हैं:
आरवीवे सब ग्राफ्स क्या हैं?
The Graph आपको कस्टम ओपन API बनाने की सुविधा देता है, जिन्हें “Subgraphs” कहा जाता है। Subgraphs का उपयोग Indexers (सर्वर ऑपरेटर्स) को यह बताने के लिए किया जाता है कि ब्लॉकचेन पर कौन सा डेटा Indexing करना है और इसे उनके सर्वर पर सहेजना है, ताकि आप इसे किसी भी समय GraphQL का उपयोग करके क्वेरी कर सकें।
[Graph Node(https://github.com/graphprotocol/graph-node) अब Arweave protocol पर डेटा को इंडेक्स करने में सक्षम है। वर्तमान इंटीग्रेशन केवल Arweave को एक ब्लॉकचेन के रूप में indexing कर रहा है (blocks and transactions), यह अभी संग्रहीत फ़ाइलों को indexing नहीं कर रहा है।
एक आरवीव सब ग्राफ बनाना
आरवीवे पर सब ग्राफ बनाने के लिए हमे दो पैकेजेस की जरूरत है:
@graphprotocol/graph-cli
संस्करण 0.30.2 से ऊपर - यह एक कमांड-लाइन टूल है जो सबग्राफ बनाने और डिप्लॉय करने के लिए उपयोग किया जाता है। यहाँ क्लिक करेंnpm
का उपयोग करके डाउनलोड करने के लिए।@graphprotocol/graph-ts
संस्करण 0.27.0 से ऊपर - यह Subgraph-specific types की एक लाइब्रेरी है। यहाँ क्लिक करें इसेnpm
का उपयोग करके डाउनलोड करने के लिए।
सब ग्राफ के कॉम्पोनेन्ट
तीन घटक एक Subgraph के होते हैं: -
1. मैनिफेस्ट- subgraph.yaml
डाटा का स्रोत्र और उनको प्रोसेस करने के बारे में बताता है| आरवीव एक नए प्रकार का डाटा सोर्स है|
2. स्कीमा- schema.graphql
यहाँ आप बताते हैं की आप कौन सा डाटा इंडेक्सिंग के बाद क्वेरी करना चाहते हैं| दरसअल यह एक API के मॉडल जैसा है, जहाँ मॉडल द्वारा रिक्वेस्ट बॉडी का स्ट्रक्चर परिभाषित किया जाता है|
आर्वीव सबग्राफ के लिए आवश्यकताओं को मौजूदा दस्तावेज़ीकरण द्वारा कवर किया गया है।
3. AssemblyScript मैपिंग्स- mapping.ts
यह किसी के द्वारा इस्तेमाल किये जा रहे डाटा सोर्स से डाटा को पुनः प्राप्त करने और स्टोर करने के लॉजिक को बताता है| डाटा अनुवादित होकर आपके द्वारा सूचीबद्ध स्कीमा के अनुसार स्टोर हो जाता है|
Subgraph को बनाते वक़्त दो मुख्य कमांड हैं:
1$ graph codegen # generates types from the schema file identified in the manifest2$ graph build # generates Web Assembly from the AssemblyScript files, and prepares all the subgraph files in a /build folder
सब ग्राफ मैनिफेस्ट की परिभाषा
सबग्राफ manifest subgraph.yaml
उन डेटा स्रोतों की पहचान करता है जिनका उपयोग सबग्राफ के लिए किया जाता है, वे ट्रिगर जो रुचि के हैं, और वे फ़ंक्शन जो उन ट्रिगर्स के जवाब में चलाए जाने चाहिए। नीचे Arweave सबग्राफ के लिए एक उदाहरण सबग्राफ manifest दिया गया है:
1specVersion: 1.3.02description: Arweave Blocks Indexing3schema:4 file: ./schema.graphql # link to the schema file5dataSources:6 - kind: arweave7 name: arweave-blocks8 network: arweave-mainnet # The Graph only supports Arweave Mainnet9 source:10 owner: 'ID-OF-AN-OWNER' # The public key of an Arweave wallet11 startBlock: 0 # set this to 0 to start indexing from chain genesis12 mapping:13 apiVersion: 0.0.914 language: wasm/assemblyscript15 file: ./src/blocks.ts # link to the file with the Assemblyscript mappings16 entities:17 - Block18 - Transaction19 blockHandlers:20 - handler: handleBlock # the function name in the mapping file21 transactionHandlers:22 - handler: handleTx # the function name in the mapping file
- Arweave सबग्राफ एक नए प्रकार के डेटा स्रोत (
arweave
) को प्रस्तुत करते हैं - नेटवर्क को होस्टिंग Graph Node पर मौजूद नेटवर्क से मेल खाना चाहिए। सबग्राफ Studio में, Arweave का मुख्य नेटवर्क arweave-mainnet है।
- अरवीव डाटा सोर्स द्वारा एक वैकल्पिक source.owner फील्ड लाया गया, जो की एक आरवीव वॉलेट का मपब्लिक key है|
आरवीव डाटा सोर्स द्वारा दो प्रकार के हैंडलर्स उपयोग किये जा सकते हैं:
blockHandlers
- हर नए Arweave ब्लॉक पर चलाया जाता है। कोई source.owner आवश्यक नहीं है।transactionHandlers
- प्रत्येक लेन-देन(transaction) पर चलाया जाता है जहाँ डेटा स्रोत काsource.owner
मालिक होता है। वर्तमान में,transactionHandlers
के लिए एक मालिक आवश्यक है, यदि उपयोगकर्ता सभी लेन-देन(transaction) को प्रोसेस करना चाहते हैं, तो उन्हेंsource.owner
के रूप में "" प्रदान करना चाहिए।
यहां source.owner ओनर का एड्रेस या उनका पब्लिक की हो सकता है|
ट्रांसक्शन आरवीव परमावेब के लिए निर्माण खंड (बिल्डिंग ब्लॉक्स) की तरह होते हैं और एन्ड-यूजर के द्वारा बनाये गए ऑब्जेक्ट होते हैं|
Note: Irys (पहले Bundlr) लेन-देन(transaction) अभी समर्थित नहीं हैं।
स्कीमा की परिभाषा
Schema definition परिणामी सबग्राफ डेटाबेस की संरचना और entities के बीच संबंधों का वर्णन करता है। यह मूल डेटा स्रोत से स्वतंत्र होता है। सबग्राफ schema definition के बारे में अधिक विवरण यहाँ उपलब्ध है।
असेंबली स्क्रिप्ट मैप्पिंग्स
आयोजन को प्रोसेस करने के लिए handlerAssemblyScript में लिखे गए हैं।
Arweave indexing AssemblyScript API में Arweave-विशिष्ट डेटा प्रकार प्रस्तुत करता है।
1class Block {2 timestamp: u643 lastRetarget: u644 height: u645 indepHash: Bytes6 nonce: Bytes7 previousBlock: Bytes8 diff: Bytes9 hash: Bytes10 txRoot: Bytes11 txs: Bytes[]12 walletList: Bytes13 rewardAddr: Bytes14 tags: Tag[]15 rewardPool: Bytes16 weaveSize: Bytes17 blockSize: Bytes18 cumulativeDiff: Bytes19 hashListMerkle: Bytes20 poa: ProofOfAccess21}2223class Transaction {24 format: u3225 id: Bytes26 lastTx: Bytes27 owner: Bytes28 tags: Tag[]29 target: Bytes30 quantity: Bytes31 data: Bytes32 dataSize: Bytes33 dataRoot: Bytes34 signature: Bytes35 reward: Bytes36}
ब्लॉक हैंडलर एक Block प्राप्त करते हैं, जबकि लेनदेन एक लेन-देन(transaction) प्राप्त करते हैं।
Arweave सबग्राफ का मैपिंग लिखना Ethereum सबग्राफ के मैपिंग लिखने के बहुत समान है। अधिक जानकारी के लिए, यहाँ क्लिक करें।
Deploying an Arweave Subgraph in Subgraph Studio
एक बार जब आपका सबग्राफ आपके सबग्राफ Studio डैशबोर्ड पर बना लिया जाता है, तो आप graph deploy CLI कमांड का उपयोग करके इसे डिप्लॉय कर सकते हैं।
1graph deploy --access-token <your-access-token>
आरवीव सब-ग्राफ क्वेरी करना
The GraphQL endpoint Arweave सबग्राफ के लिए schema परिभाषा द्वारा निर्धारित किया जाता है, जिसमें मौजूदा API इंटरफ़ेस होता है। अधिक जानकारी के लिए कृपया GraphQL API documentation देखें।
सब-ग्राफ के उदाहरण
यहाँ संदर्भ के लिए एक उदाहरण सबग्राफ दिया गया है: -
FAQ
क्या सबग्राफ Arweave और अन्य चेन को इंडेक्स कर सकता है?
नहीं, एक सब-ग्राफ केवल एक चेन/नेटवर्क से डाटा सोर्स को सपोर्ट कर सकता है
क्या मैं आरवीव पर स्टोर की फाइल्स को इंडेक्स कर सकता हूँ?
वर्तमान में द ग्राफ आरवीव को केवल एक ब्लॉकचेन की तरह इंडेक्स करता है (उसके ब्लॉक्स और ट्रांसक्शन्स)|
क्या मैं अपने Subgraph में Bundlr bundles की पहचान कर सकता हूँ?
यह वर्तमान में सपोर्टेड नहीं है|
क्या मैं किसी विशिष्ट अकाउंट से ट्रांसक्शन्स छाँट सकता हूँ?
एक यूजर का पब्लिक की या अकाउंट एड्रेस source.owner हो सकता है
वर्तमान एन्क्रिप्शन फॉर्मेट क्या है?
डेटा आमतौर पर Bytes के रूप में मैपिंग्स में पास किया जाता है, जिसे यदि सीधे संग्रहीत किया जाए, तो यह सबग्राफ में hex प्रारूप में लौटाया जाता है (उदाहरण: ब्लॉक और लेन-देन हैश)। आप अपने मैपिंग्स में इसे base64 या base64 URL-सुरक्षित प्रारूप में परिवर्तित करना चाह सकते हैं, ताकि यह उन ब्लॉक एक्सप्लोरर्स में प्रदर्शित होने वाले प्रारूप से मेल खाए, जैसे कि Arweave Explorer।
यह bytesToBase64(bytes: Uint8Array, urlSafe: boolean): string
हेल्पर फंक्शन का उपयोग किया जा सकता है, और इसे graph-ts
में जोड़ा जाएगा:
1const base64Alphabet = [2 "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",3 "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",4 "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",5 "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",6 "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/"7];89const base64UrlAlphabet = [10 "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",11 "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",12 "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",13 "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",14 "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "_"15];1617function bytesToBase64(bytes: Uint8Array, urlSafe: boolean): string {18 let alphabet = urlSafe? base64UrlAlphabet : base64Alphabet;1920 let result = '', i: i32, l = bytes.length;21 for (i = 2; i < l; i += 3) {22 result += alphabet[bytes[i - 2] >> 2];23 result += alphabet[((bytes[i - 2] & 0x03) << 4) | (bytes[i - 1] >> 4)];24 result += alphabet[((bytes[i - 1] & 0x0F) << 2) | (bytes[i] >> 6)];25 result += alphabet[bytes[i] & 0x3F];26 }27 if (i === l + 1) { // 1 octet yet to write28 result += alphabet[bytes[i - 2] >> 2];29 result += alphabet[(bytes[i - 2] & 0x03) << 4];30 if (!urlSafe) {31 result += "==";32 }33 }34 if (!urlSafe && i === l) { // 2 octets yet to write35 result += alphabet[bytes[i - 2] >> 2];36 result += alphabet[((bytes[i - 2] & 0x03) << 4) | (bytes[i - 1] >> 4)];37 result += alphabet[(bytes[i - 1] & 0x0F) << 2];38 if (!urlSafe) {39 result += "=";40 }41 }42 return result;43}