टिकाऊ Nonce फैन आउट के लिए SWQoS

पृष्ठभूमि और उपयोग परिदृश्य

In Solana लेनदेन भेजने, स्लॉट प्रगति, नेता प्लेसमेंट और नेटवर्क-पैथ भीड़ लगातार बदल जाती है जो मार्ग सबसे तेजी से नेता तक पहुंच जाता है। यह किसी भी व्यक्ति के लिए विशिष्ट नहीं है RPC प्रदाता या सेवा भेजने; यह एक संरचनात्मक विशेषता है Solana's निष्पादन मॉडल'।
ERPC's SWQoS एंडपॉइंट एक भेजने का मार्ग प्रदान करता है जो स्टेक-वेटेड सर्विस की गुणवत्ता (Stake-weighted Quality of Service) के आधार पर नेताओं द्वारा आवंटित प्राथमिकता वाले लेन में लेनदेन को इंजेक्ट करता है।SWQoSयह प्राथमिकता बैंडविड्थ लगभग 5 × है कि गैर प्राथमिकता वाले लेन की है और प्राथमिकता शुल्क मूल्यांकन से पहले लागू किया जाता है।
उस कारण से, SWQoS एंडपॉइंट लेनदेन भेजने के लिए एक महत्वपूर्ण विकल्प है, लेकिन उत्पादन में एक एकल समापन बिंदु हमेशा सबसे तेज नहीं होता है। यहां तक कि एक ही स्लॉट के भीतर भी, क्षणिक पथ अंतर या लोड तिरछा आगे बढ़ने के लिए एक और तेजी से समापन बिंदु की अनुमति दे सकता है।
इन विशेषताओं को देखते हुए, समानांतर में एकाधिक फास्ट पथों को समान लेनदेन भेजने और एक ही मार्ग पर भरोसा करने के बजाय पहले एक संसाधित को स्वीकार करने का एक परिचालन पैटर्न प्रभावी हो सकता है।
हालांकि, जब एक ही लेनदेन को एकाधिक समापन बिंदुओं पर भेजा जाता है, तो आप यह गारंटी नहीं दे सकते कि यह अतिरिक्त नियंत्रण के बिना केवल एक बार निष्पादित होगा। इस नियंत्रण के बिना फैन आउट से अप्रयुक्त डबल निष्पादन या टूटे हुए रिट्री कंट्रोल हो सकता है।
Solana इसके लिए तंत्र के रूप में टिकाऊ Nonce प्रदान करता है। टिकाऊ Nonce का उपयोग करके आप एक ही समय में श्रृंखला निष्पादन को सीमित करते हुए कई मार्गों पर उसी हस्ताक्षरित लेनदेन को भेज सकते हैं।
यह पृष्ठ बताता है कि कैसे प्रशंसक-आउट संचालन को लागू करने के लिए जो गठबंधन करता है ERPC's SWQoS अन्य फास्ट के साथ समापन बिंदु RPC एंडपॉइंट्स, टिकाऊ नोन्स के साथ भेजने वाले लेनदेन को समझना।

स्कोप और पूर्वापेक्षा

यह गाइड वेब3.js के साथ एक टिकाऊ नोन्स खाता बनाने और लेनदेन भेजने और प्रशंसक आउट ऑपरेशन के लिए इसका उपयोग करने के लिए कवर करता है।
समझने की आवश्यकता:
  • टिकाऊ Nonce लेनदेन के लिए, के रूप में गैर-मूल्य मूल्य का उपयोग करें recentBlockhash और जगह nonceAdvance पहला निर्देश
  • एक बार nonceAdvance निष्पादित करता है, अगर बाद में निर्देश विफल हो जाते हैं तो भी ऐसा नहीं किया जा सकता है।
  • Nonce खाता निर्माण एक बार सेटअप है और आम तौर पर पुन: उपयोग किया जाता है

चरण 1: गैर-आधिकारिक और कनेक्शन तैयार करें

गैर-ce अधिकार एक कीमर है जो गैर-ce को आगे बढ़ा सकता है।
typescript
import {
  Connection,
  Keypair,
  SystemProgram,
  NONCE_ACCOUNT_LENGTH,
} from '@solana/web3.js'

const connection = new Connection(
  'https://<primary-rpc-endpoint>',
  'confirmed',
)

const nonceAuthority = Keypair.fromSecretKey(/* secret key */)
  • गैर-आधिकारिक प्राधिकरण निष्पादित कर सकता है nonceAdvance
  • यह शुल्कदाता हो सकता है, या एक अलग कुंजीpair

चरण 2: एक गैर-विहीन खाता कुंजीpair उत्पन्न करें

एक गैर-आधारी खाता एक *सिस्टम खाता है।
typescript
const nonceAccount = Keypair.generate()
इस कीप का उपयोग निम्नलिखित के लिए किया जाता है:
  • गैर-मूल्य निर्धारण (के लिए प्रतिस्थापन) को पकड़ना recentBlockhash)
  • केवल निर्माण समय पर साइन इन करें
  • बाद में सुरक्षित भंडारण; दैनिक भेजने के लिए इसकी आवश्यकता नहीं है

चरण 3: किराए पर छूट की गणना न्यूनतम

Nonce खातों को किराए पर लेना चाहिए। हार्डकोड मान मत करो; उन्हें से प्राप्त करें RPC.
typescript
const lamports =
  await connection.getMinimumBalanceForRentExemption(
    NONCE_ACCOUNT_LENGTH,
  )

चरण 4: गैर-अनुसूचित खाते को बनाएं और शुरू करें

createAccount + nonceInitialize के साथ एक ही लेन-देन में गैर-विभाजित खाता बनाएं।
typescript
import { Transaction } from '@solana/web3.js'

const tx = new Transaction()

tx.add(
  SystemProgram.createAccount({
    fromPubkey: nonceAuthority.publicKey,
    newAccountPubkey: nonceAccount.publicKey,
    lamports,
    space: NONCE_ACCOUNT_LENGTH,
    programId: SystemProgram.programId,
  }),
  SystemProgram.nonceInitialize({
    noncePubkey: nonceAccount.publicKey,
    authorizedPubkey: nonceAuthority.publicKey,
  }),
)

// fee payer is the nonce authority
tx.feePayer = nonceAuthority.publicKey

// use a normal blockhash for initialization
const { blockhash, lastValidBlockHeight } =
  await connection.getLatestBlockhash('confirmed')

tx.recentBlockhash = blockhash

// sign with both the new account and the authority
tx.sign(nonceAccount, nonceAuthority)

const signature = await connection.sendRawTransaction(tx.serialize())
await connection.confirmTransaction(
  { signature, blockhash, lastValidBlockHeight },
  'confirmed',
)
इसका प्रयोग करें nonceAccount.publicKey बाद में भेजे जाने के लिए।

स्टेप 5: प्रत्येक भेजने से पहले नॉन-सीट को छोड़ दें

प्रत्येक लेनदेन के लिए, वर्तमान गैर-सीमा मूल्य प्राप्त करें।
typescript
import { NonceAccount } from '@solana/web3.js'

const { value, context } =
  await connection.getAccountInfoAndContext(
    nonceAccount.publicKey,
    'confirmed',
  )

if (!value) {
  throw new Error('Nonce account not found')
}

const nonce = NonceAccount.fromAccountData(value.data).nonce
const minContextSlot = context.slot
  • उपयोग nonce as recentBlockhash
  • context.slot पुष्टि में प्रयोग किया जाता है

चरण 6: टिकाऊ Nonce लेनदेन का निर्माण

टिकाऊ Nonce लेनदेन निम्नलिखित शर्तों को पूरा करना चाहिए:
  • recentBlockhash = nonce
  • पहला निर्देश है nonceAdvance
typescript
import {
  TransactionMessage,
  VersionedTransaction,
} from '@solana/web3.js'

const instructions = [
  SystemProgram.nonceAdvance({
    noncePubkey: nonceAccount.publicKey,
    authorizedPubkey: nonceAuthority.publicKey,
  }),
  // add your real instructions after this
]

const message = new TransactionMessage({
  payerKey: nonceAuthority.publicKey,
  recentBlockhash: nonce,
  instructions,
}).compileToV0Message()

const tx = new VersionedTransaction(message)
tx.sign([nonceAuthority /* + other signers */])

const rawTx = tx.serialize()
नोट्स:
  • यदि आप ComputeBudget निर्देशों का उपयोग करते हैं, तो उन्हें ** के बाद ** nonceAdvance
  • If nonceAdvance पहली बार नहीं है, लेन-देन को खारिज कर दिया जाएगा

चरण 7: एकाधिक आरपीसी से फैन आउट

उसी तरह के कच्चेटेक्स को समवर्ती रूप से भेजें।
typescript
const endpoints = [
  'https://<erpc-swqos-fra>',
  'https://<backup-rpc-1>',
  'https://<backup-rpc-2>',
]

const results = await Promise.allSettled(
  endpoints.map((url) =>
    new Connection(url, 'confirmed').sendRawTransaction(rawTx, {
      skipPreflight: true,
      minContextSlot,
    }),
  ),
)

const success = results.find(
  (r): r is PromiseFulfilledResult<string> =>
    r.status === 'fulfilled',
)

if (!success) {
  throw new Error('All sends failed')
}

const signature = success.value
  • हस्ताक्षर अंत बिंदुओं के पार समान है
  • एक सफल भेजें not एक पुष्टिकरण है

स्टेप 8: टिकाऊ Nonce के साथ पुष्टि करें

टिकाऊ Nonce के साथ, पुष्टि में गैर-सी जानकारी शामिल है।
typescript
await connection.confirmTransaction(
  {
    signature,
    nonceAccountPubkey: nonceAccount.publicKey,
    nonceValue: nonce,
    minContextSlot,
  },
  'confirmed',
)
यदि पुष्टि सफल होती है:
  • गैर अग्रिम
  • अन्य आरपीसी रिटर्न में भेजे गए कॉपी InvalidNonce

अगला संदेश

  • पुष्टि के बाद, एक ताजा नॉन्से प्राप्त करें
  • उसी कच्चे टीएक्स या गैर-मूल्य का पुन: उपयोग न करें
  • समानांतर वर्कफ़्लो के लिए, अलग-अलग नॉन्सी खातों का उपयोग करें
अगले लेनदेन के लिए अद्यतन नॉन-सी प्राप्त करें और उसी चरण का उपयोग करके लेनदेन का निर्माण करें।