Solana Geyser gRPC - फ़िल्टर

Solana Stream SDK
Solana Stream SDK को ओपन-सोर्स सॉफ़्टवेयर के रूप में प्रदान किया जाता है। अधिक विवरण के लिए, कृपया नीचे दिए गए GitHub रिपॉज़िटरी पर जाएँ।

gRPC फ़िल्टर का अवलोकन

Solana Geyser gRPC फ़िल्टर का उपयोग करके केवल उसी डेटा को कुशलतापूर्वक प्राप्त करता है जिसमें आपकी रुचि है, जैसे विशिष्ट खाते, प्रोग्राम, लेनदेन, स्लॉट और ब्लॉक।
नीचे, हम Solana Stream SDK का उपयोग करते हुए TypeScript उदाहरण प्रदान करते हैं, जो प्रत्येक फ़िल्टर की विशिष्ट भूमिकाओं को स्पष्ट रूप से समझाते हैं। Rust का उपयोग करते समय फ़िल्टर की संरचना और अर्थ समान रहते हैं।

वर्तमान Shared filter नियम

वर्तमान Shared plan पर हर non-empty blocks map Dedicated-only है, accountInclude से सीमित करने या transactions बाहर रखने पर भी। आवश्यकता पूरी हो तो transaction subscription या blocksMeta लें; दोनों full-block के बराबर नहीं हैं। Full blocks के लिए Dedicated Geyser gRPC आवश्यक है।
हर account-filter entry में account, owner, या supported cuckoo filter होना चाहिए। केवल memcmp या dataSize supported account shape नहीं चुनते। Request को इन selectors में से किसी एक तक सीमित करें, या full account stream चाहिए तो Dedicated Geyser gRPC उपयोग करें।

प्रत्येक फ़िल्टर की भूमिकाएँ और उदाहरण

किसी खाते की सदस्यता लें

किसी विशिष्ट खाते के लिए रियल-टाइम अपडेट की सदस्यता लें। निम्नलिखित उदाहरण Confirmed commitment स्तर पर SOL-USDC OpenBook खाते की सदस्यता लेता है:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: { slots: {} },
  accounts: {
    'wsol/usdc': {
      account: ['8BnEgHoWFysVcuFFX7QztDmzuH8r5ZFvyP3sYwn1XTh6'],
    },
  },
  transactions: {},
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
}
  • "wsol/usdc" एक क्लाइंट-परिभाषित लेबल है।
  • खातों, प्रोग्रामों, ब्लॉकों और स्लॉटों के लिए कई फ़िल्टर को एक ही JSON अनुरोध में संयोजित किया जा सकता है।

account_data_slice के साथ किसी खाते की सदस्यता लें

यह उदाहरण खाता डेटा के केवल एक विशिष्ट हिस्से को प्राप्त करने का प्रदर्शन करता है। किसी USDC टोकन खाते के पूरे डेटा (165 बाइट्स) को प्राप्त करने के बजाय, यह offset 32 से शुरू होकर 40 बाइट्स प्राप्त करता है। इस श्रेणी में owner और lamports बैलेंस जैसी जानकारी शामिल होती है।
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {},
  accounts: {
    usdc: {
      owner: ['TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'],
      filters: [
        {
          tokenAccountState: true,
        },
        {
          memcmp: {
            offset: 0,
            data: {
              base58: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
            },
          },
        },
      ],
    },
  },
  transactions: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
  commitment: CommitmentLevel.CONFIRMED,
  accountsDataSlice: [{ offset: 32, length: 40 }],
}

किसी प्रोग्राम की सदस्यता लें

यह उदाहरण किसी विशिष्ट प्रोग्राम से जुड़े खाता अपडेट की सदस्यता लेने का प्रदर्शन करता है।
नीचे, हम Processed commitment स्तर पर Solend प्रोग्राम के स्वामित्व वाले खातों के लिए खाता अपडेट की सदस्यता लेते हैं।
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {
    slots: {},
  },
  accounts: {
    solend: {
      owner: ['So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo'],
    },
  },
  transactions: {},
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}
  • "solend" एक कस्टम लेबल है जिसे क्लाइंट द्वारा स्वतंत्र रूप से सेट किया जा सकता है।
  • कई प्रोग्रामों की सदस्यता लेने के लिए, कृपया अगला अनुभाग "कई प्रोग्रामों की सदस्यता लें" देखें।

कई प्रोग्रामों की सदस्यता लें

यह उदाहरण दर्शाता है कि एक साथ कई प्रोग्रामों से जुड़े खाता अपडेट की सदस्यता कैसे ली जाए।
नीचे दिया गया उदाहरण Solend और Serum दोनों प्रोग्रामों के स्वामित्व वाले खातों के लिए अपडेट की सदस्यता लेता है।
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {
    slots: {},
  },
  accounts: {
    programs: {
      owner: [
        'So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo',
        '9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin',
      ],
    },
  },
  transactions: {},
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}
यदि आप प्रत्येक प्रोग्राम को अलग-अलग लेबल असाइन करना पसंद करते हैं, तो निम्नलिखित दृष्टिकोण का उपयोग करें:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {
    slots: {},
  },
  accounts: {
    solend: {
      owner: ['So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo'],
    },
    serum: {
      owner: ['9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin'],
    },
  },
  transactions: {},
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

सभी finalized गैर-वोट और गैर-विफल लेनदेन की सदस्यता लें

यह उदाहरण Finalized commitment स्तर पर सभी लेनदेन की सदस्यता लेने का प्रदर्शन करता है, जिसमें वोट लेनदेन और विफल लेनदेन शामिल नहीं होते।
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {
    slots: {},
  },
  accounts: {},
  transactions: {
    alltxs: {
      vote: false,
      failed: false,
    },
  },
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.FINALIZED,
}
  • vote: false वोट लेनदेन को बाहर करता है।
  • failed: false विफल लेनदेन को बाहर करता है।
  • यदि फ़ील्ड खाली छोड़ दी जाती हैं, तो सभी लेनदेन प्राप्त किए जाते हैं।
  • जब कई फ़ील्ड निर्दिष्ट की जाती हैं, तो वे AND शर्त के साथ काम करती हैं।

किसी खाते का उल्लेख करने वाले गैर-वोट लेनदेन की सदस्यता लें

यह उदाहरण किसी विशिष्ट खाते से जुड़े लेनदेन की सदस्यता लेने का प्रदर्शन करता है, लेकिन वोट लेनदेन को बाहर रखते हुए।
नीचे दिया गया उदाहरण Serum प्रोग्राम से जुड़े खातों का उल्लेख करने वाले गैर-वोट लेनदेन की सदस्यता लेता है।
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {
    slots: {},
  },
  accounts: {},
  transactions: {
    serum: {
      vote: false,
      accountInclude: ['9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin'],
    },
  },
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

खातों को बाहर रखकर लेनदेन की सदस्यता लें

यह उदाहरण उन लेनदेन की सदस्यता लेने का प्रदर्शन करता है जिनमें विशिष्ट खाते शामिल नहीं होते।
नीचे दिया गया उदाहरण Serum और Tokenkeg प्रोग्रामों के स्वामित्व वाले किसी भी खाते को बाहर रखकर लेनदेन प्राप्त करता है।
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {
    slots: {},
  },
  accounts: {},
  transactions: {
    serum: {
      accountExclude: [
        '9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin',
        'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
      ],
    },
  },
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

खातों का उल्लेख करते हुए और कुछ खातों को बाहर रखते हुए लेनदेन की सदस्यता लें

यह उदाहरण कुछ खातों से जुड़े लेनदेन की सदस्यता लेने का प्रदर्शन करता है, जबकि अन्य निर्दिष्ट खातों को स्पष्ट रूप से बाहर रखता है।
नीचे दिया गया उदाहरण Serum के खाते का उल्लेख करने वाले लेनदेन की सदस्यता लेता है, लेकिन एक निर्दिष्ट खाते को बाहर रखता है:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {
    slots: {},
  },
  accounts: {},
  transactions: {
    serum: {
      accountInclude: ['9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin'],
      accountExclude: ['9wFFyRfZBsuAha4YcuxcXLKwMxJR43S7fPfQLusDBzvT'],
    },
  },
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

किसी लेनदेन हस्ताक्षर की सदस्यता लें

यह उदाहरण किसी विशिष्ट लेनदेन हस्ताक्षर के लिए रियल-टाइम अपडेट की सदस्यता लेने का प्रदर्शन करता है, जब तक यह Confirmed या Finalized स्थिति तक न पहुँच जाए।
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {},
  accounts: {},
  transactions: {
    sign: {
      signature:
        '5rp2hL9b6kexex11Mugfs3vfU9GhieKruj4CkFFSnu52WLxiGn4VcLLwsB62XURhMmT1j4CZiXT6FFtYbXsLq2Zs',
    },
  },
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

स्लॉट की सदस्यता लें

यह उदाहरण आने वाले स्लॉट की सूचनाओं की सदस्यता लेने का प्रदर्शन करता है। एक कस्टम टैग नाम असाइन करने के अलावा किसी अतिरिक्त विवरण की आवश्यकता नहीं है:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {
    incoming_slots: {},
  },
  accounts: {},
  transactions: {},
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

ब्लॉकों की सदस्यता लें (वर्तमान Shared plan पर Dedicated-only)

सभी उत्पन्न ब्लॉकों के रियल-टाइम अपडेट की सदस्यता लें। डिफ़ॉल्ट रूप से, किसी ब्लॉक के भीतर सभी लेनदेन प्राप्त किए जाएँगे:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {},
  accounts: {},
  transactions: {},
  blocks: {
    blocks: {},
  },
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

लेनदेन को बाहर रखने और केवल अपडेट की गई खाता जानकारी प्राप्त करने के लिए (वर्तमान Shared plan पर Dedicated-only):

typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {},
  accounts: {},
  transactions: {},
  blocks: {
    blocks: {
      includeTransactions: false,
      includeAccounts: true,
    },
  },
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

केवल विशिष्ट खातों से जुड़े लेनदेन/खाते प्राप्त करने के लिए (वर्तमान Shared plan पर Dedicated-only):

typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {},
  accounts: {},
  transactions: {},
  blocks: {
    blocks: {
      accountInclude: ['So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo'],
    },
  },
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

ब्लॉक मेटाडेटा की सदस्यता लें

ब्लॉक संसाधित होने पर केवल ब्लॉक मेटाडेटा सूचनाओं की सदस्यता लें। विस्तृत लेनदेन डेटा शामिल नहीं होता।
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {},
  accounts: {},
  transactions: {},
  blocks: {},
  blocksMeta: {
    blockmetadata: {},
  },
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

commitment स्तरों का प्रबंधन

Solana Geyser gRPC स्ट्रीम डिफ़ॉल्ट रूप से Processed commitment स्तर का उपयोग करती है।
आप Confirmed या Finalized जैसे उच्च commitment स्तर निर्दिष्ट कर सकते हैं। ऐसे मामलों में, Geyser डेटा को बफ़र करता है और निर्दिष्ट commitment स्तर तक पहुँचने पर सूचनाएँ भेजता है।
अधिकतम प्रदर्शन के लिए, यह अनुशंसा की जाती है कि commitment-स्तर प्रबंधन को क्लाइंट साइड पर संभाला जाए।
commitment स्तर निर्दिष्ट करने का तरीका यहाँ दिया गया है:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

enum CommitmentLevel {
  PROCESSED = 0,
  CONFIRMED = 1,
  FINALIZED = 2,
}
  • PROCESSED: संसाधन के तुरंत बाद का डेटा। तेज़ पुनर्प्राप्ति, लेकिन अभी तक पुष्टि नहीं हुई।
  • CONFIRMED: क्लस्टर द्वारा पुष्टि किया गया डेटा, जो बढ़ी हुई निश्चितता प्रदान करता है।
  • FINALIZED: पूरी तरह से finalized डेटा, जिसमें पुनर्संगठन का कोई जोखिम नहीं होता।

Processed पर काम करने के लाभ

Processed commitment स्तर का मुख्य लाभ तत्काल लेनदेन पुनर्प्राप्ति है, जो तेज़ क्लाइंट-साइड प्रोसेसिंग को सक्षम बनाता है। क्लाइंट इसके बाद Confirmed या Finalized में संक्रमण का पता लगा सकते हैं, जिससे त्वरित प्रतिक्रियाशीलता मिलती है।

Confirmed और Finalized को कैसे प्रबंधित करें

Confirmed या Finalized स्तरों का उपयोग करते समय, घटनाओं (लेनदेन या खाता अपडेट) को प्रति स्लॉट बफ़र किया जाना चाहिए।
घटनाओं को स्लॉट-दर-स्लॉट बफ़र करें, स्लॉट सूचनाओं की सदस्यता लें, और जब कोई विशिष्ट स्लॉट वांछित commitment (Confirmed या Finalized) तक पहुँच जाए, तो बफ़र से घटनाएँ रिलीज़ करें।
घटनाएँ शुरुआत में किसी स्लॉट के Confirmed या Finalized तक पहुँचने से पहले प्राप्त होंगी।

Finalized के बारे में विशेष बात

Solana Geyser की विशिष्टताओं के कारण, सभी स्लॉट को स्पष्ट finalized सूचनाएँ नहीं मिलतीं। इसलिए, जब आपको किसी स्लॉट के लिए finalized सूचना प्राप्त होती है, तो आपको सभी पूर्वज स्लॉट को finalized के रूप में मानना चाहिए, भले ही कोई सूचना स्पष्ट रूप से प्राप्त न हुई हो।
विशेष रूप से, finalized सूचना प्राप्त होने पर, पूर्वव्यापी रूप से सभी पूर्वज स्लॉट को finalized के रूप में मानें।