Rand Protocol
ஆவணமாக்கல்
அடிப்படைக் கருத்துகள்

மெம்பூல்

ஒரு கணு ஒரு பரிவர்த்தனையைப் பெற்றதிலிருந்து அதை ஒரு தொகுதியில் சேர்க்கும் வரை அதைக் கையாளும் முறை: ஏற்பு வரிசை, நான்ஸ்களுக்குப் பதிலாக முரண்பாட்டுக் கண்காணிப்பு, நான்கு சரிபார்ப்புப் பணியாளர்கள், சக கணு அளவி, தீர்ப்புத் தேக்ககம், முன்மொழிபவர் ஒரு தொகுதியைத் தேர்ந்தெடுக்கும் விதம், தோற்கும் இரட்டைச் செலவு ஏன் தானாகவே மறைகிறது என்பவை.

இந்தப் பக்கம், rand_sendTransaction ஒரு பரிவர்த்தனையை ஏற்றுக்கொண்ட பின்னும் ஒரு பிளாக் அதைச் சுமப்பதற்கு முன்னும் அதற்கு என்ன நிகழ்கிறது என்பதை விளக்குகிறது. அது மறுக்கப்பட்டிருந்தால் ஏன் மறுக்கப்பட்டது, ஒருபோதும் தோல்வியடையாமலேயே அது பூலிலிருந்து ஏன் மறைந்துபோகக்கூடும், ஒரு பிளாக் எந்த வரிசையில் நிரப்பப்படுகிறது, தவறான நிரூபணங்களின் வெள்ளம் ஒரு சரிபார்ப்பாளருக்கு எதைச் செய்ய முடியும், எதைச் செய்ய முடியாது என்பவற்றை இங்கே காணலாம். மெம்பூல் crates/randprotocol-node/src/mempool.rs கோப்பில் உள்ளது. அதற்கு முன்னுள்ள காப்புகள் admission.rs கோப்பில் உள்ளன.

அனுப்புநர்கள் இல்லை, எனவே நான்ஸ்களும் இல்லை

கணக்கு அடிப்படையிலான சங்கிலியில், மெம்பூல் ஒவ்வொரு அனுப்புநரின் பரிவர்த்தனைகளையும் நான்ஸ் வரிசைப்படி அடுக்குகிறது. மறைக்கப்பட்ட சங்கிலியில் அனுப்புநர்கள் இல்லை. ஒரு தொகுப்பு எந்த முகவரியையும் கையொப்பத்தையும் சுமப்பதில்லை. இரண்டு தொகுப்புகள் ஒரே குறிப்பைத் தொடும்போது மட்டுமே அவற்றுக்கிடையே தொடர்பு உண்டு. எனவே அனுப்புநர் வாரியாக வரிசைப்படுத்த எதுவும் மிஞ்சுவதில்லை. நான்ஸ் கணக்கீட்டின் இடத்தை முரண்பாட்டுக் கண்காணிப்பு எடுத்துக்கொள்கிறது. நிலுவையில் உள்ள ஒவ்வொரு பரிவர்த்தனையின் நல்லிஃபையர்களையும் உறுதிமொழிகளையும் பூல் அட்டவணைப்படுத்துகிறது. அவற்றில் ஏதேனும் ஒன்றைக் கோரும் புதிய பரிவர்த்தனையை அது மறுக்கிறது. ஒவ்வொரு மதிப்புக்கும் சரியாக ஒரே ஒரு பரிவர்த்தனையை மட்டுமே பேரேடு ஏற்கும் சில எண்ணிகளுக்கும் இதே விதி பொருந்தும்: ஒரு சரிபார்ப்பாளரின் பதிவேட்டு நான்ஸ் (ஒரு Unbond அல்லது ஒரு Withdraw), ஒரு டோக்கனின் mint_nonce (TokenMint, SetAuthority இரண்டும் பகிர்ந்துகொள்வது), ஒரு RegisterToken கட்டுப்பட்டிருக்கும் பதிவக அட்டவணை எண், பிரிட்ஜின் pause_nonce, list_nonce ஆகியவை. இவை ஒவ்வொன்றும் பூலில் உள்ள அதிகபட்சம் ஒரு பரிவர்த்தனை மட்டுமே வைத்திருக்கக்கூடிய ஓர் இடம். இத்தகைய இரண்டு பரிவர்த்தனைகளில் அதிகபட்சம் ஒன்றே சேர்க்கப்பட முடியும். மற்றதைச் சுமந்தால், முன்மொழிபவருக்குப் பிளாக் இடம் வீணாகும். ஒவ்வொரு காசிப் சுற்றிலும் ஒவ்வொரு முனையும் ஒரு நிரூபணச் சரிபார்ப்பைச் செலவிட வேண்டியிருக்கும்.

பூல் அதிகபட்சம் 10,000 பரிவர்த்தனைகளை (node.rs இல் Mempool::new(10_000)) வைத்திருக்கும். v0.6.8 முதல், அதிகபட்சம் எட்டு பிளாக்குகளுக்கு இணையான பைட்டுகளையும் வைத்திருக்கும்: MAX_POOL_BLOCKS = சங்கிலியின் max_block_bytes இன் 8 மடங்கு, சங்கிலி 20 இல் இது 160 MiB (தணிக்கை v6, CH-7). அதற்கு முன் எண்ணிக்கைக்கு மட்டுமே வரம்பு இருந்தது. ஆனால் நிரூபணம் சுமக்கும் ஒரு பரிவர்த்தனையின் அளவு சுமார் 1.3 MB முதல் 12 MB க்கு மேல் வரை இருக்கும். ஒவ்வொரு பரிவர்த்தனையும் கடைசியாக உறுதிசெய்யப்பட்ட பிளாக்கிற்கு எதிராக அல்ல, ஒருமித்த மரத்தின் நுனியில் உள்ள பேரேட்டுக்கு எதிராகச் சரிபார்க்கப்படுகிறது. ஒரு முன்மொழிபவர் உண்மையில் கட்டியெழுப்பும் நிலை அதுவே.

ஏற்பு: மலிவானது முதலில், செலவுமிக்கது பின்னர்

RPC அல்லது காசிப் வழியாக வரும் ஒரு பரிவர்த்தனை பின்வரும் படிகளை இதே வரிசையில் கடக்கிறது. முதல் மறுப்பே நீங்கள் காணும் பிழை:

  1. நகல். ஹாஷ் ஏற்கெனவே பூலில் உள்ளது: already in mempool.
  2. முரண்பாடு. ஒரு நல்லிஃபையர், ஓர் உறுதிமொழி, அல்லது மேலே குறிப்பிட்ட நான்ஸ், அட்டவணை இடங்களில் ஒன்று, நிலுவையில் உள்ள ஒரு பரிவர்த்தனையால் ஏற்கெனவே கோரப்பட்டுள்ளது: conflicts with a pending transaction over <hex>. டோக்கன் இடத்துக்கு அந்த hex ஒரு காட்சி விசையாகும்: முதலில் ஒரு குறிச்சொல் (mint_nonce க்கு tokn, பதிவு அட்டவணை எண்ணுக்கு tidx), அதன் பின் அட்டவணை எண், பின்னர் நான்ஸ். இரண்டு ரிலேயர்கள் போட்டியிட்ட ஒரு பிரிட்ஜ் சான்றளிப்பு அதன் டைஜெஸ்ட் மூலம் வேறுபடுத்தப்படுகிறது: conflicts with a pending transaction over bridge attestation <hash>.
  3. நிரம்பியது. mempool full. இம்மூன்றில் கொள்ளளவுச் சோதனையே கடைசி. பைட் வரம்பில், ஒரு புதிய பரிவர்த்தனை தன்னைவிடக் கண்டிப்பாகக் கீழ்த்தரத்தில் உள்ள பூல் உள்ளீடுகளின் இடத்தை எடுத்துக்கொள்ளலாம். தரவரிசை முதலில் ஒவ்வொன்றின் தற்போதைய KiB ஒன்றுக்கான அடிமட்டத்துக்கு மேலுள்ள கட்டணத்தாலும், பின்னர் கட்டணத்தாலும் தீர்மானிக்கப்படுகிறது. அது பொருந்தும் வரை மலிவானவை முதலில் வெளியேற்றப்படுகின்றன. அவை போதாவிட்டாலோ, அல்லது அது சமநிலையில் மட்டுமே இருந்தாலோ, மறுக்கப்படுவது அதுவே. ஆளுகை நடவடிக்கைகள் இரண்டு வரம்புகளுக்கும் வெளியே உள்ளன, ஒருபோதும் வெளியேற்றப்படுவதில்லை: நான்கு பிரிட்ஜ் ஆளுகை நடவடிக்கைகளான PauseMints, UnpauseMints, RegisterBridgedToken, ListBacking, மேலும் v0.6.8 முதல் RotatePqGuardians, RotatePauseKey, அவற்றின் …V2 வடிவங்கள், CancelRotation, AdmitValidator, SlashEquivocation. இருப்பினும் அவற்றின் பைட்டுகளும் உள்ளீடுகளும் வரம்புகளில் கணக்கிடப்படுகின்றன. காவலர் விசை சமரசத்துக்கான நிறுத்தி PauseMints: அதற்குத் தொகுப்பும் இல்லை, கட்டணமும் இல்லை. ஒரு தாக்குதலாளர் புதினம் செய்துகொண்டிருக்கும்போது ஒரு பிளாக்கைச் சென்றடைய வேண்டிய ஒரே பரிவர்த்தனை அது. எனவே நிரம்பிய பூல் அதைத் தடுக்கக் கூடாது. இந்த விலக்கு முரண்பாட்டுப் படியால் கட்டுப்படுத்தப்படுகிறது: pause_nonce, list_nonce ஒவ்வொன்றும் ஒரு நேரத்தில் பூலில் ஒரு பரிவர்த்தனையை மட்டுமே அனுமதிக்கின்றன. எனவே நான்கு பிரிட்ஜ் நடவடிக்கைகளும் வரம்பைத் தாண்டி அதிகபட்சம் இரண்டு உள்ளீடுகளையே சேர்க்க முடியும். மற்றவை ஒவ்வொன்றும் தமக்கே உரிய ஒரு நான்ஸையோ கோரத்தையோ செலவிடுகின்றன.
  4. Ledger::validate இன் மலிவான பாதி. ஏற்புக்கும் சேர்ப்புக்கும் இடையில் காலாவதியாகக்கூடிய, எந்த நிரூபணச் செலவும் இல்லாத அனைத்தும் இங்கே சோதிக்கப்படுகின்றன. நங்கூரம் சங்கிலி 20 இல் கடைசி 1,024 வேர்களில் ஒன்றாக இருக்க வேண்டும் (ஜெனிசிஸ் proof_window_blocks; அது இல்லாவிட்டால் 256). time சாளரத்துக்குள் இருக்க வேண்டும். நல்லிஃபையர்கள் செலவிடப்படாதவையாகவும், உறுதிமொழிகள் இல்லாதவையாகவும், ஒரு சான்றளிப்பின் டைஜெஸ்ட் கோரப்படாததாகவும் இருக்க வேண்டும். ஒரு ஸ்டேக்கிங் நடவடிக்கையின் பதிவேட்டு நான்ஸ் நடப்பில் இருக்க வேண்டும். ஒரு டோக்கன் நடவடிக்கையின் mint_nonce அல்லது பதிவு அட்டவணை எண் பதிவகம் தற்போது உள்ள எண்ணாக இருக்க வேண்டும் (சங்கிலி அதைக் கடந்துவிட்டால் wrong mint nonce, wrong token index). ஒரு இடைநிறுத்தம் அல்லது பட்டியலிடலின் நான்ஸ் பிரிட்ஜின் தற்போதைய நான்ஸாக இருக்க வேண்டும். ஒரு பரிவர்த்தனை உருவாக்கும் உறுதிமொழிகளும் இங்கேயே கணக்கிடப்படுகின்றன. ஒரு Withdraw, ஒரு BridgeAttest அல்லது ஒரு திரட்டிக் கொடுப்பனவுக்காகப் பேரேடே வருவிக்கும் குறிப்பும் இதில் அடங்கும். அது வலைப்பின்னலில் பயணிப்பதில்லை, ஆனாலும் அதுவும் மோதக் கூடாது. எதையும் குறிவிலக்குவதற்கு முன் அளவு வரம்புகள் சோதிக்கப்படுகின்றன. சங்கிலியின் max_proof_bytes ஐ (இயல்பாக 2 MiB, சங்கிலி 20 இல் 4 MiB) மீறும் நிரூபணம், 16 KiB ஐ மீறும் சான்றளிப்பு, அல்லது ஒரு பிளாக்கைவிடப் பெரிய பரிவர்த்தனை (max_block_bytes: இயல்பாக 4 MiB, சங்கிலி 20 இல் 20 MiB) நேரடியாக மறுக்கப்படுகின்றன. எனவே அளவுக்கு மீறிய ஒரு தரவுத்தொகுதி எந்த வேலையையும் பெற்றுத்தராது. முத்திரையிடப்பட்ட (கத்தரிக்கப்பட்ட) குறியீட்டு வடிவில் உள்ள தொகுப்பு நிரூபணம், முத்திரை வடிவ ஒத்திசைவுக்கு வெளியே இதே படியில் PrunedFormOutsideSync என மறுக்கப்படுகிறது. பின்னர், இன்னும் எதையும் சரிபார்க்காமலேயே, பூல் நிரூபணத் தலைப்புகளைப் படிக்கிறது. மூன்று கொள்கைகள் முதலில் வருகின்றன. உள்ளீடு, keccak அல்லது sha256 அட்டவணை 2^7 வரிசைகளுக்குக் குறைவாக உள்ள அழைப்பு பூலில் சேர்க்கப்படுவதில்லை (CallRevealsPrivateInputs). எந்த அழைப்பும் தாங்க முடியாத வரிசைப்படுத்தலும் சேர்க்கப்படுவதில்லை (ProgramUncallable). நேர்மையான நிரூபிப்பவர் எழுதாத ஒரு தலைப்புப் புலத்தைத் தன் தொகுப்பு அல்லது அழைப்பு நிரூபணத்தில் கொண்ட பரிவர்த்தனையும் சேர்க்கப்படுவதில்லை (NonCanonicalProof). கடைசி இரண்டும் சங்கிலி 20 இல் hardening_v6 இன் கீழ்ப் பேரேட்டு விதிகளும் ஆகும். v0.6.8 முதல், அறிவிக்கப்பட்ட படி மிக உயரமான அட்டவணையின் உச்சவரம்பைத் தாண்டும் தலைப்பு, சோதனை அதைக் கடந்து செல்வதற்கு முன்பே NonCanonicalProof என மறுக்கப்படுகிறது (தணிக்கை v6, ZKV-4). இந்த முன்வடிகட்டலில் எங்கு பேனிக் ஏற்பட்டாலும் அது அந்தப் பரிவர்த்தனையின் மறுப்பாகவே (VerifierPanicked) முடியும், முனை செயலிழப்பதில்லை. அதன் பின் கட்டண அடிமட்டம் வருகிறது. சங்கிலி 20 இல், ஓர் அழைப்பு அல்லது invoke நிரூபணம் அறிவிக்கும் gas வரம்பைப் பூல் குறிவிலக்குகிறது. நுனியின் விலைகளில் BUNDLE_BASE + gas_price × limit + byte_price × ⌈bytes/1024⌉ உடன் ஒரு invoke இன் செல் கட்டணத்தையும் சேர்த்த தொகையைவிடக் குறைவான கட்டணத்தை அது FeeTooLow என மறுக்கிறது (கட்டணங்கள்). அது பிளாக்கின் சொந்த விதியே. எனவே ஒரு பிளாக் கோருவதைச் சரியாக அதையே பூலும் கோருகிறது.
  5. செலவுமிக்க பாதி, ஒருமித்தச் சுழற்சிக்கு வெளியே. பரிவர்த்தனை நான்கு சரிபார்ப்புப் பணியாளர்களில் ஒன்றுக்காக அதிகபட்சம் 64 ஆழம் வரை வரிசையில் வைக்கப்படுகிறது. ஒரு பணியாளர் Ledger::validate இன் மீதியை ஒரு தடுக்கும் பணியில் இயக்குகிறது. அதில் அடங்குபவை: தொகுப்பு டைஜெஸ்ட், தொகுப்பு நிரூபணம் அறிவிக்கும் gas வரம்பு (சங்கிலி 20 இல் சரியாக 20,479, இல்லையெனில் BundleGasLimit), தொகுப்பு நிரூபணம், சங்கிலி 17 முதல் பரிவர்த்தனையின் பிணைப்புக்கு எதிரான அதன் அங்கீகார நிரூபணம், ஓர் அழைப்புக்கு அதன் சொந்த நிரூபணமும் கட்டண அடிமட்டமும். நுனியின் ஒரு நிலைப்படத்துக்கு எதிராக அது சரிபார்க்கிறது. அந்த நிலைப்படம் சோம்பலாக நகலெடுக்கப்படுகிறது: ஒவ்வொரு நுனி மாற்றத்துக்கும் அதிகபட்சம் ஒருமுறை, ஏதேனும் காத்திருக்கும்போது மட்டுமே. வரிசை நிரம்பியிருப்பதைக் காணும் காசிப் பரிவர்த்தனை, வாக்களிக்கும் சுழற்சியைத் தடுப்பதற்குப் பதிலாகக் கைவிடப்படுகிறது. அது சரிபார்க்கப்படுவதுமில்லை, முன்னனுப்பப்படுவதுமில்லை. சக முனையின் அடுத்த காசிப் சுற்று அதை மீண்டும் சுமந்துவரும்.
  6. மறுசோதனையும் பூலில் சேர்த்தலும். நிரூபணம் சரிபார்க்கப்படும்போது நுனி நகர்ந்திருக்கக்கூடும். எனவே insert_verified, பரிவர்த்தனை உண்மையில் பூலில் சேர்க்கப்படும் நுனிக்கு எதிராகப் படி 4 ஐ மீண்டும் இயக்குகிறது. பின்னர் அதை ஏற்கிறது. காசிப் போக்குவரத்தாக இருந்தால் அதை முன்னனுப்புகிறது.

படிகள் 1 முதல் 4 வரை Mempool::precheck ஆகும். படி 5 மட்டுமே ஒரு STARK ஐச் சரிபார்க்கிறது. அந்தச் செலவு ஒரு பணியாளரில் செலுத்தப்படுவதால், தவறான நிரூபணங்களின் வெள்ளம் நான்கு திரெட்களை மட்டுமே ஆக்கிரமிக்கும். அது ஒருபோதும் ஒருமித்தச் சுழற்சியை ஆக்கிரமிக்காது. பேரேட்டின் சொந்த ஏற்பு வரிசையை பரிவர்த்தனைகளும் நடவடிக்கைகளும் பட்டியலிடுகிறது. படிகள் 4, 5 இரண்டும் சேர்ந்து அதை இயக்குகின்றன.

காசிப்புக்கு இரண்டு காப்புகளும் ஒரு தற்காலிக நினைவகமும்

ஏற்புக்கு முன்னால், சக முனைகளிலிருந்து வரும் பரிவர்த்தனைகளுக்கு மட்டுமே பொருந்தும் இரண்டு அம்சங்கள் உள்ளன. RPC சமர்ப்பிப்புகள் அவற்றைத் தவிர்க்கின்றன, ஏனெனில் அந்தப் போர்ட் இயக்குநருக்குச் சொந்தமானது, ஏற்கெனவே கோரிக்கை-உடல் வரம்பால் கட்டுப்படுத்தப்பட்டுள்ளது. அளவிடப்படும் ஒரே RPC பாதை ஃபாசெட் ஆகும், அது கீழே விளக்கப்பட்டுள்ளது.

  • சக முனை வாரியான பைட் அளவி. v0.6.8 முதல், ஒவ்வொரு gossip சட்டகமும் குறிவிலக்கம் செய்யப்படுவதற்கு முன்பே அதை அனுப்பிய முனையின் பைட் ஒதுக்கீட்டிலிருந்து கழிக்கப்படுகிறது. அதிகபட்சப் பரிமாற்ற அளவுள்ள எட்டு சட்டகங்கள் வரை ஒரே வெடிப்பாக அனுமதிக்கப்படுகின்றன. ஒதுக்கீடு வினாடிக்கு இரண்டு சட்டகங்கள் என்ற வீதத்தில் மீண்டும் நிரம்புகிறது. அதைத் தாண்டிய சட்டகம் குறிவிலக்கம் செய்யப்படாமலேயே கைவிடப்படுகிறது (தணிக்கை v6, GOSSIP-1). முழு நிரூபணத்தையும் ஹாஷ் செய்து பெறப்படும் பரிவர்த்தனை அடையாளம், அனுப்பிய முனையின் ஒதுக்கீட்டுக்குள் மட்டுமே கணக்கிடப்படுகிறது.
  • சக முனை வாரியான பரிவர்த்தனை அளவி. அனுப்பும் ஒவ்வொரு சக முனைக்கும் ஒரு டோக்கன் வாளி உண்டு. அது 16 வரை ஒரே வெடிப்பாக அனுமதிக்கிறது, வினாடிக்கு 4 என்ற வீதத்தில் மீண்டும் நிரம்புகிறது (PEER_TX_BURST, PEER_TX_PER_SEC). இது பரிவர்த்தனையை அனுப்பிய சக முனையை அளக்கிறது, அதன் ஆசிரியரை அல்ல. கவசமிட்ட சங்கிலியால் ஆசிரியரை அடையாளம் காண இயலாது.
  • தீர்ப்புத் தேக்ககம். ஒரு பரிவர்த்தனையை இந்த முனை அதன் பைட்டுகளை மட்டுமே சார்ந்த ஒரு காரணத்துக்காக ஏற்கெனவே மறுத்திருக்கலாம்: தவறான நிரூபணம், தவறான கையொப்பம், அல்லது அளவு மீறிய பகுதி போன்றவை. அப்படியானால் அது இரண்டாம் முறை சரிபார்க்கப்படுவதில்லை, 8,192 உள்ளீடுகள் கொண்ட FIFO தேக்ககத்திலிருந்து (REFUSED_CACHE_ENTRIES) மீண்டும் மறுக்கப்படுகிறது. இந்த முனையின் நிலை பற்றிய தீர்ப்பு ஒருபோதும் தேக்கப்படுவதில்லை; அறியப்படாத நங்கூரம், ஏற்கெனவே செலவழிக்கப்பட்ட nullifier ஆகியவை இதற்கு எடுத்துக்காட்டுகள். அப்படித் தேக்கினால், ஒரு பிளாக் பின்தங்கியுள்ள முனை விரைவில் செல்லுபடியாகப் போகும் பரிவர்த்தனைகளுக்கு எதிராகத் தன்னைத்தானே நச்சாக்கிக்கொள்ளும். இந்தப் பட்டியல் ஓர் அனுமதிப் பட்டியல். ஆகவே யாரேனும் வேறுவிதமாக முடிவு செய்யும் வரை, புதிய பிழை நிலையாகவே கருதப்படுகிறது. எல்லைக்கோடு எங்கே செல்கிறது என்பதைக் கீழ்க்காணும் உள்ளீடுகள் காட்டுகின்றன:
    • v0.6.8 முதல் BadPauseSignature (the pause signature does not verify) நிரந்தரமானது அல்ல (தணிக்கை v6, BRG-18). இது சங்கிலியின் தற்போதைய இடைநிறுத்த விசையின் கீழ் கையொப்பத்தைச் சரிபார்க்கிறது. பால விதிகள் v2 அந்த விசையைச் சுழற்றக்கூடும், ஆகவே இது நிலையாகும். இல்லையெனில், ஒரு சுழற்சிக்கு ஒரு பிளாக் பின்தங்கியுள்ள முனை, மறுதொடக்கம் வரை புதிய உரிமையாளரின் PauseMints-ஐ மறுக்கும். இதே காரணத்துக்காக, வரம்புக்கு வெளியே உள்ள PQ இணை-கையொப்பக் குறியெண்ணும் தேக்ககத்திலிருந்து நீக்கப்பட்டது. v0.6.7 வரை, சங்கிலிகள் 18, 19 இரண்டிலும் இவை இரண்டும் நிரந்தரமானவையாகத் தேக்கப்பட்டன. இப்போது, திரும்பத் திரும்ப வரும் தவறான இடைநிறுத்தம் ஒவ்வொரு விநியோகத்துக்கும் ஒரு Dilithium2 சரிபார்ப்புச் செலவை ஏற்படுத்துகிறது. அந்தச் செலவுக்குச் சக முனை வாரியான அளவி வரம்பிடுகிறது.
    • PrunedFormOutsideSync வேண்டுமென்றே நிரந்தரமானது அல்ல. முத்திரையிடப்பட்ட தொகுப்பின் குறிப்பான் வடிவம், மூலப் பரிவர்த்தனையின் சொந்த அடையாளத்துக்கே ஹாஷ் ஆகிறது. தேக்ககம் அந்த அடையாளத்தையே திறவுகோலாகக் கொள்கிறது. ஆகவே அந்த மறுப்பைத் தேக்கினால், எந்த gossip சக முனையும் நேர்மையான பரிவர்த்தனையை வலையமைப்பு முழுவதும் தணிக்கை செய்ய முடியும்.
    • ஒரு நிரூபணம் அறிவிக்கும் கேஸ் வரம்பு, அதன் சொந்த பைட்டுகளை ஒரு genesis மாறிலியுடன் ஒப்பிடுவதாகும். ஆகவே BundleGasLimit, AuthGasLimit இரண்டும் நிரந்தரமானவை. FeeTooLow அப்படி அல்ல: சங்கிலி 20-இல் தளக் கட்டணம் விலைகளுடன் சேர்ந்து மாறுகிறது. படி 4-இன் மூன்று தலைப்புக் கொள்கைகளும் ஒருபோதும் தேக்கப்படுவதில்லை. ஒவ்வொன்றும் இந்தக் கட்டமைப்பின் அறிவு மட்டுமே, பிந்தைய கட்டமைப்பு அதை மாற்றக்கூடும்.
    • ஃபாசெட் அனுமதிப் பட்டியல் உள்ள சங்கிலியில் (சங்கிலி 20), FaucetRecipientNotAllowed நிரந்தரமானது: அது மின்ட்டின் சொந்தப் பெறுநரை ஒரு genesis மாறிலியுடன் ஒப்பிடுகிறது. FaucetBudgetExhausted அப்படி அல்ல: அது நிலையாகும், அதே மின்ட் அடுத்த எபாக்கில் மீண்டும் ஏற்கப்படுகிறது.
    • டோக்கன் செயலின் BadSignature-உம் நிரந்தரமானது அல்ல; ஸ்டேக்கிங் செயலின் நிலை இதற்கு மாறானது. டோக்கனின் மின்ட் அதிகாரம் நிலையாகும். ஒரு SetAuthority அதை வேறொரு விசைக்கு மாற்றக்கூடும். அதே பைட்டுகள் அந்தச் சுழற்சி உறுதியாவதற்கு முன் மறுக்கப்படலாம், பின்னர் ஏற்கப்படலாம். பைட் நிலையிலான டோக்கன் மறுப்புகள் தேக்கப்படுகின்றன: தவறான பெயர் அல்லது குறியீடு, அதிகப்படியான தசம இடங்கள், பூஜ்ய அளவு, டோக்கன் குறியெண் 0 ஆகியவை. செயல் அமைக்கக்கூடாத எரிப்புப் புலம், தன் அளவுக்குத் திறக்காத உறுதிமொழி கொண்ட மின்ட், பெறப்பட்ட மறைப்புக் காரணி அல்லாத மறைப்புக் காரணியைக் கொண்ட பால வைப்பு ஆகியவையும் அவ்வாறே தேக்கப்படுகின்றன.

ஃபாசெட் வரம்பு

rand_mint கட்டணமில்லாதது. ஒவ்வொரு அழைப்பும் தொகுப்பில் ஒரு பரிவர்த்தனையை வைக்கிறது. சங்கிலி 20-இல் ஃபாசெட் இயக்கத்தில் உள்ளது, அதன் பின்னால் மதிப்பைத் தாங்கிய ஒரு பாலம் உள்ளது. அது செய்யக்கூடியவற்றை genesis வரம்பிடுகிறது. ஒரு மின்ட், அனுமதிப் பட்டியலில் உள்ள 16 வாலட்களுக்கு மட்டுமே செலுத்துகிறது; 1,000 பிளாக் எபாக் ஒன்றுக்கு அதிகபட்சம் 10,000 RAND (ஸ்டேக்கிங்). genesis staking.faucet_minters பட்டியலில் உள்ள 18 விசைகளில் ஒன்று மட்டுமே அதில் கையொப்பமிட முடியும் (MinterNotAllowed, ஒருபோதும் தேக்கப்படுவதில்லை). இது சங்கிலி 16 முதல் பேரேட்டு விதி; சங்கிலி 15-இல் இது முனைக் கொள்கையாக இருந்தது, அங்கு அந்தப் பட்டியல் genesis சரிபார்ப்பாளர்களாக இருந்தது. அதற்கு மேலாக, ஒவ்வொரு முனையும் தன் சொந்த ஃபாசெட்டை அளக்கிறது: தொடர்ச்சியாக எட்டு மின்ட்கள், வினாடிக்கு ஒன்று என்ற வீதத்தில் மீண்டும் நிரம்புகிறது (FAUCET_MINT_BURST, FAUCET_MINT_PER_SEC). அதைத் தாண்டினால் அழைப்பு faucet is rate limited on this node (8 mints back to back, refilling at 1/s); try again shortly எனப் பதிலளிக்கிறது. இந்த வரம்பு அழைப்பாளர் வாரியானது அல்ல, முனைச் செயல்முறை வாரியானது. ஏனெனில் RPC துறையில் அளப்பதற்கான சக முனை அடையாளம் எதுவும் இல்லை. மேலும், பாதுகாக்கப்படும் வளம் இந்த முனையின் தொகுப்பே. மேலே கூறிய கொள்ளளவு விலக்குடன் சேர்ந்து, ஃபாசெட் வெள்ளம் ஒரு PauseMints-க்கு முன்னால் தொகுப்பை நிரப்ப இயலாது.

Gossipsub பயன்பாட்டு நிலைச் சரிபார்ப்புடன் இயங்குகிறது. ஆகவே ஒரு பரிவர்த்தனை இங்கே சரிபார்க்கப்பட்ட பின்னரே பிற சக முனைகளுக்கு அனுப்பப்படுகிறது. செல்லாத பரிவர்த்தனைகளைப் பெருமளவில் அனுப்பும் சக முனை அளவியால் கட்டுப்படுத்தப்படுகிறது, தேக்ககத்திலிருந்து பதில் பெறுகிறது. ஒருமித்தக் கருத்துச் சுழற்சியில் அது எந்தச் செலவையும் ஏற்படுத்துவதில்லை.

ஒரு பிளாக்கை உருவாக்குதல்

ஒரு சரிபார்ப்பாளர் ஒரு பார்வையை வழிநடத்தும்போது, தொகுப்பிடம் வேட்பாளர்களைக் கேட்கிறது. candidates_within, தான் கட்டியெழுப்பும் பேரேட்டுக்கு இன்னும் பொருந்தும் பரிவர்த்தனைகளை மட்டுமே வைத்துக்கொள்கிறது. அதற்காக, ஏற்பின் மலிவான பாதியை மீண்டும் இயக்குகிறது: நங்கூரம் இன்னும் சாளரத்துக்குள் உள்ளதா, time இன்னும் அதற்குள் உள்ளதா, nullifiers இன்னும் செலவழிக்கப்படவில்லையா, உறுதிமொழிகள் இன்னும் இடம்பெறவில்லையா என்பவற்றை. சங்கிலி ஏற்கெனவே கடந்துவிட்ட mint_nonce அல்லது பதிவுக் குறியெண் கொண்ட டோக்கன் செயலையும், காலாவதியான nonce கொண்ட இடைநிறுத்தம் அல்லது பட்டியலிடலையும் அது நீக்குகிறது. v0.6.8 முதல், அது ஒவ்வொரு அழைப்பையும் invoke-ஐயும் மீண்டும் விலையிடுகிறது. இதற்கு, ஏற்பின்போது நினைவில் வைக்கப்பட்ட கேஸ் வரம்பையும், தான் கட்டியெழுப்பும் நுனியில் நடைமுறையிலுள்ள விலைகளையும் பயன்படுத்துகிறது. கட்டணம் இப்போது தளத்துக்குக் கீழே உள்ளதை அது விலக்கி வைக்கிறது. அந்தப் பரிவர்த்தனை தொகுப்பிலேயே இருக்கிறது, விலைகள் குறைந்தவுடன் மீண்டும் வழங்கப்படுகிறது (தணிக்கை v6, CH-9). சங்கிலி 20-இல் அது மீதமுள்ளவற்றை வரிசைப்படுத்துகிறது: முதலில் ஆளுகை, பின்னர் பரிவர்த்தனையின் ஒவ்வொரு KiB-க்கும் தற்போதைய தளத்துக்கு மேலான கட்டணம், பின்னர் கட்டணம், மிக அதிகமானது முதலில், சமநிலைகள் ஹாஷால் தீர்க்கப்படுகின்றன. ஆகவே ஒரே தொகுப்பின் மீது கட்டியெழுப்பும் ஒவ்வொரு நேர்மையான முன்மொழிபவரும் ஒரே பிளாக்கைத் தேர்ந்தெடுக்கிறார். அது 2,000 பரிவர்த்தனைகள் மற்றும் சங்கிலியின் பிளாக் உச்சவரம்பு என்ற ஒதுக்கீடு வரை நிரப்புகிறது (MAX_BLOCK_TXS; max_block_bytes, இயல்பாக 4 MiB, சங்கிலி 20-இல் 20 MiB). ஒரு பிளாக்குக்குப் பற்றாக்குறையாக இருப்பது பைட்டுகளே. அதனால்தான் உபரி ஒவ்வொரு KiB-க்கும் கணக்கிடப்படுகிறது. gas பிரிவு இல்லாத சங்கிலியும், கேஸ் கொள்கை இல்லாத முனையும் அந்தத் திறவுகோலைத் தவிர்த்து, ஆளுகை, கட்டணம், ஹாஷ் ஆகியவற்றின்படி வரிசைப்படுத்துகின்றன; சங்கிலி 15 அவ்வாறே செய்தது. முதலில் ஆளுகை என்பது இடைநிறுத்தத்தின் உத்தரவாதத்தின் மற்றொரு பாதியாகும். PauseMints வடிவமைப்பின்படியே கட்டணம் செலுத்துவதில்லை, ஏனெனில் RAND இல்லாத வாலட்டிலிருந்தும் அது இயங்க வேண்டும். ஆகவே வெறும் கட்டண வரிசை, இந்த அவசரத் தடையைக் கட்டணம் செலுத்தும் ஒவ்வொரு பரிவர்த்தனைக்கும் பின்னால் வைத்துவிடும்.

ஓர் அழைப்போ invoke-ஓ தயாராக இருக்கும்போது மேலும் ஒரு விதி பொருந்துகிறது (தணிக்கை v6, POOL-2; இது ஒவ்வொரு சங்கிலியிலும் முனைக் கொள்கை, செல்லுபடி விதி அல்ல). பைட் விலையைச் செலுத்துவது அவை மட்டுமே. தன் நிலையான அடிப்படைக் கட்டணத்துக்குச் சற்று மேலே செலுத்தும் பரிமாற்றம், ஒவ்வொரு KiB-க்குமான கணக்கில் அவற்றை விட உயர்ந்த இடம் பெறுகிறது. ஆகவே பரிமாற்றங்களின் தொடர் ஓட்டம், தயாராக உள்ள அழைப்பை ஒவ்வொரு பிளாக்கிலிருந்தும் வெளியே வைத்திருக்கக்கூடும். எனவே, முதல் சுற்றில் நிலையான கட்டணப் பரிவர்த்தனைகள் பிளாக்கின் பைட்டுகளில் அதிகபட்சம் நான்கில் மூன்று பங்கை மட்டுமே எடுக்கின்றன. அழைப்புகள் இடம்பெற்றதும், மீதமுள்ள இடம் நிறுத்தி வைக்கப்பட்ட பரிமாற்றங்களால் அவற்றின் வரிசைப்படி நிரப்பப்படுகிறது. பிளாக் இடம் எதுவும் இழக்கப்படுவதில்லை. அழைப்பு எதுவும் தயாராக இல்லையெனில் எதுவும் மாறுவதில்லை (கட்டணங்கள்).

மீதமுள்ள இடத்துக்கு மிகப் பெரிதான பரிவர்த்தனை தவிர்க்கப்படுகிறது, ஆனால் அதனால் பிளாக் முடிவடைவதில்லை: அதற்குப் பின்னால் உள்ள சிறிய பரிவர்த்தனை இன்னும் இடம்பெறுகிறது. சங்கிலி 18-இன் ஒரு பரிமாற்றம் சுமார் 2.85 MB: 1.49 MB தொகுப்பு நிரூபணம், 1.36 MB அங்கீகார நிரூபணம். ஆகவே அதன் 20 MiB பிளாக்கில் சுமார் ஏழுக்கும், இயல்பான 4 MiB பிளாக்கில் ஒன்றுக்கும் இடம் உண்டு. சங்கிலி 15-இல், ஒரு பரிமாற்றத்துக்குச் சுமார் 1.43 MB என்ற அளவில், அதே 20 MiB பதினான்கைக் கொண்டிருந்தது. சுமையின் கீழ், எவை இடம்பெறும் என்பதைக் கட்டணமே தீர்மானிக்கிறது (கட்டணங்கள்).

கத்தரித்தல்

ஒவ்வொரு உறுதிப்படுத்தலுக்குப் பிறகும், candidates_within தவிர்த்திருக்கக்கூடியவற்றைத் துல்லியமாக prune தொகுப்பிலிருந்து நீக்குகிறது. அவை: தங்கள் நோட்டை வேறொருவர் செலவழித்துவிட்ட பரிவர்த்தனைகள், உறுதிமொழி இப்போது இடம்பெற்றுவிட்டவை, nonce அல்லது பதிவுக் குறியெண்ணைச் சங்கிலி கடந்துவிட்டவை, நங்கூரமோ time-ஓ சாளரத்திலிருந்து வெளியே நகர்ந்துவிட்டவை (சங்கிலி 20-இல் 1,024 பிளாக்குகள், சங்கிலி 19 வரை 256). ஆகவே இரட்டைச் செலவுப் போட்டியில் தோற்கும் தொகுப்பு, யாருக்கும் எந்தப் பிழையையும் உருவாக்காமல் தானாகவே மறைந்துவிடுகிறது. rand_sendTransaction ஏற்றுக்கொள்வது உறுதிப்படுத்தல் ஆகாது. rand_getTransaction ஒரு பிளாக்கைத் திருப்பித் தரும் வரை அதை வினவுங்கள். பிளாக் இல்லாமலேயே நங்கூரச் சாளரம் கடந்துவிட்டால், புதிய நங்கூரத்தின் மீது தொகுப்பை மீண்டும் உருவாக்கி மீண்டும் சமர்ப்பியுங்கள்.

கண்காணித்தல்

rand_status, mempool_size, verify_queue (பணியாளருக்காகக் காத்திருக்கும் பரிவர்த்தனைகள்), refused_cache (தீர்ப்புத் தேக்ககத்திலுள்ள உள்ளீடுகள்) ஆகியவற்றை அறிவிக்கிறது. verify_queue 64-இலேயே நிலைத்திருந்தால், நான்கு பணியாளர்கள் சரிபார்ப்பதை விட வேகமாக நிரூபணங்கள் வந்துகொண்டிருக்கின்றன என்று பொருள்; விசை சூடாக இருக்கும்போது ஒவ்வொன்றுக்கும் சுமார் 16 ms ஆகிறது. பிளாக்குகள் நிரம்பியே இருக்கும்போது mempool_size வளர்ந்தால், சேர்க்கையைத் தீர்மானிப்பது வருகை வரிசை அல்ல, கட்டணமே என்று பொருள்.

இன்னும் இல்லாதவை

  • மாற்றீடு இல்லை. Chain 20-இன் gas, byte விலைகள் ஒவ்வொரு தொகுதியிலும் ஓர் அழைப்பின் குறைந்தபட்சக் கட்டணத்தை அவற்றின் உச்சவரம்புகள் வரை நகர்த்துகின்றன; ஒரு பரிமாற்றத்தின் குறைந்தபட்சக் கட்டணம் நிலையானது. குளத்தில் உள்ள ஒரு பரிவர்த்தனையை அதே notes மீது அதிகக் கட்டணம் கொண்ட வேறொன்றால் மாற்றும் வழிமுறை இல்லை; முரண்பாட்டு விதி அதை மறுக்கிறது. விலை உயர்வால் தகுதியிழந்த ஓர் அழைப்பு, விலைகள் குறையும் வரை அல்லது அதன் anchor சாளரம் கடக்கும் வரை, முன்மொழியப்படாமல் குளத்தில் காத்திருக்கிறது. v0.6.7-இல் (chains 18, 19) குளத்தில் இருந்த ஓர் அழைப்பு தான் ஏற்கப்பட்டபோது இருந்த குறைந்தபட்சக் கட்டணத்தையே வைத்திருந்தது; விலை உயர்ந்த பின்னும் முன்மொழியப்பட்டு, முன்மொழிபவரின் சோதனைப் பயன்பாட்டில் FeeTooLow எனத் தோல்வியடைந்தது. fullnode-இன் தொகுதி-இட ஆவணம், கட்டண வரிசைப்படுத்தப்பட்ட mempool-ஐப் பெரிய தொகுதிக்கு முந்தைய படியாகவும், தொகுதி-நிலைத் திரட்டலைத் தொகுதிக்கான உச்சவரம்பை உயர்த்துவதாகவும் பட்டியலிடுகிறது.
  • வயதால் காலாவதி இல்லை. குளத்தில் உள்ள ஒரு பரிவர்த்தனை சேர்க்கப்படுவதன் மூலம், byte வரம்பில் வெளியேற்றப்படுவதன் மூலம், அல்லது anchor மற்றும் நேரச் சாளரங்களின் மூலம் மட்டுமே வெளியேறுகிறது: chain 20-இல் 1,024 தொகுதிகள், அங்கு explorer அறிவித்த ஒரு தொகுதிக்கு 1.34 s என்ற வீதத்தில் சுமார் 23 நிமிடங்கள். chain 19 வரை இச்சாளரங்கள் 256 தொகுதிகள், சுமார் ஐந்து நிமிடங்கள்.
  • mempool RPC இல்லை. நிலுவையில் உள்ள பரிவர்த்தனைகளைப் பட்டியலிடும் முறை எதுவும் இல்லை; rand_status-இல் உள்ள mempool_size, rand_getMempoolInfo-இல் உள்ள எண்ணிக்கை, bytes, மிகப் பழைய வயது ஆகியவை மட்டுமே காட்சிகள்; explorer உறுதிசெய்யப்பட்ட தொகுதிகளை மட்டுமே குறியிடுகிறது.

fullnode கமிட் c0878c3f (சங்கிலி 21), மற்றும் fullnode v0.6.8 `c9c9bd3c` (chain 20): `crates/randprotocol-node/src/mempool.rs` (`MAX_POOL_BLOCKS`, `make_room`, `is_governance`, the call reservation in `candidates_within`), the commits for CH-7, CH-9, POOL-2, BRG-18, GOSSIP-1 and ZKV-4, and `rand_getLimits` on chain 20, fullnode v0.6.7 `86941a1`: `crates/randprotocol-node/src/mempool.rs`, `admission.rs`, `crates/randprotocol-core/src/ledger/mod.rs` (the gas floor), fullnode `90e7716`: `docs/architecture.md` §8, `docs/rpc.md` (changelog, the 2026-09-28 gas entries), fullnode `ed88241`: `docs/confidential.md` (transaction binding) உடன் 2026-10-12 அன்று இறுதியாகச் சரிபார்க்கப்பட்டது. நிரலும் இந்தப் பக்கமும் முரண்படும் இடங்களில் நிரலே சரியானது; எங்களுக்குத் தெரிவியுங்கள்.