1315 अगस्त 2010
जिस दिन 184 अरब बिटकॉइनों का निर्माण हुआ
एक ट्रांज़ैक्शन राशि की जाँच से बच निकली और उसने Bitcoin की तय आपूर्ति से कई गुना अधिक बिटकॉइन बना दिए। कुछ घंटों में सुधार आ गया, लेकिन घटना ने दिखाया कि मुद्रा के नियम उतने ही भरोसेमंद हैं जितना उन्हें लागू करने वाला कोड।
रविवार, 15 अगस्त 2010 को Jeff Garzik ने नए माइन किए गए ब्लॉक 74 638 और उसमें दर्ज एक ऐसी राशि की ओर ध्यान दिलाया, जिसका अस्तित्व नहीं होना चाहिए था। एक ही ट्रांज़ैक्शन ने दो आउटपुट बनाए थे और हर एक की राशि 92 अरब BTC से अधिक थी। उनका कुल योग Bitcoin की नियोजित आपूर्ति का लगभग नौ हज़ार गुना था। Garzik ने 18:08:49 UTC पर फ़ोरम में “Strange block 74638” नाम से एक चर्चा शुरू की और ब्लॉक के आँकड़े पोस्ट किए। कुछ ही मिनटों में स्पष्ट हो गया कि यह न तो ब्लॉक एक्सप्लोरर की गलती थी, न दशमलव बिंदु गलत जगह लगने का मामला। नेटवर्क ने अपने ही मुद्रा-संबंधी नियम का उल्लंघन करने वाला ब्लॉक स्वीकार कर लिया था। सिक्के मनमर्ज़ी से नहीं बनाए जा सकते, इस भरोसे को बनाए रखने के लिए उपयोगकर्ताओं को पहले खामी ढूँढ़नी थी, सॉफ़्टवेयर ठीक करना था और पर्याप्त प्रतिभागियों को इतिहास की दूसरी शाखा पर आगे बढ़ने के लिए राज़ी करना था।
अजीब ब्लॉक 74 638
Garzik की पोस्ट छोटी और सीधी थी। उसमें ट्रांज़ैक्शन का हैश और दो विशाल आउटपुट दिखाए गए थे। उसी चर्चा में बाद में आए printblock रिकॉर्ड ने उनकी सटीक राशि बताई: हर आउटपुट में 92 233 720 368.54275808 BTC थे। ब्लॉक में एक अलग coinbase ट्रांज़ैक्शन भी था, जो माइनर को 50.51 BTC देता था। सामान्य पचास बिटकॉइन के मूल पुरस्कार के सामने वे दो आउटपुट अविश्वसनीय लगते थे: किसी ने अभी-अभी 184 अरब से अधिक इकाइयाँ बना दी थीं।
ट्रांज़ैक्शन भेजने वाले का नाम या उसका कोई सार्वजनिक स्पष्टीकरण सामने नहीं आया। सुरक्षित बचे ब्लॉकचेन रिकॉर्ड से पता चलता है कि हुआ क्या था, लेकिन यह नहीं कि किसने और किस उद्देश्य से इस खामी का इस्तेमाल किया। किसी खास हैकर को ज़िम्मेदार बताना कहानी में ऐसी जानकारी जोड़ना होता, जो स्रोतों में मौजूद नहीं है। इतना स्पष्ट है कि ट्रांज़ैक्शन को जाँच की कमज़ोरी का लाभ उठाने के लिए बनाया गया था।
नेटवर्क ने ट्रांज़ैक्शन स्वीकार कर ली, क्योंकि पुराना कोड पहले अलग-अलग आउटपुट और फिर उनका योग जाँचता था। दोनों विशाल आउटपुट अपने-अपने स्तर पर इस्तेमाल किए गए संख्या-प्रकार की सीमा में थे, लेकिन उनका जोड़ उसकी ऊपरी सीमा से बाहर चला गया। संख्या पलटकर ऋणात्मक हो गई और अगली जाँच ने गलत निष्कर्ष निकाला कि कोई अवैध धनात्मक राशि नहीं बनाई जा रही है।
हमलावर ने न तो जाली हस्ताक्षर बनाया, न कोई पुरानी ट्रांज़ैक्शन बदली और न ही अधिकांश हैशरेट पर कब्ज़ा किया। उसने उस तरीके का फायदा उठाया जिससे सॉफ़्टवेयर पूर्णांकों पर गणना करता था। गणितीय नियम सही था: जितनी राशि इनपुट में है, उससे अधिक आउटपुट में नहीं जा सकती। लेकिन ओवरफ़्लो के कारण प्रोग्राम उस नियम को लोगों की मंशा के अनुसार लागू नहीं कर पाया।
ब्लॉक पहले ही नेटवर्क की मुख्य चेन का हिस्सा बन चुका था। दोषपूर्ण संस्करण चलाने वाला हर नोड उसे वैध मान रहा था और दूसरे माइनर उसके ऊपर नए ब्लॉक बना सकते थे। इसलिए समस्या सार्वजनिक कर देना भर पर्याप्त नहीं था। समुदाय को जल्दी कदम उठाने थे, इससे पहले कि दोषपूर्ण इतिहास और फैले और उन विशाल आउटपुटों को आगे खर्च किया जाने लगे।
नियम और मशीन के बीच एक त्रुटि
2.1 करोड़ की सीमा को अक्सर Bitcoin का अटल नियम कहा जाता है। इस घटना ने उसकी अधिक सटीक तस्वीर दिखाई। यह सीमा Consensus Rules का हिस्सा है, जिन्हें हर प्रोग्राम और प्रत्येक Full Node को सही ढंग से लागू करना होता है। अगर प्रचलित नोड सॉफ़्टवेयर में एक ही दोषपूर्ण कार्यान्वयन हो, तो सभी कुछ समय के लिए ऐसी स्थिति स्वीकार कर सकते हैं जो मूल नियम के विरुद्ध हो।
पूर्णांक में ओवरफ़्लो होना प्रोग्रामिंग की पुरानी समस्या है। कंप्यूटर के रजिस्टर में असीमित संख्याएँ नहीं समा सकतीं। उसकी सीमा पार होने पर गणना का परिणाम संख्या-रेखा के बिल्कुल दूसरे छोर पर पहुँच सकता है। किसी लेखा प्रणाली में यह छोटा-सा तकनीकी विवरण बहुत मायने रखता है। योग को सिर्फ गणना पूरी होने पर नहीं, बल्कि गणना के दौरान भी जाँचना चाहिए और हर राशि को अनुमत सीमा के भीतर रखना चाहिए।
इसीलिए आज Bitcoin Core कई अलग-अलग जाँच करता है। कोई आउटपुट ऋणात्मक नहीं हो सकता, अधिकतम मुद्रा आपूर्ति से बड़ा नहीं हो सकता और हर बार जोड़ने के बाद कुल राशि दोबारा जाँची जाती है। कोड की ये पंक्तियाँ किसी काल्पनिक खतरे के लिए नहीं लिखी गईं। इनके पीछे उस घटना का अनुभव है जिसमें सिर्फ एक सुरक्षा-जाँच की कमी ने नेटवर्क को आर्थिक रूप से असंभव ट्रांज़ैक्शन दर्ज करने दी थी।
यह खामी लिखे हुए तकनीकी नियम और लोगों की अपेक्षा के बीच का अंतर भी दिखाती है। फ़ोरम पर किसी ने गंभीरता से यह दावा नहीं किया कि पुराने सॉफ़्टवेयर ने विशाल राशि स्वीकार कर ली, इसलिए वह वैध हो गई। सभी समझ रहे थे कि मूल नियम टूटा है। लेकिन यह सहमति अपने-आप समस्या हल नहीं कर सकती थी। ऐसा नया संस्करण चाहिए था जो दोषपूर्ण ब्लॉक को अस्वीकार करे।
यहीं लोगों और कोड की भूमिकाएँ मिलती हैं। कोड निश्चित नियमों से तय करता है कि नोड कौन-सा ब्लॉक स्वीकार करेगा। जब लोग उसमें मूल नियमों से टकराव पाते हैं, तो वे तय करते हैं कि कौन-सा कोड चलाना है। यह नए बिटकॉइन जारी करने पर मतदान नहीं था। यह उस नियम को बहाल करने की दौड़ थी जिसे समुदाय पहले से व्यवस्था का आधार मानता था।
ओवरफ़्लो का खतरा यही है कि इंसान जिस बेतुके परिणाम को तुरंत पहचान लेता है, मशीन उसे नहीं पहचानती। प्रोसेसर सीमित जगह में संग्रहीत संख्याओं पर गणना करता है। गणना उस सीमा से बाहर निकल जाए तो परिणाम संख्या-सीमा के दूसरे हिस्से में पहुँच सकता है। पुराना कोड अलग-अलग आउटपुट जाँचता था, लेकिन जोड़ते समय कुल राशि को सुरक्षित सीमा में नहीं रखता था। इसलिए ट्रांज़ैक्शन ने कई ऐसी जाँचें पार कर लीं जो अलग-अलग देखने पर उचित थीं, फिर भी वह उनके साझा उद्देश्य के विरुद्ध थी। सुधार को कोड में उतारना ज़रूरी था। टिप्पणी में यह लिख देना पर्याप्त नहीं था कि बिटकॉइन की संख्या कभी 2.1 करोड़ से अधिक नहीं होगी। हर नोड को इस सीमा को हर गणना में लागू करने वाला नियम चाहिए था।
दबाव में सुधार
सूचना सामने आने के बाद फ़ोरम पर सलाह दी गई कि फिलहाल ट्रांज़ैक्शन स्वीकार करना और माइनिंग करना रोक दें। दोषपूर्ण ट्रांज़ैक्शन के ऊपर हर नया ब्लॉक उस काम को बढ़ाता जिसे बाद में छोड़ना पड़ता। नेटवर्क में कोई केंद्रीय बंद करने वाला बटन नहीं था, इसलिए Satoshi माइनिंग रोक नहीं सकते थे। वे सुधार जारी करके ऑपरेटरों को उसे चलाने के लिए समझा सकते थे।
संस्करण 0.3.10 ने राशियों की सही जाँच लागू की और ब्लॉक 74 638 को अस्वीकार किया। सुधारे गए नोड आखिरी साझा वैध ब्लॉक तक लौटे और माइनरों ने कृत्रिम रूप से आपूर्ति बढ़ाने वाली ट्रांज़ैक्शन के बिना दूसरी शाखा बनानी शुरू की। कुछ समय तक दोनों इतिहास अपने पीछे जमा हुए गणनात्मक काम के आधार पर प्रतिस्पर्धा करते रहे।
बाद में Satoshi ने बताया कि सही चेन गलत चेन से आगे निकल गई है। अपडेट किए गए सॉफ़्टवेयर ने चेन का पुनर्गठन किया और दोषपूर्ण ब्लॉक सक्रिय इतिहास से हट गया। छोड़ी गई शाखा की जो ट्रांज़ैक्शन स्वयं वैध थीं, वे प्रतीक्षा सूची में लौटकर बाद में किसी ब्लॉक में शामिल हो सकती थीं। लेकिन नए नियमों के अनुसार उन विशाल आउटपुटों को स्वीकार नहीं किया जा सकता था।
इस सुधार की कीमत भी चुकानी पड़ी। छोड़ी गई शाखा के माइनरों ने अपने पुरस्कार खो दिए और उपयोगकर्ताओं को मानना पड़ा कि कुछ घंटों का इतिहास आगे नहीं बढ़ेगा। 2010 में नेटवर्क छोटा था और समन्वय जल्दी हो गया। कहीं बड़े तंत्र में ऐसा ही कदम अधिक आर्थिक भागीदारों, सॉफ़्टवेयर के अधिक संस्करणों और इस बात पर अधिक विवादों से जुड़ता कि सुधार की सीमा कहाँ होनी चाहिए।
इतनी तेज़ प्रतिक्रिया को अक्सर Satoshi के चमत्कारी हस्तक्षेप की तरह बताया जाता है। असल में यह कई ठोस कदमों का नतीजा थी, जिन्हें रिकॉर्ड में देखा जा सकता है: Garzik ने समस्या सार्वजनिक की, दूसरों ने ओवरफ़्लो का विश्लेषण किया, डेवलपर्स ने बदलाव तैयार किया, ऑपरेटरों ने Bitcoin क्लाइंट का नया संस्करण लगाया और माइनरों ने सही शाखा के लिए काम किया। निर्माता सुधार सुझा सकता था, लेकिन उसे वास्तव में अपनाना नेटवर्क के हाथ में था।
सबसे कठोर नियम को सबसे विनम्र विकास की आवश्यकता होती है
सुधार के बाद वैध बिटकॉइन की संख्या फिर अपेक्षित सीमा में आ गई। गलत तरीके से बने अरबों बिटकॉइन को आगे जारी चेन में खर्च नहीं किया जा सकता था, इसलिए आपूर्ति में यह बढ़ोतरी स्थायी नहीं रही। फिर भी इसे बीटा संस्करण की एक अजीब घटना कहकर छोड़ना ठीक नहीं होगा। यह याद दिलाती है कि मुद्रा पर भरोसा किसी नारे से नहीं, बार-बार जाँचे गए प्रोग्राम से बनता है।
Bitcoin की तुलना अक्सर उन व्यवस्थाओं से की जाती है जिनमें कोई केंद्रीय संस्था निर्णय लेकर मुद्रा आपूर्ति बदल सकती है। लेकिन यहाँ भी लोगों की भूमिका खत्म नहीं होती। डेवलपर सॉफ़्टवेयर लिखते हैं, समीक्षक उसमें खामियाँ खोजते हैं, ऑपरेटर संस्करण चुनते हैं और माइनर ब्लॉकों का क्रम बनाते हैं। अंतर यह है कि बदलाव सार्वजनिक होता है और हर नोड उन नियमों को स्वयं अस्वीकार कर सकता है जिनसे वह सहमत नहीं है।
इस घटना से यह भी समझ में आता है कि आजकल सहमति-आधारित कोड में बदलाव कितनी सावधानी से किए जाते हैं। एक छोटा-सा अंकगणितीय अनुकूलन भी मौद्रिक परिणाम पैदा कर सकता है। परीक्षण, कई कार्यान्वयनों की जाँच और धीमी समीक्षा अतिरिक्त नौकरशाही नहीं हैं; वे उस क्षण की पुनरावृत्ति से बचाव हैं जब कुछ बिट्स ने एक अस्वीकार्य संख्या को कथित रूप से वैध संख्या में बदल दिया था।
Jeff Garzik की एक फ़ोरम पोस्ट ने नेटवर्क को हमेशा के लिए सुरक्षित नहीं बना दिया, लेकिन उसने सार्वजनिक बहीखाते का फायदा दिखाया। कोई भी उस अजीब ब्लॉक को देख सकता था, उसके आउटपुट फिर से जोड़ सकता था और सुधार की जाँच कर सकता था। खामी किसी ऑपरेटर के निजी डेटाबेस में छिपी नहीं थी। वह पूरे समुदाय के सामने थी, इस प्रमाण के साथ कि पुराने नोड उसे स्वीकार कर चुके थे।
आपूर्ति की सीमा इस घटना से बच गई, लेकिन उस अर्थ में नहीं जो अक्सर “अटल” शब्द से निकाला जाता है। सॉफ़्टवेयर विफल हो सकता था और हुआ भी। सुधार इसलिए संभव हुआ क्योंकि खामी सबको दिखाई दे रही थी, लौटने के लिए एक साझा नियम मौजूद था और पर्याप्त लोगों ने सुधार लागू किया। 184 अरब बिटकॉइन की कहानी निश्चित आपूर्ति को झुठलाती नहीं है। वह बताती है कि उस सीमा को बनाए रखने के लिए वास्तव में क्या करना पड़ता है।
यह घटना यह भी याद दिलाती है कि कोड की सार्वजनिक उपलब्धता स्वयं त्रुटि को दूर नहीं करती। ओपन सोर्स ने लोगों को एकमात्र आपूर्तिकर्ता का इंतज़ार किए बिना समस्या खोजने, तुलना करने और सुधारने की अनुमति दी, लेकिन तय करने वाली बात विशिष्ट भागीदारों का ध्यान था। किसी को असंभव संख्याओं का ध्यान देना पड़ा, किसी को दोषपूर्ण शर्त खोजनी पड़ी और संचालकों को अपडेट स्वीकार करना पड़ा। पारदर्शिता ने जाँच की संभावना बनाई; केवल कार्रवाई ने उसे नेटवर्क की रक्षा में बदला। इसलिए यह कहानी वर्षों बाद भी महत्वपूर्ण है: बिटकॉइन की सुरक्षा एक पूर्ण मूल कार्यक्रम की कल्पना में नहीं, बल्कि सटीक नियमों, स्वतंत्र सत्यापन और त्रुटि को छिपाए बिना उस पर प्रतिक्रिया देने की क्षमता के संयोजन में निहित है।
Atlas में व्यक्ति और अवधारणाएँ
स्रोत और कहानी की सीमाएँ
- 01BitcoinTalk — Strange block 74638
जेफ गार्जिक की मूल चेतावनी, सटीक आउटपुट, ओवरफ्लो विश्लेषण और प्रतिक्रिया की समयरेखा।
- 02BitcoinTalk — overflow bug SERIOUS
उस समय के विकासकर्ता समन्वय, सत्यापन त्रुटि की मरम्मत और सुधारित श्रृंखला में परिवर्तन।
- 03Bitcoin Core — transaction consensus checks
अलग-अलग आउटपुट और उनके योग को अनुमत सीमा में रखने वाली जाँचों का वर्तमान कार्यान्वयन।