تعدين البيتكوين على IBM 1401 المخضرم البالغ من العمر 55 عامًا

مستوحاة من نشر المستخدم mark_ablov" باستخدام البيتكوين باستخدام الورق والقلم " ، قررنا أن قراء hiktime سيكونون مهتمين بالأفكار المجنونة الأخرى التي تمكن مؤلف المنشور الأصلي ، كين شريف ، من إدراكها.

هل يمكن استخدام حاسوب IBM الرئيسي من الستينيات من القرن الماضي لتعدين البيتكوين؟ قررت التحقق من هذه الفكرة التي تبدو مجنونة. لقد قمت بحقن خوارزمية تجزئة البيتكوين في كود التجميع لـ IBM 1401 واختبرتها عمليًا عن طريق تشغيلها على نموذج عملي لهذا الكمبيوتر المركزي القديم.


البطاقة التي تم حساب تجزئات SHA-256 بها على حاسب IBM 1401. تظهر نسخة مطبوعة خلف البطاقة ، تظهر إدخال الخوارزمية والتجزئة الناتجة

كما اتضح ، باستخدام هذا الكمبيوتر ، يمكنك التعدين ، ولكن هذه العملية ستستغرق الكثير من الوقت حتى أن عمر الكون بأكمله قد لا يكون كافيًا للتعدين الناجح لكتلة واحدة.

بينما تسمح لك الأجهزة الحديثة بحساب مليارات التجزئة في الثانية ، فإن الكمبيوتر 1401 يقضي 80 ثانية لكل منها لحساب تجزئة واحدة. التقدم المحرز في أداء الكمبيوتر على مدى العقود الماضية واضح ، والذي تم وصفه بوضوح في قانون جوردون مور.

تظهر البطاقات المثقوبة التي شاركت في التجربة ، بالإضافة إلى طباعة SHA-256 مع طابعة خط في الصورة أعلاه (تخدم أول بطاقة مثقبة للجمال فقط - لم يكن من السهل اختراق هذا النمط). لاحظ أن السطر الثاني ينتهي بمجموعة من الأصفار ؛ هذا يعني تجزئة ناجحة.

مبدأ تعدين البيتكوين


في الآونة الأخيرة ، أصبحت العملة الإلكترونية Bitcoin (Bitcoin) ، والتي يمكن لمستخدمي الإنترنت نقلها إلى بعضهم البعض ، شائعة جدًا. لفهم جوهر عمل هذه العملة المشفرة ، يمكن تقديم نظام Bitcoin في شكل مجلة محاسبة ، والتي تخزن السجلات حول مالك العملات الرقمية (bitcoins) وعدد العملات المعدنية التي لديه. يمكن لأعضاء Bitcoin نقل العملات الرقمية إلى بعضهم البعض.

تجدر الإشارة إلى أن نظام Bitcoin لا مركزي: ليس لديه خادم تنظيمي واحد يراقب تقدم المعاملات. بدلاً من ذلك ، يتم إرسال السجلات عبر شبكة موزعة من آلاف أجهزة الكمبيوتر على الإنترنت.

تكمن الصعوبة في أن مثل هذا النظام الموزع يجب أن يضمن بطريقة ما موافقة جميع المستخدمين على السجلات. أي أنه يجب على المستخدمين الواعيين تأكيد صحة المعاملة والموافقة عليها ، على الرغم من الوجود المحتمل للمحتالين والشبكات البطيئة التشغيل. كان الحل لهذه المشكلة هو ما يسمى "التعدين". كل 10 دقائق تقريبًا أثناء عملية التعدين ، يتم تأكيد كتلة من المعاملات الصادرة ، ونتيجة لذلك ، يعتبر مؤكدًا رسميًا.

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

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

من الآثار الجانبية للتعدين إضافة عملات بيتكوين جديدة إلى النظام. في الوقت الحالي ، يتلقى كل شخص يؤكد على الكتلة 25 عملة بيتكوين تم إنشاؤها لهذا الغرض (تبلغ تكلفة هذا العدد من العملات الافتراضية الافتراضية من الناحية النقدية التقليدية حوالي 6 آلاف دولار أمريكي). يشجع هذا التشجيع عمال المناجم على العمل بجد وإنفاق مواردهم على التعدين. بالنظر إلى فرصة تلقي 6 آلاف دولار أمريكي كل 10 دقائق ، يبدو أن التعدين هو "منجم ذهب" حقيقي ، مما يشجع المستخدمين على إنفاق مبالغ كبيرة على الأجهزة للتعدين.


ظهرت الطابعة الخطية و IBM 1401 Mainframe في متحف تاريخ الكمبيوتر. كان هذا الكمبيوتر يشغل برنامجي. تقع وحدة التحكم في أعلى اليسار. إن الألواح المستطيلة الداكنة الموجودة على الكمبيوتر هي "أبواب" الرفوف التي تميل ، مما يتيح الوصول للصيانة.

عملية التعدين معقدة للغاية ، ولكن النتيجة سهلة التحقق منها. يستخدم تعدين البيتكوين التشفير بوظيفة تجزئة تسمى SHA-256 مزدوجة. يأخذ التجزئة جزءًا من البيانات عند الإدخال ويقللها إلى قيمة تجزئة أقل (في هذه الحالة ، 256 بت).

لن تسمح لك خوارزمية التجزئة المشفرة بالحصول على قيمة التجزئة المطلوبة دون الحاجة إلى فرز كتلة البيانات عند الإدخال. ومع ذلك ، بعد العثور على إدخال يعطي القيمة المطلوبة ، يمكن للجميع بسهولة التحقق من التجزئة. لذلك ، يعد تجزئة التشفير طريقة جيدة لتنفيذ عملات بيتكوين "إثبات العمل".

بمزيد من التفصيل ، من أجل رسم كتلة ، تحتاج أولاً إلى جمع المعاملات الجديدة في كتلة. ثم تحتاج إلى تجزئة الكتلة للحصول (بشكل عشوائي عشوائيًا) على قيمة تجزئة الكتلة. إذا بدأت قيمة التجزئة بـ 16 أصفارًا ، فسيتم اعتبار الكتلة مؤكدة بنجاح وإرسالها إلى شبكة Bitcoin. في معظم الأحيان ، لا يكون التجزئة ناجحًا ، لذلك قمت بتغيير الكتلة قليلاً وحاول مرارًا وتكرارًا ، بعد أكثر من مليار عملية حسابية. كل 10 دقائق تقريبًا ، ينجح شخص في تأكيد الكتلة بنجاح وتبدأ العملية مرة أخرى. هذا يذكرنا باليانصيب الذي يشارك فيه عمال المناجم ، ويقومون بمحاولة بعد محاولة ، حتى يصبح شخص ما "فائزًا". من الصعب تصور تعقيد عملية التجزئة: من السهل العثور على حبة رمل في رمال الأرض بأكملها من العثور على قيمة تجزئة صالحة.للبحث عن قيم التجزئة هذه ، يستخدم عمال المناجم مراكز البيانات المجهزة بأجهزة خاصة للتعدين.

عمدت تبسيط العديد من التفسيرات في هذه المقالة. إذا كنت ترغب في معرفة المزيد عن نظام بيتكوين والتعدين، وأنصح لك لدراسة مقالاتي و تجربة صعبة من التعدين bitcoins و الدروس القاسية التعدين بيتكوين .

خوارزمية التجزئة بيتكوين SHA-256


الآن سوف ألقي نظرة على وظيفة التجزئة التي تستخدمها Bitcoin ، والتي تعتمد على وظيفة تجزئة تشفير قياسية تسمى SHA-256. يستخدم نظام Bitcoin "SHA-256 مزدوج". هذا يعني أنه يتم تنفيذ وظيفة SHA-256 مرتين. إن خوارزمية SHA-256 بسيطة للغاية بحيث يمكنك تنفيذها حرفيا باستخدام قلم رصاص وورق فقط ، وتسمح لك الخوارزمية بخلط البيانات بطريقة غير متوقعة. تقبل الخوارزمية 64 كتلة بايت عند الإدخال ، وتعالج البيانات تشفيرًا وتنتج 256 بت (32 بايت) من البيانات المشفرة. تستخدم الخوارزمية جولة واحدة ، تتكرر 64 مرة. يوضح الرسم التوضيحي أدناه جولة واحدة من الخوارزمية ، والتي تأخذ ثماني كتل من 4 بايت ، من A إلى H ، وتؤدي العديد من العمليات وتنتج قيمًا جديدة من A إلى N.


جولة SHA-256 ، كمثال من ويكيبيديا ، بواسطة kockmeyer ، CC BY-SA 3.0

كتل زرقاء داكنة تخلط البتات بطريقة غير خطية ، وهو أمر صعب لتحليل التشفير. (إذا تمكنت من العثور على طريقة رياضية أسرع للحصول على تجزئات ناجحة ، يمكنك التحكم في استخراج البيتكوين). تقوم الخلية "تحديد" Ch بتحديد البتات من F أو G ، استنادًا إلى قيمة المدخلات E. تقوم الخلايا sum "بتجمع" بتات التدوير A (أو E) لتوليد ثلاث نسخ متغيرة دورية ، ثم تقوم بتجميعها معًا في المعامل 2.

تتحقق خلية الأغلبية Ma من البتات في كل موضع من A و B و C ، وتختار 0 أو 1 ، اعتمادًا على القيمة الموجودة في الأغلبية. تقوم الخلايا الحمراء بإجراء إضافات 32 بت ، وتوليد قيم جديدة لـ A و E. يعتمد Wt على الإدخال الذي تمت معالجته قليلاً. (هذا هو المكان الذي يتم فيه إدخال كتلة الإدخال في الخوارزمية.) Input Kt هو ثابت محدد لكل جولة.

وفقًا للرسم التوضيحي أعلاه ، يتم تغيير A و E. فقط في كل جولة ، ويتم تخطي القيم المتبقية دون تغيير. تصبح القيمة القديمة لـ A هي القيمة الجديدة لـ B ، والقيمة القديمة لـ B تصبح القيمة الجديدة لـ C ، وهكذا. على الرغم من أن كل جولة من SHA-256 تغير البيانات قليلاً ، بعد 64 جولة ، يتم خلط بيانات الإدخال تمامًا ، مما يعطي قيمة تجزئة غير متوقعة.

Ibm 1401


قررت تنفيذ هذه الخوارزمية على الحاسوب الرئيسي IBM 1401. ظهر هذا الكمبيوتر في عام 1959 وبحلول منتصف الستينيات أصبح الكمبيوتر الأكثر مبيعًا - في ذلك الوقت تم تشغيل أكثر من 10 آلاف جهاز بنشاط. لم يكن الكمبيوتر 1401 كمبيوتر قويًا للغاية حتى عام 1960. ومع ذلك ، كان في المتناول للشركات المتوسطة الحجم التي لم يكن بإمكانها في السابق امتلاك جهاز كمبيوتر ، نظرًا لأنه يمكن استئجاره مقابل القليل من المال - 2500 دولار شهريًا.

لم يستخدم IBM 1401 رقائق السيليكون. علاوة على ذلك ، في هذا الكمبيوتر لم يكن هناك رقائق على الإطلاق. بنيت ترانزستوراتها على أشباه الموصلات ، بلورات الجرمانيوم ، التي تم استخدامها قبل السيليكون. تم تثبيت الترانزستورات ، إلى جانب المكونات الأخرى ، على ألواح بحجم بطاقات اللعب تسمى بطاقات الرسائل القصيرة. تضمن الكمبيوتر الآلاف من هذه البطاقات ، التي تم تركيبها على شكل رفوف تسمى "أبواب". يحتوي IBM 1401 على عشرين من هذه "الأبواب" التي تم طرحها لصيانة الكمبيوتر. في الرسم التوضيحي أعلاه ، يمكن رؤية باب واحد مفتوح ، مما يوفر الوصول إلى الرقائق والكابلات.


يُظهر الرسم التوضيحي رفًا مفتوحًا (يسمى "الباب") للإطار الرئيسي IBM 1401. تُظهر الصورة بطاقات SMS متصلة بالدائرة. هذا الرف يدفع محركات الشريط

كان مبدأ العمل لمثل هذا الكمبيوتر مختلفًا بشكل كبير عن أجهزة الكمبيوتر الحديثة. لم يستخدم هذا الكمبيوتر 8 بايت ، ولكن الأحرف 6 بت بناءً على الرقم العشري المشفر ثنائيًا (BCD). نظرًا لأن هذا الكمبيوتر كان عبارة عن آلة حسابية لحل المشكلات الاقتصادية ، فقد استخدم الحساب العشري بدلاً من الحساب الثنائي ، وكان لكل حرف في الذاكرة قيمة رقمية من 0 إلى 9. تحتوي ذاكرة الكمبيوتر على النوى المغناطيسية على 4000 حرف. وحدة توسيع الذاكرة بحجم غسالة الصحون زادت من سعة الذاكرة بمقدار 12000 حرف. تم إدخال البيانات إلى الكمبيوتر باستخدام بطاقات مثقبة. يقرأ قارئ البطاقات البيانات والبرامج من البطاقات. تمت طباعة بيانات الإخراج بواسطة طابعة تصريف عالية السرعة أو ثقبها على الخرائط.

متحف تاريخ الكمبيوتر متحف تاريخ الكمبيوترفي ماونتن فيو ، يوجد بها حاسبان رئيسيان يعملان IBM 1401. في أحدهما ، قمت بتشغيل كود التجزئة SHA-256. أتحدث أكثر عن IBM 1401 في مقالي Fractals على IBM 1401
.

تشغيل SHA-256 على IBM 1401


بالتأكيد الكمبيوتر IBM 1401 هو الأسوأ من بين جميع الأجهزة التي يمكن اختيارها لتنفيذ خوارزمية التجزئة SHA-256. للعمل بفعالية ، تتطلب هذه الخوارزمية أجهزة يمكنها إجراء عمليات البت في كلمات 32 بت. لسوء الحظ ، لا يدعم IBM 1401 كلمات 32 بت أو بايت. يعمل هذا الكمبيوتر بأحرف 6 بت ولا يسمح بعمليات البت. علاوة على ذلك ، بدلاً من الحساب الثنائي ، تم استخدام الحساب العشري. لذلك ، ستكون الخوارزمية على الكمبيوتر 1401 بطيئة وغير ملائمة للمستخدم.

انتهى بي الأمر باستخدام حرف واحد لكل بت. تم تخزين قيمة 32 بت على هيئة 32 حرفًا ، إما "0" أو "1". كان على شفرتي أن تقوم بعمليات أحادي المعامل ، والمضاعفات والإضافات حرفًا بحرف ، والتحقق من كل حرف وتحديد ما يجب فعله به. كما قد تتوقع ، استغرق تنفيذ التعليمات البرمجية وقتًا طويلاً.

بعد ذلك ، أقدم رمز التجميع الذي كتبته. بشكل عام ، يتم وصف مبدأ الرمز في التعليقات. في نهاية الكود يوجد جدول ثوابت ضروري لخوارزمية SHA-256 في شكل سداسي عشري. نظرًا لأن الكمبيوتر 1401 لا يدعم التنسيق السداسي العشري ، كان علي كتابة إجراءاتي الخاصة لتحويل التنسيقات السداسية العشرية والثنائية. في هذه المقالة لن أشرح كود المجمع لـ IBM 1401 ، أؤكد فقط أنه مختلف تمامًا عما تستخدمه أجهزة الكمبيوتر الحديثة. لا يستدعي هذا الرمز روتينًا ولا يُرجع نتائج. بسبب عدم وجود سجلات للأغراض العامة ، يتم تنفيذ العمليات في الذاكرة.

ابحث عن الكود تحت المفسد:
نص مخفي
job  bitcoin
     * SHA-256 hash
     * Ken Shirriff  http://righto.com
               ctl  6641

               org  087
     X1        dcw  @000@
               org  092
     X2        dcw  @000@
               org  097
     X3        dcw  @000@
     
               org  333
     start     cs   299
               r
               sw   001
               lca  064, input0
               mcw  064, 264
               w
     * Initialize word marks on storage
               mcw  +s0, x3

     wmloop    sw   0&x3  
               ma   @032@, x3
               c    +h7+32, x3
               bu   wmloop
     
               mcw  +input-127, x3      * Put input into warr[0] to warr[15]
               mcw  +warr, x1
               mcw  @128@, tobinc
               b    tobin
     
     * Compute message schedule array w[0..63]
  
               mcw  @16@, i
     * i is word index 16-63   
     * x1 is start of warr[i-16], i.e. bit 0 (bit 0 on left, bit 31 on right)   
               mcw  +warr, x1
     wloop     c    @64@, i
               be   wloopd
     
     * Compute s0
               mcw  +s0, x2
               za   +0, 31&x2               * Zero s0
     * Add w[i-15] rightrotate 7
               sw   7&x2               * Wordmark at bit 7 (from left) of s0
               a    56&x1, 31&x2       * Right shifted: 32+31-7 = bit 24 of w[i-15], 31 = end of s0
               a    63&x1, 6&x2        * Wrapped: 32+31 = end of w[i-15], 7-1 = bit 6 of s0   
               cw   7&x2               * Clear wordmark
     * Add w[i-15] rightrotate 18
               sw   18&x2              * Wordmark at bit 18 (from left) of s0
               a    45&x1, 31&x2       * Right shifted: 32+31-18 = bit 13 of w[i-15], 31 = end of s0
               a    63&x1, 17&x2       * Wrapped: 32+31 = end of w[i-15], 18-1 = bit 17 of s0   
               cw   18&x2              * Clear wordmark
     * Add w[i-15] rightshift 3
               sw   3&x2               * Wordmark at bit 3 (from left) of s0
               a    60&x1, 31&x2       * Right shifted: 32+31-3 = bit 28 of w[i-15], 31 = end of s0
               cw   3&x2               * Clear wordmark
     * Convert sum to xor
               mcw  x1, x1tmp
               mcw  +s0+31, x1         * x1 = right end of s0
               mcw  @032@, x2          * Process 32 bits
               b    xor
               sw   s0                 * Restore wordmark cleared by xor
     
               mcw  x1tmp, x1
     
     * Compute s1         
               mcw  +s1, x2
               za   +0, 31&x2               * Zero s1
     * Add w[i-2] rightrotate 17
               sw   17&x2              * Wordmark at bit 17 (from left) of s1
               a    462&x1, 31&x2      * Right shifted: 14*32+31-17 = bit 14 of w[i-2], 31 = end of s1
               a    479&x1, 16&x2      * Wrapped: 14*32+31 = end of w[i-2], 17-1 = bit 16 of s1   
               cw   17&x2              * Clear wordmark
     * Add w[i-2] rightrotate 19
               sw   19&x2              * Wordmark at bit 19 (from left) of s1
               a    460&x1, 31&x2      * Right shifted: 14*32+31-19 = bit 12 of w[i-2], 31 = end of s1
               a    479&x1, 18&x2      * Wrapped: 14*32+31 = end of w[i-2], 19-1 = bit 18 of s1  
               cw   19&x2              * Clear wordmark
     * Add w[i-2] rightshift 10
               sw   10&x2              * Wordmark at bit 10 (from left) of s1
               a    469&x1, 31&x2      * Right shifted: 14*32+31-10 = bit 21 of w[i-2], 31 = end of s1
               cw   10&x2              * Clear wordmark
     * Convert sum to xor
               mcw  +s1+31, x1         * x1 = right end of s1
               mcw  @032@, x2          * Process 32 bits
               b    xor
               sw   s1                 * Restore wordmark cleared by xor
     
     * Compute w[i] := w[i-16] + s0 + w[i-7] + s1
               mcw  x1tmp, x1
               a    s1+31, s0+31       * Add s1 to s0
               a    31&x1, s0+31       * Add w[i-16] to s0
               a    319&x1, s0+31      * Add 9*32+31 = w[i-7] to s0
     * Convert bit sum to 32-bit sum
               mcw  +s0+31, x1         * x1 = right end of s0
               mcw  @032@, x2          * Process 32 bits
               b    sum
               sw   s0                 * Restore wordmark cleared by sum
     

     
               mcw  x1tmp, x1
               mcw  s0+31, 543&x1      * Move s0 to w[i]
       
              
               ma   @032@, x1
               a    +1, i
               mz   @0@, i
               b    wloop
     
     x1tmp     dcw  #5
     

     * Initialize: Copy hex h0init-h7init into binary h0-h7
     wloopd    mcw  +h0init-7, x3
               mcw  +h0, x1
               mcw  @064@, tobinc       * 8*8 hex digits
               b    tobin
     
     
     * Initialize a-h from h0-h7
               mcw  @000@, x1
     ilp       mcw  h0+31&x1, a+31&x1
               ma   @032@, x1
               c    x1, @256@
               bu   ilp
     
               mcw  @000@, bitidx      * bitidx = i*32 = bit index
               mcw  @000@, kidx        * kidx = i*8 = key index
                

     * Compute s1 from e        
     mainlp    mcw  +e, x1
               mcw  +s1, x2
               za   +0, 31&x2               * Zero s1
     * Add e rightrotate 6
               sw   6&x2               * Wordmark at bit 6 (from left) of s1
               a    25&x1, 31&x2       * Right shifted: 31-6 = bit 25 of e, 31 = end of s1
               a    31&x1, 5&x2        * Wrapped: 31 = end of e, 6-1 = bit 5 of s1   
               cw   6&x2               * Clear wordmark
     * Add e rightrotate 11
               sw   11&x2              * Wordmark at bit 11 (from left) of s1
               a    20&x1, 31&x2       * Right shifted: 31-11 = bit 20 of e, 31 = end of s1
               a    31&x1, 10&x2       * Wrapped: 31 = end of e, 11-1 = bit 10 of s1   
               cw   11&x2              * Clear wordmark
     * Add e rightrotate 25
               sw   25&x2              * Wordmark at bit 25 (from left) of s1
               a    6&x1, 31&x2        * Right shifted: 31-25 = bit 6 of e, 31 = end of s1
               a    31&x1, 24&x2       * Wrapped: 31 = end of e, 25-1 = bit 24 of s1   
               cw   25&x2              * Clear wordmark
     * Convert sum to xor
               mcw  +s1+31, x1         * x1 = right end of s1
               mcw  @032@, x2          * Process 32 bits
               b    xor
               sw   s1                 * Restore wordmark cleared by xor

     * Compute ch: choose function
               mcw  @000@, x1          * x1 is index from 0 to 31
     chl       c    e&x1, @0@
               be   chzero
               mn   f&x1, ch&x1        * for 1, select f bit
               b    chincr
     chzero    mn   g&x1, ch&x1        * for 0, select g bit
     chincr    a    +1, x1
               mz   @0@, x1
               c    @032@, x1
               bu   chl

     * Compute temp1: k[i] + h + S1 + ch + w[i]
               cs   299
               mcw  +k-7, x3            * Convert k[i] to binary in temp1
               ma   kidx, x3
               mcw  +temp1, x1
               mcw  @008@, tobinc       * 8 hex digits
               b    tobin
               mcw  @237@, x3
               mcw  +temp1, x1
               mcw  @008@, tobinc
               b    tohex
               a    h+31, temp1+31     * +h
               a    s1+31, temp1+31    * +s1
               a    ch+31, temp1+31    * +ch
               mcw  bitidx, x1
               a    warr+31&x1, temp1+31         * + w[i]
     * Convert bit sum to 32-bit sum
               mcw  +temp1+31, x1      * x1 = right end of temp1
               b    sum
  

     * Compute s0 from a
               mcw  +a, x1
               mcw  +s0, x2
               za   +0, 31&x2               * Zero s0
     * Add a rightrotate 2
               sw   2&x2               * Wordmark at bit 2 (from left) of s0
               a    29&x1, 31&x2       * Right shifted: 31-2 = bit 29 of a, 31 = end of s0
               a    31&x1, 1&x2        * Wrapped: 31 = end of a, 2-1 = bit 1 of s0   
               cw   2&x2               * Clear wordmark
     * Add a rightrotate 13
               sw   13&x2              * Wordmark at bit 13 (from left) of s0
               a    18&x1, 31&x2       * Right shifted: 31-13 = bit 18 of a, 31 = end of s0
               a    31&x1, 12&x2       * Wrapped: 31 = end of a, 13-1 = bit 12 of s0   
               cw   13&x2              * Clear wordmark
     * Add a rightrotate 22
               sw   22&x2              * Wordmark at bit 22 (from left) of s0
               a    9&x1, 31&x2        * Right shifted: 31-22 = bit 9 of a, 31 = end of s0
               a    31&x1, 21&x2       * Wrapped: 31 = end of a, 22-1 = bit 21 of s0   
               cw   22&x2              * Clear wordmark
     * Convert sum to xor
               mcw  +s0+31, x1         * x1 = right end of s0
               mcw  @032@, x2          * Process 32 bits
               b    xor
               sw   s0                 * Restore wordmark cleared by xor

     * Compute maj(a, b, c): majority function
               za   +0, maj+31
               a    a+31, maj+31
               a    b+31, maj+31
               a    c+31, maj+31
               mz   @0@, maj+31
               mcw  @000@, x1          * x1 is index from 0 to 31
     mjl       c    maj&x1, @2@
               bh   mjzero
               mn   @1@, maj&x1       * majority of the 3 bits is 1
               b    mjincr
     mjzero    mn   @0@, maj&x1       * majority of the 3 bits is 0
     mjincr    a    +1, x1
               mz   @0@, x1
               c    @032@, x1
               bu   mjl

     * Compute temp2: S0 + maj
               za   +0, temp2+31
               a    s0+31, temp2+31
               a    maj+31, temp2+31
     * Convert bit sum to 32-bit sum
               mcw  +temp2+31, x1      * x1 = right end of temp1
               b    sum
     
               mcw  g+31, h+31         * h := g
               mcw  f+31, g+31         * g := f
               mcw  e+31, f+31         * f := e
               za   +0, e+31           * e := d + temp1
               a    d+31, e+31
               a    temp1+31, e+31
               mcw  +e+31, x1          * Convert sum to 32-bit sum
               b    sum
               mcw  c+31, d+31         * d := c
               mcw  b+31, c+31         * c := b
               mcw  a+31, b+31         * b := a
               za   +0, a+31           * a := temp1 + temp2
               a    temp1+31, a+31
               a    temp2+31, a+31
               mcw  +a+31, x1          * Convert sum to 32-bit sum
               b    sum

               a    @8@, kidx          * Increment kidx by 8 chars
               mz   @0@, kidx
               ma   @032@, bitidx      * Increment bitidx by 32 bits
               c    @!48@, bitidx      * Compare to 2048
               bu   mainlp

     * Add a-h to h0-h7
               cs   299
               mcw  @00000@, x1tmp  
     add1      mcw  x1tmp, x1
               a    a+31&x1, h0+31&x1
               ma   +h0+31, x1          * Convert sum to 32-bit sum
               b    sum     
               ma   @032@, x1tmp
               c    @00256@, x1tmp
               bu   add1
               mcw  @201@, x3
               mcw  +h0, x1
               mcw  @064@, tobinc
               b    tohex
               w
               mcw  280, 180
               p
               p

     finis     h
               b    finis

      
     * Converts sum of bits to xor
     * X1 is right end of word
     * X2 is bit count    
     * Note: clears word marks
     xor       sbr  xorx&3
     xorl      c    @000@, x2
               be   xorx
     xorfix    mz   @0@, 0&x1          * Clear zone
               c    0&x1, @2@
               bh   xorok
               sw   0&x1               * Subtract 2 and loop
               s    +2, 0&x1
               cw   0&x1
               b    xorfix
     xorok     ma   @I9I@, x1         * x1 -= 1
               s    +1, x2             * x2 -= 1
               mz   @0@, x2
               b    xorl               * loop
     
     xorx      b    @000@
     
     * Converts sum of bits to sum (i.e. propagate carries if digit > 1)
     * X1 is right end of word
     * Ends at word mark
     sum       sbr  sumx&3
     suml      mz   @0@, 0&x1          * Clear zone
               c    0&x1, @2@          * If digit is <2, then ok
               bh   sumok
               s    +2, 0&x1           * Subtract 2 from digit
               bwz  suml, 0&x1, 1      * Skip carry if at wordmark
               a    @1@, 15999&x1      * Add 1 to previous position
               b    suml               * Loop
     sumok     bwz  sumx,0&x1,1        * Quit if at wordmark
               ma   @I9I@, x1          * x1 -= 1
               b    suml               * loop
     sumx      b    @000@              * return
     
     * Converts binary to string of hex digits
     * X1 points to start (left) of binary
     * X3 points to start (left) of hex buffer
     * X1, X2, X3 destroyed
     * tobinc holds count (# of hex digits)
     tohex     sbr  tohexx&3
     tohexl    c    @000@, tobinc      * check counter
               be   tohexx
               s    @1@, tobinc        * decrement counter
               mz   @0@, tobinc
               b    tohex4
               mcw  hexchr, 0&x3
               ma   @004@, X1
               ma   @001@, X3
               b    tohexl             * loop
     tohexx    b    @000@ 
     

     
     * X1 points to 4 bits
     * Convert to hex char and write into hexchr
     * X2 destroyed

     tohex4    sbr  tohx4x&3
               mcw  @000@, x2
               c    3&X1, @1@
               bu   tohx1
               a    +1, x2
     tohx1     c    2&X1, @1@
               bu   tohx2
               a    +2, x2
     tohx2     c    1&x1, @1@
               bu   tohx4
               a    +4, x2
     tohx4     c    0&x1, @1@
               bu   tohx8
               a    +8, x2
     tohx8     mz   @0@, x2
               mcw  hextab-15&x2, hexchr
     tohx4x    b    @000@
     
     * Converts string of hex digits to binary
     * X3 points to start (left) of hex digits
     * X1 points to start (left) of binary digits
     * tobinc holds count (# of hex digits)
     * X1, X3 destroyed
     tobin     sbr  tobinx&3
     tobinl    c    @000@, tobinc      * check counter
               be   tobinx
               s    @1@, tobinc        * decrement counter
               mz   @0@, tobinc
               mcw  0&X3, hexchr
               b    tobin4             * convert 1 char
               ma   @004@, X1
               ma   @001@, X3
               b    tobinl             * loop
     tobinx    b    @000@
               
     
     tobinc    dcw  @000@
     * Convert hex digit to binary
     * Digit in hexchr (destroyed)
     * Bits written to x1, ..., x1+3
     tobin4    sbr  tobn4x&3
               mcw  @0000@, 3+x1   * Start with zero bits
               bwz  norm,hexchr,2  * Branch if no zone
              
               mcw  @1@, 0&X1
               a    @1@, hexchr    * Convert letter to value: A (1) -> 2, F (6) -> 7
               mz   @0@, hexchr
               b    tob4
     norm      c    @8@, hexchr
               bl   tob4
               mcw  @1@, 0&X1
               s    @8@, hexchr
               mz   @0@, hexchr
     tob4      c    @4@, hexchr
               bl   tob2
               mcw  @1@, 1&X1
               s    @4@, hexchr
               mz   @0@, hexchr
     tob2      c    @2@, hexchr
               bl   tob1
               mcw  @1@, 2&X1
               s    @2@, hexchr
               mz   @0@, hexchr
     tob1      c    @1@, hexchr
               bl   tobn4x
               mcw  @1@, 3&X1
     tobn4x    b    @000@          


     
     * Message schedule array is 64 entries of 32 bits = 2048 bits.
               org  3000
     warr      equ  3000
     
     s0        equ  warr+2047                *32 bits
     s1        equ  s0+32 
     ch        equ  s1+32              *32 bits

     temp1     equ  ch+32               *32 bits
     
     temp2     equ  temp1+32                *32 bits
     
     maj       equ  temp2+32                *32 bits
     
     a         equ  maj+32
     b         equ  a+32
     c         equ  b+32
     d         equ  c+32
     e         equ  d+32
     f         equ  e+32
     g         equ  f+32
     h         equ  g+32
     h0        equ  h+32
     h1        equ  h0+32
     h2        equ  h1+32
     h3        equ  h2+32
     h4        equ  h3+32
     h5        equ  h4+32
     h6        equ  h5+32
     h7        equ  h6+32
               org  h7+32
 
     hexchr    dcw  @0@
     hextab    dcw  @0123456789abcdef@    
     i         dcw  @00@               * Loop counter for w computation
     bitidx    dcw  #3
     kidx      dcw  #3         
     
     * 64 round constants for SHA-256
     k         dcw  @428a2f98@
               dcw  @71374491@
               dcw  @b5c0fbcf@
               dcw  @e9b5dba5@
               dcw  @3956c25b@
               dcw  @59f111f1@
               dcw  @923f82a4@
               dcw  @ab1c5ed5@
               dcw  @d807aa98@
               dcw  @12835b01@
               dcw  @243185be@
               dcw  @550c7dc3@
               dcw  @72be5d74@
               dcw  @80deb1fe@
               dcw  @9bdc06a7@
               dcw  @c19bf174@
               dcw  @e49b69c1@
               dcw  @efbe4786@
               dcw  @0fc19dc6@
               dcw  @240ca1cc@
               dcw  @2de92c6f@
               dcw  @4a7484aa@
               dcw  @5cb0a9dc@
               dcw  @76f988da@
               dcw  @983e5152@
               dcw  @a831c66d@
               dcw  @b00327c8@
               dcw  @bf597fc7@
               dcw  @c6e00bf3@
               dcw  @d5a79147@
               dcw  @06ca6351@
               dcw  @14292967@
               dcw  @27b70a85@
               dcw  @2e1b2138@
               dcw  @4d2c6dfc@
               dcw  @53380d13@
               dcw  @650a7354@
               dcw  @766a0abb@
               dcw  @81c2c92e@
               dcw  @92722c85@
               dcw  @a2bfe8a1@
               dcw  @a81a664b@
               dcw  @c24b8b70@
               dcw  @c76c51a3@
               dcw  @d192e819@
               dcw  @d6990624@
               dcw  @f40e3585@
               dcw  @106aa070@
               dcw  @19a4c116@
               dcw  @1e376c08@
               dcw  @2748774c@
               dcw  @34b0bcb5@
               dcw  @391c0cb3@
               dcw  @4ed8aa4a@
               dcw  @5b9cca4f@
               dcw  @682e6ff3@
               dcw  @748f82ee@
               dcw  @78a5636f@
               dcw  @84c87814@
               dcw  @8cc70208@
               dcw  @90befffa@
               dcw  @a4506ceb@
               dcw  @bef9a3f7@
               dcw  @c67178f2@
     * 8 initial hash values for SHA-256
     h0init    dcw  @6a09e667@
     h1init    dcw  @bb67ae85@
     h2init    dcw  @3c6ef372@
     h3init    dcw  @a54ff53a@
     h4init    dcw  @510e527f@
     h5init    dcw  @9b05688c@
     h6init    dcw  @1f83d9ab@
     h7init    dcw  @5be0cd19@


     input0    equ  h7init+64
               org  h7init+65

               dc   @80000000000000000000000000000000@
     input     dc   @00000000000000000000000000000100@      * 512 bits with the mostly-zero padding

               end  start

تم تطبيق البرنامج القابل للتنفيذ على 85 بطاقة مثقبة (لقد رأيتها بالفعل في بداية المقالة). لقد صنعت أيضًا بطاقة لكمة باستخدام خوارزمية التجزئة. من أجل تشغيل البرنامج ، اضطررت إلى تحميل البطاقة المثقبة في قارئ البطاقات والنقر على زر "تحميل". عالج قارئ البطاقات 800 بطاقة في الدقيقة. وبالتالي ، لم يستغرق تنزيل البرنامج سوى بضع ثوانٍ. أثناء تنفيذ البرنامج ، تومض وحدة تحكم الكمبيوتر بشكل محموم لمدة 40 ثانية. أخيرًا ، قامت الطابعة بطباعة التجزئة الأخيرة (لقد شاهدت أيضًا النسخة المطبوعة في بداية المقالة) ، وتم تطبيق النتائج على بطاقة مثقبة جديدة. نظرًا لأن تعدين Bitcoin يستخدم SHA-256 تجزئة مزدوجة ، فقد استغرقت عملية تجزئة التعدين ضعف المدة (80 ثانية).


العمل الشاق لوحدة التحكم IBM 1401 أثناء حساب تجزئة SHA-256

مقارنة الأداء


يمكن للكمبيوتر IBM 1401 حساب التجزئة المزدوجة SHA-256 في 80 ثانية. لإكمال هذه المهمة ، يستهلك الكمبيوتر حوالي 3000 واط من الطاقة ، تقريبًا مثل موقد كهربائي أو مجفف ملابس. في وقت واحد ، كلف نظام IBM 1401 الأساسي 125600 دولار. في واقع عام 2015 ، يبلغ هذا حوالي مليون دولار أمريكي. في الوقت نفسه ، يمكنك الآن شراء محرك أقراص USB محمول للتعدين مقابل 50 دولارًا ، والذي يحتوي على دائرة متكاملة متخصصة (ASIC USB miner). ينفذ عامل تعدين USB هذا 3.6 مليار تجزئة في الثانية ، بينما يستهلك حوالي 4 واط.
ترجع مؤشرات الأداء المهمة هذه إلى عدة عوامل: زيادة حادة في أداء الكمبيوتر على مدار الخمسين عامًا الماضية وفقًا لقانون مور ، وفقدان الأداء المرتبط باستخدام الحساب العشري في أجهزة الكمبيوتر لحل المشاكل التجارية ، والتي كانت مشغولة باحتساب رمز تجزئة ثنائي ، فضلاً عن زيادة السرعة مع جوانب أجهزة تعدين البيتكوين التقليدية.

كي تختصر. لاستخراج الكتلة ، مع الأخذ في الاعتبار المتطلبات الحالية لهذه العملية ، سيحتاج جهاز الكمبيوتر IBM 1401 إلى حوالي 5x10 ^ 14 عامًا (وهو 40.000 مرة من عمر الكون الحالي). ستكون تكلفة الكهرباء المستهلكة حوالي 10 ^ 18 دولارًا أمريكيًا. ونتيجة لذلك ، ستحصل على 25 بيتكوين ، والتي ستبلغ قيمتها النقدية حوالي 6000 دولار أمريكي. لذلك ، لا يمكن تسمية تعدين البيتكوين على حاسب IBM 1401 الرئيسي بأنه عمل مربح. تقارن الصور أدناه رقائق الكمبيوتر في الستينيات من القرن الماضي والخيارات الحديثة ، مما يدل بوضوح على التقدم التكنولوجي.


: SMS , IBM 1401. . . : Bitfury ASIC 2-3 . : zeptobars (CC BY 3.0)


قد تقرر أن عملات البيتكوين غير متوافقة مع تقنية الستينيات من القرن الماضي بسبب عدم القدرة على نقل البيانات عبر الشبكة. هل سيحتاج شخص ما إلى إرسال بطاقات مثقبة بسلسلة كتلة لأجهزة الكمبيوتر الأخرى؟ ظهر اتصال بين أجهزة الكمبيوتر من خلال الشبكة منذ وقت طويل. في وقت مبكر من عام 1941 ، دعمت شركة IBM ما يسمى بعملية معالجة البيانات عن بُعد (عن بُعد). في الستينيات ، يمكن توصيل IBM 1401 بجهاز نقل بيانات IBM 1009 (وحدة نقل بيانات IBM 1009) - مودم بحجم غسالة الصحون ، والذي سمح لأجهزة الكمبيوتر بتبادل البيانات مع بعضها البعض عبر خط هاتفي بسرعة تصل إلى 300 حرف في الثانية. وهذا يعني ، نظريًا ، أن بناء شبكة Bitcoin استنادًا إلى تقنيات الستينيات من القرن الماضي أمر ممكن تمامًا. لسوء الحظ ، لم أتمكن من الحصول على معدات لبيانات المعالجة عن بعد واختبار هذه النظرية.


جهاز نقل البيانات IBM 1009. ظهر مودم بحجم غسالة الصحون في عام 1960. مع ذلك ، كان من الممكن إرسال ما يصل إلى 300 حرف في الثانية عبر خط هاتف. مصدر الصورة: مقدمة لأنظمة معالجة بيانات IBM) .

الموجودات


أصبح استخدام SHA-256 في لغة التجميع للحاسوب المركزي القديم تجربة صعبة ولكنها مثيرة للاهتمام. كنت أتوقع أداء أفضل (حتى مقارنة بمجموعة ماندلبروت في 12 دقيقة ). الحساب العشري للكمبيوتر التجاري ليس الخيار الأفضل لخوارزمية ثنائية مثل SHA-256. ومع ذلك ، يمكن تنفيذ خوارزمية تعدين البيتكوين حتى على جهاز كمبيوتر بدون دوائر متكاملة. لذلك ، إذا أخذني فجأة انهيار مؤقت معين إلى عام 1960 ، يمكنني بناء شبكة بيتكوين.

يعرض متحف ماونتن فيو لتاريخ الكمبيوتر أيام الأربعاء والسبت جهاز IBM 1401 الجاري تشغيله. إذا كنت قريبًا ، يجب عليك بالتأكيد إلقاء نظرة على هذا عن طريق التحقق من الجدول الزمنيعمل. وإذا أخبرت موظفي المتحف الذين يقومون بعرض تشغيل IBM 1401 عني ، فقد يقومون حتى بإطلاق برنامج Pi الخاص بي .

أود أن أشكر متحف تاريخ الكمبيوتر وأعضاء فريق استعادة الكمبيوتر لعام 1401: روبرت غارنر ، وإد تيلين ، وفان سنايدر ، وخاصة ستان بادوك. يحتوي موقع فريق ibm-1401.info على الكثير من المعلومات المثيرة للاهتمام حول الكمبيوتر 1401 وكيفية استعادته.

تفسير


من الجدير بالذكر أنني لم أحطم الكتلة الحقيقية على IBM 1401 - لن يحبها متحف تاريخ الكمبيوتر. كما قلت ، مع وجود IBM 1401 عاملاً ، فلن تكون قادرًا على كسب المال من التعدين. ومع ذلك ، تمكنت من تنفيذ وتنفيذ خوارزمية SHA-256 على جهاز IBM 1401 ، مما يثبت أن التعدين ممكن نظريًا. وسأكشف سر العثور على تجزئة صالحة - لقد استخدمت للتو الكتلة الملغومة بالفعل .

نأمل أن تكون قد استمتعت بترجمتنا

Source: https://habr.com/ru/post/ar380635/


All Articles