50 / 736NONCE

Nonce

ब्लॉक हेडर में माइनिंग काउंटर

Nonce वह संख्या है जिसे माइनिंग उपकरण नया Bitcoin ब्लॉक खोजते समय बदलता है। हर बदलाव गणना को नया इनपुट और माइनिंग के नियम पूरे करने का एक और प्रयास देता है।

माइनर ब्लॉक हेडर का हैश, यानी संख्यात्मक फ़िंगरप्रिंट, निकालता है। Proof of Work (गणनात्मक काम का प्रमाण) देने के लिए नतीजा target नाम की तय सीमा से कम या उसके बराबर होना चाहिए। Nonce उन मानों में से एक है जिन्हें अगली कोशिश के लिए बदला जा सकता है। यह पासवर्ड या गुप्त कुंजी नहीं है: ब्लॉक प्रकाशित होने पर इसे हर कोई देख सकता है।

Anna के पास एक माइनिंग उपकरण है जो लेनदेन का नया ब्लॉक बनाने की कोशिश कर रहा है। वह हेडर, यानी ब्लॉक की जानकारी के संक्षिप्त समूह, से SHA-256 के ज़रिए संख्यात्मक फ़िंगरप्रिंट या हैश निकालता है। Bitcoin यह गणना दो बार करता है, इसलिए इसे double-SHA-256 कहते हैं। नतीजा अनुमत सीमा से ऊपर हो तो उपकरण, उदाहरण के लिए, Nonce को 10 से 11 करके फिर कोशिश करता है। Anna खुद संख्याएँ नहीं चुनती; उपकरण अपने आप बहुत बड़ी संख्या में प्रयास करता है। बड़ा Nonce छोटे हैश या लक्ष्य के करीब पहुँचने का संकेत नहीं है। बिल्कुल वही हेडर हमेशा वही हैश देता है, इसलिए उसकी गणना दोहराने से नया मौका नहीं मिलता। [1] [2]

Nonce के लिए चार बाइट, यानी 32 बिट, रखे गए हैं। इनमें 0 से 4,294,967,295 तक के पूर्णांक, दोनों सिरों सहित, आ सकते हैं: कुल 4,294,967,296 विकल्प, जिसे 2^32 लिखते हैं। हमारे लिए यह बहुत बड़ा आँकड़ा है, लेकिन ASIC नाम का विशेष माइनिंग उपकरण यह दायरा बहुत जल्दी जाँच सकता है। सारे मान आज़माना भी सफलता की गारंटी नहीं है। हेडर का बाकी डेटा न बदले तो शुरुआत से दोहराने पर पुराने नतीजे ही मिलेंगे। इसलिए सॉफ़्टवेयर को अलग हेडर भी तैयार करने पड़ते हैं। [1] [5]

एक तरीका Extranonce बदलना है। मिलता-जुलता नाम भ्रम पैदा कर सकता है: यह हेडर का अतिरिक्त फ़ील्ड नहीं, बल्कि coinbase लेनदेन के अंदर का डेटा है। Coinbase ब्लॉक का पहला लेनदेन होता है, जो माइनिंग इनाम आवंटित करता है। उसमें बदलाव से उसका पहचानकर्ता txid बदलता है और फिर हेडर में रखा लेनदेन का साझा फ़िंगरप्रिंट Merkle root बदलता है। उपकरण को अब अलग इनपुट मिलता है। वह वही Nonce मान फिर इस्तेमाल कर सकता है, लेकिन इस बार अलग हेडर के हैश निकालता है। नए 2^32 विकल्प भी ब्लॉक मिलने की गारंटी नहीं देते। [2] [3]

ब्लॉक एक्सप्लोरर में किसी ब्लॉक का Nonce छोटा और किसी दूसरे का बड़ा दिख सकता है। अकेली संख्या नहीं बताती कि ब्लॉक खोजना कितना कठिन था या कौन बेहतर है। Full Node, यानी Bitcoin के नियमों के अनुसार ब्लॉक और लेनदेन खुद जाँचने वाला प्रोग्राम, पूरे हेडर का हैश निकालकर वैध target से तुलना करता है। Target का संक्षिप्त रूप nBits फ़ील्ड में होता है। मायने इस बात के हैं कि हैश सीमा से कम या बराबर है, Nonce के आकार के नहीं। जाँच यहीं खत्म नहीं होती: नोड को लेनदेन और ब्लॉक की बाकी वैधता के नियम भी जाँचने होते हैं। [1] [8]

लेनदेन पर हस्ताक्षर के बारे में पढ़ते समय भी nonce मिलेगा। वहाँ इसका अर्थ एक गुप्त सहायक संख्या हो सकता है, जिसे तकनीकी भाषा में स्केलर कहते हैं। हस्ताक्षर एल्गोरिदम इसे Private Key, यानी धन खर्च करने की अनुमति देने वाली निजी कुंजी, के साथ इस्तेमाल करता है। अलग संदेशों के लिए इस संख्या का गलत दोबारा इस्तेमाल कुंजी उजागर कर सकता है। माइनिंग Nonce अलग है: वह सार्वजनिक है और वही संख्या अलग हेडर में आ सकती है। हस्ताक्षर के सार्वजनिक हिस्से भी उस गुप्त सहायक संख्या से अलग होते हैं। इसलिए एक उपयोग के नियम बिना संदर्भ दूसरे पर लागू नहीं किए जा सकते। [9]

बहुत से उपकरण Mining Pool में साथ काम करें तो सभी को एक ही हेडर के हैश नहीं निकालने चाहिए। दोहराने से नई कोशिशें नहीं जुड़तीं। इसलिए समन्वयक उन्हें अलग डेटा देता है, जैसे coinbase और Extranonce के लिए। Stratum जैसे प्रोटोकॉल काम पहुँचाते हैं; जुड़ी माइनिंग इकाइयों को workers भी कहा जाता है। BIP23 में Nonce का दायरा तय करने वाला वैकल्पिक noncerange पैरामीटर भी है। इसका मतलब यह नहीं कि हर पूल इसे इस्तेमाल करे या पूल ब्लॉक की वैधता के नियम बदल सकता है। [4] [2]

Merkle Tree लेनदेन के फ़िंगरप्रिंट चरणों में जोड़कर एक साझा फ़िंगरप्रिंट, Merkle root, बनाता है। Coinbase लेनदेन का पहचानकर्ता txid इस गणना में वृक्ष की एक पत्ती की तरह शामिल होता है। इसलिए Extranonce बदलने पर नया txid और फिर नया Merkle root बनता है। माइनर बाकी लेनदेन और पिछले ब्लॉक का संदर्भ बनाए रखते हुए भी नया हेडर पा सकता है। यह पुष्ट ब्लॉक को दोबारा लिखना नहीं है: बदलाव नए ब्लॉक के प्रस्ताव में हो रहा है, जिसके लिए अभी वैध Proof of Work खोजा जा रहा है। [1] [2]

सॉफ़्टवेयर अनुमत सीमाओं में समय nTime बदलकर या अनुमत वर्ज़न बिट बदलकर और हेडर बना सकता है। दूसरे तरीके को version rolling कहते हैं। BIP320 चुने हुए nVersion बिटों के सामान्य उपयोग का प्रस्ताव देता है; सिर्फ यह प्रस्ताव सारे बिट मनमाने ढंग से बदलने की अनुमति नहीं देता। नेटवर्क और सौंपे गए माइनिंग काम के नियम लागू रहते हैं। इन तरीकों में से कोई भी अंतिम हैश के वैध target को पूरा करने की शर्त नहीं हटाता। नया BIP323 अधिक बिट इस्तेमाल करने का प्रस्ताव है और अभी Draft, यानी मसौदा, है। [4] [5] [10]

तकनीकी दस्तावेज़ पढ़ने के लिए प्रारूप जानना उपयोगी है। हेडर 80 बाइट का होता है: वर्ज़न, पिछले ब्लॉक का हैश, Merkle root, समय, nBits और चार बाइट का Nonce। Nonce, uint32 प्रकार का बिना चिह्न वाला 32-बिट पूर्णांक है। इसे little-endian क्रम में लिखा जाता है, जिसमें सबसे कम स्थान-मूल्य वाला बाइट पहले आता है। केवल Nonce बदलने से हेडर और उसका double-SHA-256 हैश बदलते हैं, लेनदेन की सूची नहीं। सॉफ़्टवेयर को यह सटीक रूप चाहिए, लेकिन माइनिंग समझने के लिए इसे हाथ से तैयार करना आना ज़रूरी नहीं है। [1]

गहराई से जाँचने के लिए Bitcoin Core में किसी खास ब्लॉक के हैश के साथ getblockheader इस्तेमाल किया जा सकता है। सामान्य विस्तृत आउटपुट में nonce, bits और time जैसे फ़ील्ड आते हैं। verbose पैरामीटर false करने पर हेडर के ठीक 80 बाइट हेक्साडेसिमल रूप में मिलते हैं। इनसे double-SHA-256 निकालकर संख्यात्मक नतीजे की वैध target से तुलना की जा सकती है। अपना प्रोग्राम लिखते समय Bitcoin का बाइट क्रम मानना ज़रूरी है: बाइट गलत तरह से उलटने पर तुलना बदल जाती है। एक्सप्लोरर में केवल Nonce पढ़ना इस जाँच का विकल्प नहीं है। [1] [6] [8]

पूरी तस्वीर के लिए इस प्रविष्टि के साथ यह भी पढ़ें Block Header, माइनिंग, Proof of Work, Mining Target, कॉइनबेस लेनदेन, Bitcoin. इस प्रविष्टि का उल्लेख यहाँ भी है Block Header, कॉइनबेस लेनदेन, ASIC Miner, Stratum V1.

DOC · 001Bitcoin Developer Reference — Block headersदस्तावेज़ DOC · 002Bitcoin Developer Guide — Miningदस्तावेज़ DOC · 003Bitcoin Developer Reference — Transactionsदस्तावेज़ DOC · 004BIP 23 — getblocktemplate pooled miningविनिर्देश DOC · 005BIP 320 — nVersion bits for general purpose useविनिर्देश DOC · 006Bitcoin Core RPC — getblockheaderदस्तावेज़ DOC · 007Bitcoin Core RPC — getblocktemplateदस्तावेज़ DOC · 008Bitcoin Core v30.0 — Proof of Work validationप्राथमिक स्रोत DOC · 009BIP 340 — Schnorr Signaturesविनिर्देश DOC · 010BIP 323 — 24 nVersion bits for general purpose useदस्तावेज़
समीक्षा की गई: स्रोत पहले · यह निवेश सलाह नहीं है