720 / 736OVFL

Value Overflow Incident

حادثة فيض القيمة في الكتلة 74 638

كان Value Overflow Incident حادثة إجماع حرجة في 15 أغسطس 2010: استغلت معاملة في الكتلة 74 638 فيض جمع من 64 بت، فاجتاز مخرجان هائلان التحقق وأضافا 2^64 satoshi إلى الفرع الجاري تعدينه.

كان الخلل في تنفيذ قاعدة للتحقق، لا في التشفير أو جدول الإصدار. كانت قيمة كل مخرج موجبة، لكن جمعهما تجاوز النطاق فتحوّل إلى قيمة سالبة. ثم بدا الفرق بين المدخل وهذا المجموع السالب وكأنه رسوم. أضاف الإصدار 0.3.10 حدودًا قصوى للمخرجات المنفردة وللمجموع المتراكم؛ وبعد إعادة التنظيم نحو الفرع المصحح، خرجت الكتلة المعيبة من السجل النشط.

في 15 أغسطس 2010، لفت المطوّر Jeff Garzik الانتباه إلى الكتلة الغريبة 74 638. أنفقت المعاملة 1d5e512a9723cbef373b970eb52f1e9598ad67e7408077a82fdac194b65333c9 مدخلًا واحدًا بقيمة 0.50 BTC وأنشأت مخرجين هائلين. ويُظهر سجل printblock المنشور آنذاك أن قيمة كل منهما بلغت 92 233 720 368.54275808 BTC. لم تُحدَّد هوية منشئ المعاملة التي استغلت الثغرة بشكل موثوق؛ فالسجل العام يثبت بيانات المعاملة، لا هوية منشئها ولا دوافعه. [1]

كان Bitcoin يمثّل المبالغ آنذاك بأعداد صحيحة ذات إشارة بطول 64 بت، بوحدة ساتوشي. كانت القيمة الصحيحة لكل مخرج موجبة وأقل بقليل من الحد الأقصى لنوع int64، وهو ما يؤكده أيضًا التمثيل الست عشري 0x7ffffffffff85ee0. لكن مجموعهما، البالغ 18 446 744 073 708 551 616 ساتوشي، تجاوز النطاق الممكن تمثيله فتحوّل إلى −1 000 000 ساتوشي. وقد قبل التحقق القديم هذا المجموع السالب عند مقارنته بالمدخل. كان الخلل حسابيًا، ولم يكن كسرًا للتوقيعات. تختلف الأرقام العشرية الأخيرة في سجل JSON الأول في النقاش؛ ولإجراء حساب دقيق، نعتمد هنا القيمة الصحيحة التي يؤكدها كل من printblock والتمثيل الست عشري. [1]

أنتج مجموع المخرجين السالب، −0.01 BTC، مقابل مدخل بقيمة 0.50 BTC، رسومًا ظاهرية قدرها 0.51 BTC. لذلك حصل المعدّن في coinbase على 50.51 BTC بدلًا من المكافأة الأساسية البالغة 50 BTC. وبعد طرح المدخل المنفَق واحتساب الزيادة في coinbase، رفع المخرجان الهائلان المعروض في الفرع المعيب بمقدار 18 446 744 073 709 551 616 ساتوشي بالضبط: أي 2^64 ساتوشي، أو 184 467 440 737.09551616 BTC. لذا فهذا الرقم ليس مجرد مجموع قيمة المخرجين. [2]

استجاب المجتمع علنًا وتحت ضغط الوقت. وصف Lfm الخطأ بالخطير، واقترح Gavin Andresen مقارنة كل مخرج بسرعة مع 21 مليون BTC، ونشر Satoshi Nakamoto حلًا أوسع: رفض المخرج السالب أو المفرط ورفض المجموع المتراكم المفرط بعد كل إضافة. وطلب Satoshi من المعدّنين التوقف مؤقتًا كي يتمكن فرع صالح جديد من اللحاق بالفرع المعيب واستبداله بسرعة أكبر. [2]

أعلن Satoshi الإصدار 0.3.10 في 15 أغسطس 2010 عند 23:48 بتوقيت المنتدى، بعد نحو خمس ساعات وأربعين دقيقة من بلاغ Garzik. اعتبرت العقد المحدثة معاملة الاستغلال والكتلة 74 638 غير صالحتين وبنت فوق آخر كتلة صالحة مشتركة. وذكر الإعلان المعاصر لاحقًا أن الفرع الجيد تجاوز السيئ، فأمكن للعميل المحدث إعادة التنظيم تلقائيًا بلا حذف يدوي لملفات blockchain. [3]

لم تُحرر كتلة قديمة في قاعدة بيانات مركزية. وُجد تاريخان متنافسان: قبلت العقد القديمة الكتلة وفق القواعد الأصلية، بينما رفضتها العقد المصححة ولم تقبل إلا العمل فوق السلف الصالح. عندما جمع الفرع المصحح Proof of Work أكبر تبعته الشبكة وخرجت كتلة التضخم من التاريخ النشط؛ كان الحاسم تثبيت المستخدمين والمعدّنين للقواعد الجديدة والعمل اللاحق، لا أمر مدير واحد. [3]

تبقى الحماية التي أضيفت آنذاك ظاهرة في Bitcoin Core اليوم. ترفض CheckTransaction مخرجًا سالبًا أو أعلى من MAX_MONEY ومجموعًا متراكمًا خارج MoneyRange؛ والفحص بعد كل إضافة يمنع المجموع الخطر من الالتفاف قبل مقارنته. يشير تعليق المصدر صراحة إلى CVE-2010-5139، بينما يذكّر فحص المدخلات المكررة المنفصل بحادثة CVE-2018-17144 المختلفة. [4]

توضح الحادثة أن حد 21 مليون ليس ثابتًا سحريًا تحميه دالة التجزئة وحدها: تفرضه قواعد تحقق دقيقة وتنفيذها الصحيح. يجب أن يغطي التدقيق مجالات القيم، والجمع الآمن، وcoinbase والرسوم، وترتيب الفحوص، ومتجهات الاختبار الحدية، واتفاق التطبيقات المستقلة. ويبين التاريخ كذلك قدرة المجتمع المبكر على الإصلاح السريع واعتماده الكبير آنذاك على عدد قليل من المطورين والمعدّنين والتنسيق اليدوي. [5]

للحصول على صورة أوضح، اقرأ هذا المدخل مع Bitcoin Core, قواعد الإجماع, معاملة, UTXO, Reorg, Soft Fork.

01هل وُجد يومًا 184 مليار BTC في Bitcoin صالح؟

وُجدت لفترة قصيرة في الفرع المعيب الذي كان يُعدّن حينها نتيجة كتلة الاستغلال. رفضت العقد المصححة ذلك الفرع وأعاد الفرع الصالح تنظيمه، لذلك لا تنتمي المخرجات الهائلة إلى blockchain النشط أو مجموعة UTXO اليوم. لكن الحادثة التاريخية موثقة بالكتلة والاستجابة المعاصرة.

02هل كسرت الحادثة حد 21 مليون بصورة دائمة؟

لا في التاريخ المقبول اليوم؛ فقد رفضت قواعد الإجماع المصححة الكتلة المعيبة واختفت مخرجاتها في إعادة التنظيم. لكنها أثبتت أن الحد يعتمد على تحقق صحيح وعلى البرنامج الذي يشغله المشاركون فعلًا؛ العبارة في الوثائق لا تفرض العرض وحدها.

DOC · 001BitcoinTalk — Strange block 74638مصدر أولي DOC · 002BitcoinTalk — overflow bug SERIOUSمصدر أولي DOC · 003BitcoinTalk — Version 0.3.10, block 74638 overflow patchمصدر أولي DOC · 004Bitcoin Core — current CheckTransaction overflow checksتوثيق DOC · 005CVE — CVE-2010-5139توثيق
تمت المراجعة: المصادر أولًا · ليست نصيحة استثمارية