खामी सत्यापन नियम के कार्यान्वयन में थी, क्रिप्टोग्राफी या सिक्के जारी करने की समय-सारणी में नहीं। हर आउटपुट धनात्मक था, लेकिन जोड़ने पर ओवरफ़्लो के कारण योग ऋणात्मक हो गया। फिर इनपुट और इस ऋणात्मक योग का अंतर शुल्क समझ लिया गया। संस्करण 0.3.10 ने हर आउटपुट और कुल योग के लिए ऊपरी सीमा जोड़ी। सुधरी हुई शाखा पर पुनर्गठन के बाद दोषपूर्ण ब्लॉक सक्रिय इतिहास से बाहर हो गया।
15 अगस्त 2010 को डेवलपर Jeff Garzik ने असामान्य ब्लॉक 74 638 की ओर ध्यान दिलाया। ट्रांज़ैक्शन 1d5e512a9723cbef373b970eb52f1e9598ad67e7408077a82fdac194b65333c9 ने 0.50 BTC का एक इनपुट खर्च करके दो बहुत बड़े आउटपुट बनाए थे। उस समय के printblock रिकॉर्ड में हर आउटपुट की राशि 92 233 720 368.54275808 BTC है। इस खामी का फ़ायदा उठाने वाला ट्रांज़ैक्शन किसने बनाया, यह विश्वसनीय रूप से पता नहीं चला है। सार्वजनिक रिकॉर्ड से ट्रांज़ैक्शन के आँकड़े मिलते हैं, उसके निर्माता की पहचान या मंशा नहीं। [1]
उस समय Bitcoin राशियों को satoshi में, चिह्न सहित 64-बिट पूर्णांक के रूप में रखता था। हर आउटपुट का पूर्णांक मान धनात्मक था और int64 की अधिकतम सीमा से थोड़ा कम था। रिकॉर्ड में दिया हेक्साडेसिमल मान 0x7ffffffffff85ee0 भी इसकी पुष्टि करता है। लेकिन दोनों को जोड़ने पर 18 446 744 073 708 551 616 satoshi का योग बना, जो इस प्रकार की संख्या की सीमा से बाहर था। ओवरफ़्लो के कारण परिणाम −1 000 000 satoshi हो गया। पुराने सत्यापन ने इनपुट से तुलना करते समय इस ऋणात्मक योग को स्वीकार कर लिया। यह गणना की खामी थी, डिजिटल हस्ताक्षर टूटने का मामला नहीं। चर्चा में दिए पहले JSON रिकॉर्ड के आख़िरी दशमलव अंक अलग हैं; यहाँ सटीक गणना के लिए वह पूर्णांक लिया गया है जिसकी पुष्टि printblock और हेक्साडेसिमल रिकॉर्ड दोनों करते हैं। [1]
आउटपुट का योग −0.01 BTC था, जबकि इनपुट 0.50 BTC था। दोनों का अंतर लेने से 0.51 BTC का ऐसा शुल्क दिखा जो वास्तव में वैध नहीं था। माइनर ने इसलिए coinbase में 50 BTC के मूल पुरस्कार के बजाय 50.51 BTC लिए। खर्च किए गए इनपुट को घटाने और coinbase की अतिरिक्त राशि जोड़ने पर, इन दो विशाल आउटपुट ने दोषपूर्ण शाखा की आपूर्ति ठीक 18 446 744 073 709 551 616 satoshi बढ़ा दी। यह 2^64 satoshi, यानी 184 467 440 737.09551616 BTC है। इसलिए यह संख्या सिर्फ़ दोनों आउटपुट का जोड़ नहीं है। [2]
समुदाय ने समय की कमी के बावजूद खुले मंच पर समाधान खोजा। Lfm ने खामी को गंभीर बताया। Gavin Andresen ने सुझाव दिया कि हर आउटपुट को तुरंत 2.1 करोड़ BTC की सीमा से जाँचा जाए। Satoshi Nakamoto ने इससे व्यापक सुधार प्रकाशित किया: ऋणात्मक या बहुत बड़ा आउटपुट अस्वीकार किया जाए और हर राशि जोड़ने के बाद यह भी जाँचा जाए कि कुल योग सीमा से बाहर तो नहीं गया। Satoshi ने माइनरों से कुछ समय के लिए माइनिंग रोकने को भी कहा, ताकि नई वैध शाखा दोषपूर्ण शाखा को जल्दी पकड़ सके और उसकी जगह ले सके। [2]
Satoshi ने 15 अगस्त 2010 को फ़ोरम के समय के अनुसार 23:48 पर संस्करण 0.3.10 की घोषणा की। यह Garzik की रिपोर्ट के लगभग पाँच घंटे चालीस मिनट बाद हुआ। अपडेट किए गए नोड ने खामी का फ़ायदा उठाने वाले ट्रांज़ैक्शन और ब्लॉक 74 638 को अमान्य माना और अंतिम साझा वैध ब्लॉक से आगे ब्लॉक बनाने शुरू किए। उस घोषणा में बाद में बताया गया कि सही शाखा दोषपूर्ण शाखा से आगे निकल चुकी है। इसलिए अपग्रेड के बाद क्लाइंट बिना blockchain की फ़ाइलें हाथ से मिटाए अपने-आप सही शाखा पर आ सकता था। [3]
किसी केंद्रीय डेटाबेस में पुराने ब्लॉक को बदलकर नहीं लिखा गया। दो प्रतिस्पर्धी इतिहास मौजूद थे। पुराने नोड मूल नियमों के अनुसार ब्लॉक स्वीकार कर रहे थे; सुधरे हुए नोड उसे अस्वीकार कर रहे थे और केवल अंतिम वैध पूर्ववर्ती ब्लॉक से आगे किए गए काम को मान रहे थे। जब सुधरी हुई शाखा ने अधिक Proof of Work जमा कर लिया, नेटवर्क ने उसे अपनाया और अतिरिक्त सिक्कों वाला ब्लॉक सक्रिय इतिहास से बाहर हो गया। निर्णायक बात किसी एक प्रशासक का आदेश नहीं, बल्कि उपयोगकर्ताओं और माइनरों द्वारा नए नियम अपनाना और उसके बाद किया गया काम था। [3]
तब जोड़ी गई सुरक्षा आज भी Bitcoin Core के कोड में देखी जा सकती है। CheckTransaction ऋणात्मक आउटपुट, MAX_MONEY से बड़े आउटपुट और MoneyRange से बाहर जाने वाले कुल योग को अस्वीकार करता है। हर जोड़ के बाद जाँच करने से ऐसा नहीं होता कि तुलना किए जाने से पहले ही योग ओवरफ़्लो हो जाए। कोड की टिप्पणी में स्पष्ट रूप से CVE-2010-5139 का उल्लेख है। वहीं, एक ही इनपुट के दोबारा इस्तेमाल की अलग जाँच में एक अन्य घटना, CVE-2018-17144, का संदर्भ दिया गया है। [4]
यह घटना समझाती है कि 2.1 करोड़ की सीमा कोई जादुई संख्या नहीं है जिसे सिर्फ़ हैश सुरक्षित रखता हो। इसे सटीक सत्यापन नियम और उनका सही कार्यान्वयन लागू करते हैं। इसलिए ऑडिट में हर राशि की सीमा, सुरक्षित जोड़, coinbase और शुल्क, जाँच का क्रम, सीमा के आसपास के परीक्षण और स्वतंत्र सॉफ़्टवेयर कार्यान्वयनों के बीच सहमति देखनी चाहिए। यह इतिहास शुरुआती समुदाय की तेज़ी से खामी सुधारने की क्षमता भी दिखाता है और उस समय कुछ डेवलपर, माइनर तथा सीधे आपसी समन्वय पर उसकी भारी निर्भरता भी। [5]
पूरी तस्वीर के लिए इस प्रविष्टि के साथ यह भी पढ़ें Bitcoin Core, सहमति के नियम, लेनदेन, UTXO, Reorg, Soft Fork.
01क्या वैध Bitcoin में कभी 184 अरब BTC मौजूद थे?+
खामी का फ़ायदा उठाने वाले ब्लॉक के कारण वे उस समय माइनिंग हो रही दोषपूर्ण शाखा में थोड़े समय के लिए मौजूद थे। सुधरे हुए नोड ने उस शाखा को अस्वीकार किया और पुनर्गठन में वैध शाखा ने उसकी जगह ले ली। इसलिए वे विशाल आउटपुट आज के सक्रिय blockchain या UTXO सेट का हिस्सा नहीं हैं। फिर भी ऐतिहासिक घटना से इनकार नहीं किया जा सकता: ब्लॉक और उस समय की प्रतिक्रिया, दोनों के रिकॉर्ड मौजूद हैं।
02क्या इस घटना ने 2.1 करोड़ की सीमा हमेशा के लिए तोड़ दी?+
आज स्वीकार किए जाने वाले इतिहास में नहीं। सुधरे सहमति नियमों ने दोषपूर्ण ब्लॉक अस्वीकार किया और पुनर्गठन के साथ उसके आउटपुट हट गए। लेकिन घटना ने दिखाया कि सीमा सही सत्यापन और प्रतिभागियों द्वारा वास्तव में चलाए जा रहे सॉफ़्टवेयर पर निर्भर करती है। दस्तावेज़ में लिख देने भर से आपूर्ति की सीमा लागू नहीं होती।