55 वर्षीय बुजुर्ग आईबीएम 1401 पर खनन बिटकॉइन

उपयोगकर्ता के प्रकाशन से प्रेरित है mark_ablov" कागज और कलम के साथ बिटकॉइन खनन करके, " हमने तय किया कि हाइकटाइम पाठकों को दिलचस्पी होगी कि अन्य पागल विचारों के लेखक मूल पोस्ट के लेखक केन शिरिफ को क्या एहसास हुआ।

क्या पिछली सदी के 60 के दशक से आईबीएम मेनफ्रेम का उपयोग खनन बिटकॉइन के लिए किया जा सकता है ? मैं इस प्रतीत होता है पागल विचार की जाँच करने का फैसला किया। मैंने बिटकॉइन हैश एल्गोरिथ्म को आईबीएम 1401 के लिए कोडांतरक कोड में इंजेक्ट किया और इसे इस प्राचीन मेनफ्रेम के व्यावहारिक मॉडल पर चलाकर अभ्यास में परीक्षण किया।


छिद्रित कार्ड को IBM 1401 मेनफ्रेम पर SHA-256 हैश की गणना करने के लिए उपयोग किया जाता है। छिद्रित कार्ड के पीछे एक प्रिंटआउट दिखाई देता है जो एल्गोरिथ्म के इनपुट और परिणामी हैश दिखाता है।

जैसा कि यह निकला, इस कंप्यूटर का उपयोग आप कर सकते हैं, लेकिन इस प्रक्रिया में इतना समय लगेगा कि ब्रह्मांड के पूरे जीवनकाल में एक ब्लॉक के सफल खनन के लिए पर्याप्त नहीं हो सकता है।

जबकि आधुनिक हार्डवेयर आपको प्रति सेकंड अरबों हैश की गणना करने की अनुमति देता है, वहीं कंप्यूटर 1401 प्रत्येक एक हैश की गणना करने के लिए 80 सेकंड खर्च करता है। पिछले दशकों में कंप्यूटर के प्रदर्शन में प्रगति स्पष्ट है, जिसे गॉर्डन मूर के कानून द्वारा स्पष्ट रूप से वर्णित किया गया है।

पंच कार्ड जो प्रयोग में शामिल थे, साथ ही साथ एक प्रिंटर के साथ SHA-256 प्रिंटआउट को ऊपर की तस्वीर में दिखाया गया है (पहला पंच कार्ड केवल सुंदरता के लिए कार्य करता है - इस पैटर्न के माध्यम से तोड़ना आसान नहीं था)। ध्यान दें कि दूसरी पंक्ति शून्य के समूह के साथ समाप्त होती है; इसका मतलब एक सफल हैश है।

बिटकॉइन माइनिंग सिद्धांत


हाल ही में, इलेक्ट्रॉनिक मुद्रा बिटकॉइन (बिटकॉइन), जिसे इंटरनेट उपयोगकर्ता एक-दूसरे को हस्तांतरित कर सकते हैं, बहुत लोकप्रिय रहा है। इस क्रिप्टोकरेंसी के काम के सार को समझने के लिए, बिटकॉइन प्रणाली को एक प्रकार की लेखांकन पत्रिका के रूप में प्रस्तुत किया जा सकता है, जो डिजिटल सिक्कों (बिटकॉइन) के मालिक और उसके पास मौजूद सिक्कों की संख्या के बारे में रिकॉर्ड संग्रहीत करता है। बिटकॉइन के सदस्य डिजिटल सिक्कों को एक दूसरे को हस्तांतरित कर सकते हैं।

यह ध्यान दिया जाना चाहिए कि बिटकॉइन प्रणाली विकेंद्रीकृत है: इसमें एक भी नियामक सर्वर नहीं है जो लेनदेन की प्रगति की निगरानी करेगा। इसके बजाय, इंटरनेट पर हजारों कंप्यूटरों से वितरित नेटवर्क पर रिकॉर्ड भेजे जाते हैं।

कठिनाई यह है कि इस तरह की वितरित प्रणाली को किसी भी तरह सुनिश्चित करना चाहिए कि सभी उपयोगकर्ता रिकॉर्ड पर सहमत हों। धोखेबाजों और धीमी गति से चलने वाले नेटवर्क की संभावित उपस्थिति के बावजूद, कर्तव्यनिष्ठ उपयोगकर्ताओं को लेनदेन की वैधता की पुष्टि करनी चाहिए। इस समस्या का समाधान तथाकथित "खनन" था। खनन प्रक्रिया के दौरान लगभग हर 10 मिनट में, निवर्तमान लेनदेन के एक ब्लॉक की पुष्टि की जाती है, परिणामस्वरूप, आधिकारिक तौर पर इसकी पुष्टि की जाती है।

विश्वसनीय क्रिप्टोग्राफी पर आधारित खनन प्रक्रिया बेहद जटिल है, इसलिए कोई भी नियंत्रित नहीं कर सकता है कि कौन से लेनदेन खनन हैं। विशेष रूप से, बिटकॉइन प्रणाली का मुख्य विचार यह है कि कार्य का परिणाम कठिन और कठिन है, लेकिन सत्यापित करना आसान है। यह तथाकथित "प्रूफ-ऑफ-वर्क" तकनीक है।

ब्लॉक खनन की प्रक्रिया में कम्प्यूटेशनल लागत की एक बड़ी राशि की आवश्यकता होती है। हालांकि, ब्लॉक की पुष्टि होने के बाद, सहकर्मी से सहकर्मी उपयोगकर्ता इसकी वैधता को आसानी से सत्यापित कर सकते हैं। खनन की जटिलता बिटकॉइन के फर्जी उपयोग को रोकती है, और ब्लॉक की वैधता की जांच में आसानी उपयोगकर्ताओं को लेनदेन की वैधता में विश्वास करने की अनुमति देती है।

खनन का एक साइड इफेक्ट सिस्टम के नए बिटकॉइन को जोड़ना है। वर्तमान में, हर कोई जो ब्लॉक की पुष्टि करता है उसे इसके लिए 25 उत्पन्न बिटकॉइन मिलते हैं (अब पारंपरिक मौद्रिक शब्दों में आभासी सिक्कों की इस संख्या की कीमत लगभग 6 हजार अमेरिकी डॉलर है)। यह प्रोत्साहन खनिकों को कड़ी मेहनत करने और खनन पर अपने संसाधनों को खर्च करने के लिए प्रोत्साहित करता है। हर 10 मिनट में 6 हजार अमेरिकी डॉलर प्राप्त करने के अवसर को देखते हुए, खनन एक वास्तविक "सोने की खान" प्रतीत होता है, जो उपयोगकर्ताओं को खनन के लिए हार्डवेयर पर महत्वपूर्ण मात्रा में खर्च करने के लिए प्रोत्साहित करता है।


लाइन प्रिंटर और आईबीएम 1401 मेनफ्रेम कंप्यूटर इतिहास संग्रहालय में चित्रित किया गया। यह कंप्यूटर मेरा प्रोग्राम चला रहा था। कंसोल शीर्ष बाईं ओर स्थित है। कंप्यूटर पर अंधेरे आयताकार पैनल रैक के "दरवाजे" हैं जो रखरखाव के लिए पहुंच प्रदान करते हुए, पुनरावृत्ति करते हैं।

खनन प्रक्रिया बेहद जटिल है, लेकिन परिणाम को सत्यापित करना बहुत आसान है। बिटकॉइन माइनिंग क्रिप्टोग्राफी का उपयोग करता है जिसमें डबल SHA-256 नामक हैश फ़ंक्शन होता है। हैश इनपुट पर डेटा का एक हिस्सा लेता है और इसे कम हैश मान (इस मामले में, 256 बिट) में घटाता है।

क्रिप्टोग्राफिक हैशिंग एल्गोरिथ्म आपको इनपुट पर डेटा के द्रव्यमान के माध्यम से सॉर्ट किए बिना वांछित हैश मान प्राप्त करने की अनुमति नहीं देगा। हालांकि, वांछित मान देने वाले इनपुट को खोजने के बाद, हर कोई आसानी से हैश की जांच कर सकता है। इसलिए, क्रिप्टोग्राफिक हैशिंग "प्रूफ-ऑफ-वर्क" बिटकॉइन को लागू करने का एक अच्छा तरीका है।

अधिक विवरण में, किसी ब्लॉक को मुस्कुराने के लिए, पहले आपको एक ब्लॉक में नए लेनदेन एकत्र करने की आवश्यकता है। फिर आपको ब्लॉक का हैश मान प्राप्त करने के लिए ब्लॉक को अनिवार्य रूप से हैश करने की आवश्यकता है। यदि हैश मान 16 शून्य से शुरू होता है, तो ब्लॉक को सफलतापूर्वक पुष्टि किया जाता है और बिटकॉइन नेटवर्क पर भेजा जाता है। अधिकांश समय हैश सफल नहीं होता है, इसलिए आप एक अरब से अधिक कम्प्यूटेशनल ऑपरेशन के बाद, ब्लॉक को थोड़ा बदल देते हैं और बार-बार कोशिश करते हैं। लगभग 10 मिनट में, कोई व्यक्ति सफलतापूर्वक ब्लॉक की पुष्टि करने में सफल होता है और प्रक्रिया फिर से शुरू होती है। यह एक लॉटरी की याद दिलाता है जिसमें खनिक भाग लेते हैं, एक प्रयास के बाद प्रयास करते हैं, जब तक कि कोई "विजेता" नहीं बन जाता। हैशिंग प्रक्रिया की जटिलता को कल्पना करना मुश्किल है: पृथ्वी के पूरे रेत में रेत का एक अनाज ढूंढना आसान है, एक वैध हैश मूल्य खोजने की तुलना में।ऐसे हैश मूल्यों की खोज करने के लिए, खनिक खनन के लिए विशेष हार्डवेयर से लैस डेटा केंद्रों का उपयोग करते हैं।

मैं इस लेख में कई स्पष्टीकरणों को जानबूझकर सरल करता हूं। यदि आप बिटकॉइन प्रणाली और खनन के बारे में अधिक जानना चाहते हैं, तो मैं आपको मेरे लेखों का अध्ययन करने की सलाह देता हूं बिटकॉइन खनन का कठिन अनुभव और बिटकॉइन खनन के कठोर सबक

बिटकॉइन SHA-256 हैश एल्गोरिथम


अब मैं बिटकॉइन द्वारा उपयोग किए जाने वाले हैश फ़ंक्शन को देखूंगा, जो SHA-256 नामक एक मानक क्रिप्टोग्राफ़िक हैश फ़ंक्शन पर आधारित है। बिटकॉइन सिस्टम "डबल SHA-256" का उपयोग करता है। इसका मतलब है कि SHA-256 फ़ंक्शन को दो बार निष्पादित किया जाता है। SHA-256 एल्गोरिथ्म इतना सरल है कि आप इसे केवल एक पेंसिल और कागज का उपयोग करके सचमुच निष्पादित कर सकते हैं , और एल्गोरिथ्म आपको अप्रत्याशित तरीके से डेटा मिश्रण करने की अनुमति देता है। एल्गोरिथ्म इनपुट पर 64 बाइट ब्लॉक को स्वीकार करता है, डेटा को क्रिप्टोग्राफिक रूप से प्रोसेस करता है और एन्क्रिप्टेड डेटा के 256 बिट्स (32 बाइट्स) का उत्पादन करता है। एल्गोरिथ्म एक दौर का उपयोग करता है, जिसे 64 बार दोहराया जाता है। नीचे दिया गया चित्रण एल्गोरिथ्म के एक दौर को दर्शाता है, जो आठ 4-बाइट ब्लॉक लेता है, ए एच के माध्यम से, कई ऑपरेशन करता है और एन के माध्यम से ए के लिए नए मूल्यों का उत्पादन करता है।


गोल SHA-256, विकिपीडिया से एक उदाहरण के रूप में , kockmeyer द्वारा, CC BY-SA 3.0

गहरे नीले रंग के ब्लॉक एक गैर-रैखिक फैशन में बिट्स को मिलाते हैं, जो क्रिप्टोग्राफ़िक विश्लेषण के लिए मुश्किल है। (यदि आप सफल हैश पाने के लिए गणितीय तेजी से रास्ता खोजने का प्रबंधन करते हैं, तो आप बिटकॉइन के खनन को नियंत्रित कर सकते हैं)। सेल “सेलेक्ट” Ch, इनपुट E के मान के आधार पर F या G से बिट्स का चयन करता है। सेल “” ”योग“ बिट्स ए (या E) तीन चक्रीय शिफ्ट किए गए संस्करणों को उत्पन्न करता है, और फिर उन्हें मॉडुलो 2 के साथ जोड़ देता है।

सेल मा "बहुमत" प्रत्येक स्थिति ए, बी और सी पर बिट्स की जांच करता है, और 0 या 1 का चयन करता है, जो कि बहुमत में मूल्य पर निर्भर करता है। लाल कोशिकाएं 32-बिट परिवर्धन करती हैं, ए और ई के लिए नए मान उत्पन्न करती हैं। इनपुट डब्ल्यूटी थोड़ा संसाधित इनपुट पर आधारित है। (यह वह जगह है जहां इनपुट ब्लॉक को एल्गोरिथ्म में पेश किया जाता है।) इनपुट केटी प्रत्येक दौर के लिए एक निरंतर परिभाषित है।

उपर्युक्त दृष्टांत के अनुसार, केवल A और E प्रति चक्कर बदले जाते हैं। शेष मान अपरिवर्तित छोड़ दिए जाते हैं। A का पुराना मान B का नया मान बन जाता है, B का पुराना मान C का नया मान बन जाता है, और इसी तरह। हालांकि SHA-256 का प्रत्येक राउंड डेटा को थोड़ा बदलता है, 64 राउंड के बाद इनपुट डेटा पूरी तरह से मिश्रित होता है, एक अप्रत्याशित हैश मान देता है।

इब्म 1401


मैंने आईबीएम 1401 मेनफ्रेम पर इस एल्गोरिदम को निष्पादित करने का निर्णय लिया। यह कंप्यूटर 1959 में दिखाई दिया और 60 के दशक के मध्य तक यह सबसे अधिक बिकने वाला कंप्यूटर बन गया - उस समय 10 हजार से अधिक मशीनें सक्रिय रूप से संचालित हुईं। 1401 का कंप्यूटर 1960 के लिए भी बहुत शक्तिशाली कंप्यूटर नहीं था। हालांकि, मध्यम आकार की कंपनियों के लिए यह सस्ती थी जो पहले एक कंप्यूटर होने का जोखिम नहीं उठा सकती थी, इस तथ्य के कारण कि इसे कम पैसे के लिए किराए पर लिया जा सकता था - $ 2,500 प्रति माह।

IBM 1401 में सिलिकॉन चिप्स का उपयोग नहीं किया गया था। इसके अलावा, इस कंप्यूटर में कोई चिप्स नहीं थे। इसके ट्रांजिस्टर सेमीकंडक्टर्स, जर्मेनियम क्रिस्टल पर बनाए गए थे, जो सिलिकॉन से पहले इस्तेमाल किए गए थे। ट्रांजिस्टर, अन्य घटकों के साथ, एसएमएस कार्ड नामक ताश के पत्तों के आकार वाले बोर्डों पर स्थापित किए गए थे। कंप्यूटर में हजारों ऐसे कार्ड शामिल थे, जिन्हें "दरवाजे" नामक रैक के रूप में स्थापित किया गया था। IBM 1401 में बीस ऐसे "दरवाजे" हैं जिन्हें कंप्यूटर रखरखाव के लिए आगे रखा गया है। ऊपर चित्रण में, एक खुला दरवाजा दिखाई देता है, जो माइक्रोचिप्स और केबलों तक पहुंच प्रदान करता है।


चित्रण आईबीएम 1401 मेनफ्रेम का एक खुला रैक (तथाकथित "दरवाजा") दिखाता है। तस्वीर सर्किट से जुड़े एसएमएस कार्ड दिखाती है। यह रैक टेप ड्राइव चलाता है

इस तरह के कंप्यूटर का कार्य सिद्धांत आधुनिक पीसी से काफी अलग था। इस कंप्यूटर में 8-बिट बाइट्स का उपयोग नहीं किया गया था, लेकिन बाइनरी-कोडेड दशमलव संख्या (BCD) पर आधारित 6-बिट वर्ण थे। चूंकि यह कंप्यूटर आर्थिक समस्याओं को हल करने के लिए एक गणना मशीन था, इसलिए इसने द्विआधारी अंकगणित के बजाय दशमलव का उपयोग किया और स्मृति के प्रत्येक चरित्र का 0 से 9 तक डिजिटल मूल्य था। चुंबकीय कोर पर कंप्यूटर मेमोरी में 4000 वर्ण होते थे। एक मेमोरी विस्तार मॉड्यूल ने डिशवॉशर के आकार को 12,000 वर्णों से मेमोरी क्षमता बढ़ा दी। कंप्यूटर में डेटा प्रविष्टि छिद्रित कार्ड का उपयोग करके किया गया था। कार्ड रीडर कार्ड से डेटा और प्रोग्राम पढ़ता है। आउटपुट डेटा को उच्च गति वाले ड्रेन प्रिंटर द्वारा प्रिंट किया गया था या नक्शे पर मुक्का मारा गया था।

संग्रहालय कंप्यूटर इतिहास के कंप्यूटर इतिहास संग्रहालयमाउंटेन व्यू में, इसमें दो काम करने वाले आईबीएम 1401 मेनफ्रेम हैं। उनमें से एक पर, मैंने SHA-256 हैश कोड चलाया। मैं आईबीएम 1401 पर अपने लेख फ्रैक्टल्स में आईबीएम 1401 के बारे में अधिक बात करता हूं

IBM 1401 पर SHA-256 चलाना


निश्चित रूप से IBM 1401 कंप्यूटर उन सभी मशीनों में से सबसे खराब है जिन्हें SHA-256 हैश एल्गोरिथम को निष्पादित करने के लिए चुना जा सकता है। प्रभावी ढंग से काम करने के लिए, इस एल्गोरिथ्म में ऐसी मशीनों की आवश्यकता होती है जो 32-बिट शब्दों में बिट संचालन कर सकती हैं। दुर्भाग्य से, आईबीएम 1401 32-बिट शब्दों या बाइट्स का समर्थन नहीं करता है। यह कंप्यूटर 6-बिट वर्णों के साथ काम करता है और बिट संचालन की अनुमति नहीं देता है। इसके अलावा, इसमें, बाइनरी के बजाय, दशमलव अंकगणित का उपयोग किया गया था। इसलिए, 1401 कंप्यूटर पर एल्गोरिथ्म उपयोगकर्ता के लिए धीमा और असुविधाजनक होगा।

मैंने प्रति बिट एक वर्ण का उपयोग करके समाप्त किया। 32-बिट मान 32 वर्णों के रूप में संग्रहीत किया गया था, या तो "0" या "1"। मेरा कोड चरित्र द्वारा बिटवाइज़ संचालन, गुणन और परिवर्धन चरित्र प्रदर्शन करना था, प्रत्येक चरित्र की जाँच करना और यह तय करना कि इसके साथ क्या करना है। जैसा कि आप उम्मीद कर सकते हैं, कोड निष्पादन में लंबा समय लगा।

इसके बाद, मैंने जो कोडांतरक कोड लिखा था, उसे प्रस्तुत करता हूं। सामान्य तौर पर, कोड का सिद्धांत टिप्पणियों में वर्णित है। कोड के अंत में हेक्साडेसिमल रूप में SHA-256 एल्गोरिथ्म के लिए आवश्यक स्थिरांक की एक तालिका है। चूंकि कंप्यूटर 1401 हेक्साडेसिमल प्रारूप का समर्थन नहीं करता है, इसलिए मुझे हेक्साडेसिमल और बाइनरी प्रारूपों को परिवर्तित करने के लिए अपनी खुद की दिनचर्या लिखनी थी। इस लेख में मैं आईबीएम 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 सेकंड के लिए बुखार से झपकी लिया। अंत में, प्रिंटर ने अंतिम हैश के लिए प्रिंट किया (आपने लेख की शुरुआत में प्रिंटआउट भी देखा), और परिणाम एक नए पंच कार्ड पर लागू किए गए थे। चूंकि बिटकॉइन खनन SHA-256 डबल हैशिंग का उपयोग करता है, खनन हैशिंग प्रक्रिया दो बार लंबी (80 सेकंड) लेती है।


SHA-256 हैश की गणना करते हुए IBM 1401 कंसोल की कड़ी मेहनत

प्रदर्शन की तुलना


IBM 1401 कंप्यूटर 80 सेकंड में SHA-256 डबल हैश की गणना कर सकता है। इस कार्य को पूरा करने के लिए, कंप्यूटर लगभग 3,000 वाट बिजली की खपत करता है, लगभग एक इलेक्ट्रिक स्टोव या कपड़े ड्रायर के रूप में। एक समय में, मूल आईबीएम 1401 प्रणाली की लागत $ 125,600 थी। 2015 की वास्तविकताओं में, यह लगभग एक मिलियन अमेरिकी डॉलर है। उसी समय, अब आप $ 50 के लिए खनन के लिए एक यूएसबी फ्लैश ड्राइव खरीद सकते हैं , जिसमें एक विशेष एकीकृत सर्किट (एएसआईसी यूएसबी माइनर) है। यह यूएसबी माइनर प्रति सेकंड 3.6 बिलियन हैश करता है, जबकि लगभग 4 वाट का उपभोग करता है।
इस तरह के महत्वपूर्ण प्रदर्शन संकेतक कई कारकों के कारण होते हैं: मूर के कानून के अनुसार पिछले 50 वर्षों में कंप्यूटर के प्रदर्शन में तेज वृद्धि, व्यावसायिक समस्याओं को हल करने के लिए कंप्यूटर में दशमलव अंकगणितीय के उपयोग से जुड़े प्रदर्शन का नुकसान, जो एक बाइनरी हैक्स कोड की गणना में व्यस्त था, साथ ही साथ गति में लाभ पारंपरिक बिटकॉइन खनन हार्डवेयर के पक्ष।

संक्षेप में। इस प्रक्रिया के लिए वर्तमान आवश्यकताओं को ध्यान में रखते हुए ब्लॉक को माइन करने के लिए, IBM 1401 कंप्यूटर को लगभग 5x10 ^ 14 वर्ष (जो कि ब्रह्मांड की वर्तमान आयु का 40,000 गुना है) की आवश्यकता होगी। खपत की गई बिजली की लागत लगभग 10 ^ 18 अमेरिकी डॉलर होगी। नतीजतन, आपको 25 बिटकॉइन प्राप्त होंगे, जिनका मौद्रिक शब्दों में मूल्य लगभग 6,000 अमेरिकी डॉलर होगा। इसलिए, आईबीएम 1401 मेनफ्रेम पर खनन बिटकॉइन को एक लाभदायक व्यवसाय नहीं कहा जा सकता है। नीचे दी गई तस्वीरों में पिछली शताब्दी के 60 के दशक के कंप्यूटर चिप्स और आधुनिक विकल्पों की तुलना की गई है, जो स्पष्ट रूप से तकनीकी प्रगति को प्रदर्शित करते हैं।


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


आप यह तय कर सकते हैं कि बिटकॉइन्स पिछली सदी के 60 के दशक की तकनीक के साथ असंगत हैं क्योंकि नेटवर्क पर डेटा संचारित करने की क्षमता की कमी है। क्या किसी को ब्लॉक किए गए कार्ड के साथ दूसरे कंप्यूटर पर पंच कार्ड भेजने की जरूरत होगी? नेटवर्क के माध्यम से कंप्यूटरों के बीच संचार बहुत पहले दिखाई दिया था। 1941 की शुरुआत में, आईबीएम ने तथाकथित टेलीमेट्रिक (रिमोट) डेटा प्रोसेसिंग प्रक्रिया का समर्थन किया। 60 के दशक में, आईबीएम 1401 को आईबीएम 1009 डेटा ट्रांसमिशन डिवाइस ( आईबीएम 1009 डेटा ट्रांसमिशन यूनिट) से जोड़ा जा सकता था) - एक डिशवॉशर के आकार का एक मॉडेम, जिसने कंप्यूटर को एक टेलीफोन लाइन पर एक दूसरे के साथ प्रति सेकंड 300 अक्षरों तक डेटा का आदान-प्रदान करने की अनुमति दी। यही है, सैद्धांतिक रूप से, पिछली शताब्दी के 60 के दशक की प्रौद्योगिकियों के आधार पर बिटकॉइन नेटवर्क का निर्माण काफी संभव है। दुर्भाग्य से, मैं टेलीप्रोसेसिंग डेटा के लिए उपकरण प्राप्त करने और इस सिद्धांत का परीक्षण करने में सक्षम नहीं था।


IBM 1009 डेटा ट्रांसफर डिवाइस। 1960 में एक डिशवॉशर का आकार मॉडम दिखाई दिया। इसके साथ, एक टेलीफोन लाइन पर प्रति सेकंड 300 अक्षरों तक संचारित करना संभव था। फोटो स्रोत: आईबीएम डेटा प्रोसेसिंग सिस्टम का परिचय)

जाँच - परिणाम


प्राचीन मेनफ्रेम की विधानसभा भाषा में SHA-256 का उपयोग करना एक कठिन लेकिन दिलचस्प अनुभव बन गया है। मुझे बेहतर प्रदर्शन की उम्मीद थी ( 12 मिनट में मेरे मंडेलब्रोट सेट की तुलना में )। एक वाणिज्यिक कंप्यूटर का दशमलव अंकगणितीय SHA-256 जैसे द्विआधारी एल्गोरिदम के लिए सबसे अच्छा विकल्प नहीं है। हालांकि, बिटकॉइन माइनिंग एल्गोरिदम को एकीकृत सर्किट के बिना कंप्यूटर पर भी प्रदर्शन किया जा सकता है। इसलिए, अगर अचानक एक निश्चित अस्थायी पतन मुझे 1960 में ले जाता है, तो मैं एक बिटकॉइन नेटवर्क बना सकता हूं।

बुधवार और शनिवार को कंप्यूटर इतिहास का माउंटेन व्यू संग्रहालय, आईबीएम 1401 को दर्शाता है। यदि आप पास में होते हैं, तो आपको निश्चित रूप से समय सारिणी की जांच करके इस पर ध्यान देना चाहिएकाम। और अगर आप संग्रहालय के कर्मचारियों को बताते हैं जो मेरे बारे में आईबीएम 1401 को प्रदर्शित करते हैं, तो वे मेरे पीआई कार्यक्रम को भी शुरू कर सकते हैं

मैं कंप्यूटर इतिहास संग्रहालय और 1401 कंप्यूटर रिकवरी टीम के सदस्यों को धन्यवाद देना चाहता हूं: रॉबर्ट गार्नर, एड थेलेन, वैन स्नाइडर और विशेष रूप से स्टेन पैडॉक। Ibm-1401.info टीम की वेबसाइट पर 1401 कंप्यूटर और इसे पुनर्प्राप्त करने के बारे में बहुत सारी रोचक जानकारी है।

व्याख्या


यह ध्यान देने योग्य है कि मैंने आईबीएम 1401 पर वास्तविक ब्लॉक को तोड़ नहीं दिया था - कंप्यूटर इतिहास का संग्रहालय इसे पसंद नहीं करेगा। जैसा कि मैंने कहा, काम कर रहे आईबीएम 1401 में, आप खनन पर पैसा नहीं कमा पाएंगे। हालांकि, मैं आईबीएम 1401 मशीन पर SHA-256 एल्गोरिथ्म को लागू करने और निष्पादित करने में कामयाब रहा, इस प्रकार यह साबित करना कि खनन सैद्धांतिक रूप से संभव है। और मैं एक वैध हैश खोजने के रहस्य को प्रकट करूँगा - मैंने पहले से ही खनन वाले ब्लॉक का उपयोग किया है

हमें उम्मीद है कि आपको हमारा अनुवाद पसंद आया होगा

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


All Articles