PoW بارگذاری‌‌شده: مسیری جدید در الگوریتم‌‌های اثبات کار

با این‌‌که افراد زیادی مصرف انرژی عملیات‌‌های استخراج ارز رمزنگاری شده را مورد انتقاد قرار می‌‌دهند، این روش تنها روش اثبات‌‌شده و آزمایش‌‌شده برای ایمن‌‌کردن یک بلاکچین در مقابل مهاجمین می‌‌باشد. باقی طرح‌‌ها مثل اثبات سهام (PoS) یا اثبات اهمیت، یک نقطه‌‌ضعف مشترک دارند: یک مهاجم، مثلا یک دولت مخالف، می‌‌تواند خیلی زود و بی سر و صدا حمله کند، میزان بالایی سکه با قیمت پایین بخرد و امنیت سیستم را به صورت مقرون‌‌به‌‌صرفه از بین ببرد؛ به عنوان مثال یک حمله سیبل (Sybil) یا حمله محتوای تقلبی که در آن مهاجمین، خود را به ظاهر گروه بی‌‌ارتباطی از کاربران در می‌‌آورند. اما بیت کوین و دیگر ارزهای رمزنگاری شده‌‌ مثل زی‌‌کش و دش، از روش اثبات کار (PoW) استفاده می‌‌کنند که چنین نقطه‌‌ضعفی ندارد: مهاجم باید از منابع زیاد برق و هزینه‌‌های پرشمار استفاده کند و هیچ‌‌کس هم به او برق رایگان نمی‌‌دهد. در ادامه Emanuel Jeffrey از medium.com به توضیح و آموزش بیشتر در این زمینه می‌پردازد.

0 148

در روش اثبات کار مهاجم نمی‌‌تواند هیچ کاری برای بهبود وضعیت حمله خود به شبکه انجام دهد. آن‌‌ها باید به قدرت رایانشی بیشتر خود در مقابل مجموع قدرت‌‌های تک تک استخراج‌‌کنندگان شبکه متکی باشند. برای شبکه‌‌ای مثل بیت کوین، هزینه چنین حمله‌‌ای برای مهاجم، فقط از حیث نیروی لازم، چیزی در حدود ده‌‌ها میلیون دلار خواهد بود!

مشکل PoW این است که تمام الگوریتم‌‌های هش اولیه مورد استفاده برای ارزهای رمزنگاری شده‌‌ اصلی، تحت انحصار شرکت چینی Bitman در آمده (یا خواهد آمد). از آنجایی که هدف اصلی ارزهای رمزنگاری شده‌‌، مقاومت به سانسور می‌‌باشد، این مسئله کمی نگران‌‌کننده است، زیرا مشخص است که Bitman در مقابل نفوذهای دولت چین مقاوم نیست و هدف اصلی توسعه باز پول‌‌های دیجیتالی غیرقابل‌‌کنترل را به خطر می‌‌اندازد.

سرعتی که Bitman در انحصار صنعت استخراج رمز ارز به‌‌دست آورده، تعجب‌‌آور است و مشکلات سختی را برای هزاران عملیات استخراج کوچک‌‌مقیاس GPU به وجود آورده است. بگذارید مزیت میزان سرعت به اثربخشی یک طراحی ASIC نسبت به چند کامپیوتر دارای GPUهای جدید AMD یا Nvidia را با مثالی توضیح دهیم: آخرین نسخه Bitman برای زی کش می‌‌تواند میزانی رایانش را با هزینه کمتر از 2000 دلار، 300 وات انرژی انجام دهد و همین میزان رایانش برای GPUها حدود 7000 وات انرژی و 25000 دلار هزینه در بر خواهد داشت! به خاطر این‌‌که استخراج‌‌کنندگان GPU کمی درمانده شده‌‌اند (مخصوصا در بازار نزولی ارزهای رمزنگاری شده‌‌) بسیاری از آن‌‌ها تجهیزات استخراج خود را به وبسایت‌‌هایی مثل miningrigrentals.com و  nicehash.com قرض داده‌‌اند.

در این وبسایت‌‌ها که برای بسیاری از افراد حاضر در دنیای ارزهای رمزنگاری شده‌‌ آشنا هستند، خریداران پیشنهاد خود را در قالب بیت کوین ارائه می‌‌کنند تا بتوانند به صورت ساعتی، کنترل میزان زیادی نیروی رایانشی را برای الگوریتم‌‌های هشینگ محبوب (مثل Equihash, X11, SHA-256) به دست بگیرند. ترکیب استخراج‌‌کنندگان نا امید با GPUهای بدون‌‌سوددهی، همراه با قیمت‌‌های رمزنگاری ضعیف، سبب حملات خرج دوباره شده که باعث ضرر میلیون دلاری شرکت‌‌های صرافی می‌‌شود. چنین حملاتی رویدادهای منفی برای پروژه‌‌های کریپتوی هدف محسوب می‌‌شوند؛ در بدترین حالت، این موارد می‌‌توانند سبب خارج کردن ارز از فهرست‌‌ها توسط صرافی‌‌ها و کاهش اعتبار بازاری در امنیت ارز مربوطه شود.

اختلاف نظر بزرگی بین بهترین روش حرکت از این قسمت وجود دارد. اجتماع مونرو اخیرا تصمیم گرفت تا تغییر سیستم اثبات کار را به طور کامل انجام دهد و مشخص شد که Bitman یک ASIC توسعه داده‌‌است. حالا که الگوریتم هش زی‌‌کش هم یک ASIC Bitman در اختیار دارد، این اجتماع بر سر این موضوع که آیا باید مثل مونرو درگیر اختلاف شوند یا ناگزیر بودن ASIC را بپذیرند و امیدوار بازار رقابتی‌‌تر برای توسعه باشند، دچار بحث شده و سازندگان ASIC متعددی سعی می‌‌کنند سیستم را پویا و نامتمرکز کنند. ضمن این که هر چقدر هش به ازای ثانیه بالاتر باشد، هزینه کمتر و تولید کربن کمتری وجود خواهد داشت. این مسیر امیدوارکننده، مسیری بود که پروژه سیاکوین دنبال می‌‌کرد و این موضوع در آخرین پست وبلاگ آن‌‌ها توسط توسعه‌‌دهنده اصلی‌‌شان منتشر شده ‌‌است. در بحث سیاکوین، آن‌‌ها در واقع ASIC اختصاصی خود را توسعه دادند. اما به واسطه یک اتفاق ناگهانی، آن‌‌ها توسط Bitman شکست خوردند و بازار را به آن‌‌ها دادند تا خریداران ناراضی فقط به کسری از چیزی که قرار بود، برسند.

دیگران هم به دنبال یک راه‌‌حل کاملا فنی برای تداوم استفاده از PoW و محدودکردن نفوذ استخراج‌‌کنندگان ASIC بوده‌‌اند. این مسئله، طرح اولیه مورد نظر الگوریتم PoW بود که برای اتریوم به کار گرفته شد و قرار بود تا
“memory-hard” باشد و به همین خاطر هنگام اجرا به عنوان ASIC، سود کمتری به ارمغان آورد. ایده اساسی این قسمت، این است که حافظه سخت (DRAM یا حافظه دسترسی تصادفی پویا) گران می‌‌باشد، پس اگر نیازمند میزان بالایی حافظه برای انجام رایانش هستید (که اتر آن را با به کارگیری یک ساختار گراف داده‌‌ای با عنوان DAG محقق می‌‌کند و چند گیگابایت حجم دارد)، می‌‌توانید هزینه‌‌های حافظه را به بخش اصلی هزینه کلی تبدیل کنید. این یک ایده منطقی بود و به نظر می‌‌رسید برای مدتی جواب دهد و تنها راه استخراج اتر یا زی‌‌کش برای استفاده از چندین GPU محسوب می‌‌شد. با اینکه بازار GPU به اندازه بازار ASIC توسط AMD و Nvidia متمرکز است، شرایط آن نسبت به تولید انحصاری Bitman در ASICهای استخراجی کریپتو مطلوب‌‌تر به نظر می‌‌رسد.

متاسفانه روش “memory-hard” از یک نقطه‌‌ضعف واضح رنج می‌‌برد: اگر بتوانید با استفاده از DRAM بسیار گران، روشی برای ذخیره‌‌کردن تمام داده‌‌ها در حافظه پیدا کنید و سپس این داده‌‌ها را در گروه بسیار بزرگی از پردازنده‌‌های ارزان به اشتراک بگذارید، هزینه‌‌ها را در این تعداد پردازنده تقسیم کرده‌‌اید و مشکل را تا حدود زیادی به پایان رسانده‌‌اید. و این دقیقا همان چیزی است که اخیرا رخ داده. به علاوه، مشخص نیست که این اتفاق دقیقا چه زمانی افتاد، زیرا Bitman با محصولات خود، چندین ماه پیش از فروش دوباره آن‌‌ها به بازار عمومی، استخراج انجام داده اما اکنون این واحدها را به افراد عادی می‌‌فروشد و سختی حافظه چندان هم سخت نبوده است.

هنگامی که بر روی توسعه Animecoin کار می‌‌کردم، تفکرات من درباره این معما و بهترین استراتژی برای مقابله با آن، تولید شده بود. در ابتدا من قصد داشتم تا بر روی همان الگوریتم هشینگ، Equihash که توسط زی‌‌کش و بسیاری از سکه‌‌های دیگر مثل Bitcoin Private, Z-Classic, ZenCash و غیره کار کنم. اما حملات دوباره شدیدا عمومی و تازه که از نظر بسیاری از شرکت‌‌کنندگان بازاری، خطری جدی به حساب می‌‌آمد، برایم مشخص کرد که انتخاب یک الگوریتم هشینگ محبوب، مخصوصا الگوریتمی که فقط با چند بیت کوین در مقادیر بالا قابل اجاره است، اساسا یک دعوتنامه برای مهاجمین می‌‌باشد تا به پروژه شما حمله کنند!

چند هفته پیش، من یک سیستم اثبات‌‌ کار جدید برای پروژه ایجاد کردم. هدف ابتدایی من ساخت سیستمی مشابه با سیستم‌‌های موجود بود تا بتوان آن را به سادگی فهمید و به منظور امنیت سیستم آن را تایید کرد. اما باید به اندازه‌‌ای متفاوت می‌‌شد که برای مدتی در وبسایت‌‌های اجاره‌‌ای استخراجی در دسترس قرار می‌‌گرفت. هدف اصلی، محافظت از پروژه طی اولین مراحل آن بود، مخصوصا هنگامی که نسبت به چنین حملاتی آسیب‌‌پذیر می‌‌شود. از آنجایی که کامپیوترهای کمی از ابتدا اقدام به استخراج می‌‌کنند، مهاجم به سادگی می‌‌تواند آن‌‌ها را با استفاده از یک نیروی رایانشی اجاره‌‌ای شکست دهد.

اما هنگامی که شروع به نوشتن کد اولیه در زبان پایتون کردم، همه چیز دست به دست هم داد و نهایتا نرم‌‌افزاری نوشتم که فکر می‌‌کنم قابلیت تغییر کل بحث درباره ASICها و اثبات کار را دارد. و شاید ما را، حداقل برای مدت کوتاهی به روزهای ابتدایی بیت کوین باز گرداند که همه می‌‌توانستند با یک کامپیوتر عادی، کمی سکه استخراج کنند: این همان رویای ساتوشی بود.

من با در نظر گرفتن چیزی که به ASICها در بحث قیمت به عملکرد در برابر GPUها و CPUها ساختار می‌‌داد کار خود را آغاز کردم. پاسخ چیزی است که همانند تمام دیگر مسائل در مهندسی، یک سازش یا توافق محسوب می‌‌شود. هر چقدر ریز پردازنده شما منعطف‌‌تر باشد، سازگاری بیشتری برای رایانش مورد نظر شما خواهد داشت؛ مثل پردازنده‌‌های اصلی موجود در لپ‌‌تاپ‌‌ها و تلفن‌‌های همراه که از نظر سرعت و انرژی کارایی کمتری خواهند داشت.

با محدود کردن نوع و شکل رایانشی که انجام می‌‌دهید، می‌‌توانید عملکرد الگوریتم‌‌ها را به روش‌‌های مختلف بهبود دهید. SHA-256 یا همان الگوریتم مورد استفاده در بیت کوین را در نظر بگیرید. مشخص شد که توصیف این الگوریتم شدیدا کوتاه و ساده است، هرچند که خروجی کاملا پیچیده‌‌ای تولید می‌‌کند. در حقیقت، پیاده‌‌سازی کامل SHA-256 حدود 100 خط کد پایتون می‌‌باشد. در نهایت، هر مرحله توصیف‌‌شده در این کد، از چرخش‌‌های بیت تا عملیات XOR باید در سطح تراشه‌‌های سیلیکونی انجام شود تا الگوریتم از کد نرم‌‌افزاری به صفحه نمایش چیپ ASIC برسد و بتواند استفاده مناسب و واقعی داشته باشد.

بنابراین یکی از راه‌‌های تولید الگوریتم اثبات کار جدید که طراحی سخت‌‌تر و گران‌‌تر ASIC هم دارد، مسیر مخالفی را خواهد داشت: الگوریتم‌‌ها را پیچیده‌‌تر بسازید تا دروازه‌‌های منطقی‌‌تر برای ساخت مدارها مورد نیاز باشد. در نقطه‌‌ای هنگامی که پیچیدگی بیشتری اضافه می‌‌کنید، مدارهای مورد نیاز به پیچیدگی دستگاه رایانشی مورد نظر می‌‌رسند و این به معنای مقرون به صرفه‌‌بودن ASIC در مقابل CPU و GPU خواهد بود. در نهایت، می‌‌توانید در بلاک، اثبات کار خود را از نظر پتانسیل یک سازنده ASIC به حداقل جذابیت برسانید.

اینجا باید در ذهن داشت که نیازهای مشخص برای یک الگوریتم اثبات کار خوب وجود دارد. اصلی‌‌ترین نیاز این است که شما به دنبال شرایطی نیستید که در آن سریعترین رایانه‌‌ها همیشه برنده باشند؛ در عوض، استخراج باید همانند یک بخت‌‌آزمایی باشد که در آن احتمال بردن به تعداد بلیط‌‌هایی که خریداری می‌‌کنید بستگی دارد (یا میزان رایانشی که می‌‌توانید با هش‌‌های رایانشی نشان دهید). همچنین به سیستم اثبات کاری نیازی دارید که در آن به سادگی بتوانید سطح دشواری را بالا یا پایین ببرید (یا میزان نیروی رایانشی مورد نیاز برای استخراج یک بلاک معتبر) تا شبکه بتواند با تغییرات قیمت و نیروی رایانشی در دسترس وفق بگیرد و این مسئله برای ثابت نگه داشتن نرخ تورم سکه ضروری خواهد بود. همچنین به سیستمی نیاز دارید که پیدا کردن شماره‌‌های ویژه در آن سخت باشد (nonces) و تمام استخراج‌‌کنندگان به دنبال آن باشند اما تایید عمل صحیح این نانس‌‌ها که به یک بلاک معتبر ختم می‌‌شود هم برای همه آسان صورت بگیرد.

مسئله دیگری که در این قسمت باید درک کنید این است که رایانه‌‌ها چگونه اعداد را از نظر اعشاری یا حداقل در زمینه محدودیت‌‌هایشان، مدیریت می‌‌کنند. اعدادی که در اکثر برنامه‌‌های یک رایانه مثل اکسل، استفاده می‌‌کنید، در حقیقت خیالی و فرضی هستند؛ در واقع تقریبی هستند که برای انجام اکثر موارد خوب می‌‌باشند اما به ندرت در روش‌‌های مختلف دچار شکست می‌‌شوند.

بیشترین استفاده ما از 32 و 64 بیت است که می‌‌توانید آن را به عنوان اعداد قبل از گرد کردن یا کوتاه‌‌کردن در نظر بگیرید. اگر در حال انجام محاسبات همین عملکرد در یک ردیف هستید، حتی اشتباهات کوچک هم در گذر زمان روی هم تلمبار می‌‌شوند. برای چنین مواردی، ممکن است نیازمند شبیه‌‌سازی هسته‌‌ای یک آزمایشگاه دولتی باشیم و حتی 64 بیت دقیق هم به اندازه کافی خوب نخواهد بود.

دقیقا همانند پیچیدگی ریزپردازنده‌‌ها، دقت عددی هم یک سازش یا توافق است. با محدود کردن خود به 32 یا 64 بیت، به سخت‌‌افزار کامپیوتری مدرن اجازه می‌‌دهیم تا ریاضیات سریعی انجام دهد. هر عدد یک فضای از پیش‌‌مشخص‌‌شده‌‌ای برای بهبود شدید حافظه برنامه‌‌ها برای استفاده بهتر کش پردازنده دارد؛ کش پردازنده همان حافظه سریعی است که به صورت مستقیم روی تراشه پردازنده قرار گرفته است.

اگر ما به دقت 500 رقمی اصرار داشته باشیم، باز هم می‌‌توانیم محاسبات انجام دهیم و نوع صحیحی از نرم‌‌افزار را در اختیار داشته باشیم، اما سرعت بسیار بسیار کمتری خواهیم داشت. و این مسئله به این خاطر است که ما باید میزان پویایی از فضای حافظه در اختیار داشته باشیم. بسته به ماهیت محاسبه‌‌ای که انجام می‌‌شود و تعداد مشخص بیان‌‌شده (مثلا اعدادی مثل 1 به 7 و 1 به 3 برای تخمین دقیق رایانه شدیدا دشوار هستند)، میزان ارقامی که باید در هر مرحله ذخیره کنید، می‌‌تواند شدیدا متغیر باشد. برنامه‌‌ریزی و محاسبه یک محاسبه پویا مثل این که در آن شکل محاسبه هموارد تغییر می‌‌کند، سخت است.

همانطور که انتظار می‌‌رود، ASICها برای محاسبات دقیق ریاضی خوب نیستند. در حقیقت، یک جستجوی گوگل برای دقت مطلق ASICها نشان می‌‌دهد که در این زمینه بررسی‌‌های لازم صورت نگرفته ‌‌است. و این مسئله هم منطقی به نظر می‌‌رسد، زیرا که دقیقا از چنین نرم‌‌افزارهایی نمی‌‌توان در ASIC استفاده خوبی گرفت؛ آن‌‌ها برای این منظور ساخته نشده‌‌اند.

به طور کلی، این شرایط همیشه رخ نمی‌‌دهند، زیرا به ندرت پیش می‌‌آید که فردی نیازمند محاسبات ریاضی مطلق دقیق باشد. به همین خاطر اگر به سراسر جهان نگاه کنید، افراد زیادی را می‌‌بینید که سعی در بهبود محاسبات مرتبط با اعداد استاندارد تک یا دو دقتی شناور دارند (مثل برای گرافیک بازی‌‌های رایانه‌‌ای یا آموزش مدل یادگیری ماشینی سریع‌‌تر). اما واقعا چه کسی به این اعداد در ریاضیات دقیق مطلق نیاز دارد؟

در نهایت، افراد می‌‌خواهند هنگام معاملات خود مراقب اعداد اعشار باشند (مثلا برای نرم‌‌افزارهای حسابداری) و باید گرد کردن را به صورت صحیح انجام دهند. به عنوان مثال، اگر Citibank سود مربوط به تراز 350 دلاری را محاسبه کند، باید دقیق عمل کند تا بتواند در حد یک پنی هم دقت داشته باشد. اما نرم‌‌افزارهای کمی خارج از بحث ریاضیات خالص وجود دارند و برخی از حرفه‌‌های مهندسی نیازمند اطلاع از صحیح بودن پاسخشان هستند و این پاسخ‌‌ها 100 رقم اعشار خواهد داشت، حتی گاهی این رقم به 12 رقم اعشار هم می‌‌رسد! در هر حال، 15 رقم Pi برای اندازه‌‌گیری دقیق عرض دنیا تا حد 2 اینچ دقت کافی می‌‌باشد و چه نیازی به 2000 رقم خواهیم داشت؟

احتمالا متوجه شده‌‌اید که بحث به کجا می‌‌رسد. ما باید با محاسبات عددی دقیق، روشی برای ترکیب میزان بالای کد و الگوریتم‌‌های پیچیده پیدا کنیم (چیزی که یک کابوس کامل برای طراح ASIC خواهد بود). به طور کلی ASICها برای این منظور خوب عمل نمی‌‌کنند. و به روشی نیاز داریم تا بتوانیم این محاسبات را با دقت 100 درصد انجام دهیم تا دیگر هرگز مشکلات توافق نداشته باشیم. به همین خاطر، تمام نودهای شبکه باید خروجی مشابه با ورودی‌‌های یکسان داشته باشند تا بتوانند توافق کاملی درباره وضعیت سیستم به دست آورند. و ما باید این مسئله را در یک زبان سطح بالا مثل پایتون بنویسیم تا بتوانیم همه چیز را خلاصه و سریع انجام دهیم (نسخه نهایی کد من حدود 530 خط پایتون است).

تمام این محدودیت‌‌ها شما را مستقیما به کتابخانه متن باز MPMath خواهد رساند. این کتابخانه که به زبان پایتون خالص و اغلب توسط یک نویسنده نوشته می‌‌شود (کتابخانه برای دقت در مقابل نتایج دیگر نرم‌‌افزارهای سیستمی مثل Mathematica آزمایش می‌‌شود)، می‌‌تواند مزیت پروژه‌‌های GMP/GMPy2 برای افزایش سرعت محاسبات را به همراه داشته باشد.

کتابخانه MPMath از نظر پیچیدگی عظیم است، اما از نظر فضای ذخیره فقط یک مگابایت در اختیار دارد. در حقیقت اگر شما تمام کدهای MPMath را بگیرید و آن را به درون یک فایل بریزید، 25 هزار خط کد پایتون در اختیار خواهید داشت (این را از آن جهت می‌‌دانم که ساعت‌‌های زیادی را صرف باز کردن وابستگی‌‌های پیچیده به منظور ساخت یک فایل تکی کرده‌‌ام). و هنگامی که کمی به عقب می‌‌روید و بزرگی ریاضیات مدرن کتابخانه را نگاه می‌‌کنید، متوجه می‌‌شوید که این رقم چندان هم بزرگ نیست. ریاضیات مدرن به شما کمک می‌‌کند تا از اعداد واقعی، اعداد پیچیده و ماتریس‌‌ها به عنوان ورودی استفاده کنید و محاسبات دقیقی داشته باشید.

اساسا MPMath عملکردی دارد که به مهندسی یا فیزیک ختم می‌‌شود. این مسئله، تابع‌‌های نمایی، لگاریتم‌‌ها و عملکردهای مثلثاتی دوران دبیرستان تا عملکردهای پیچیده‌‌تر مثل عملکرد Bessel J یا عملکرد Airy Bi را شامل می‌‌شود. عملکردهایی با اندازه‌‌ها و شکل‌‌های مختلف وجود دارد که بر اساس انواع مختلف محاسبات، رایانش می‌‌شوند. اگرچه شاید جزییات پیاده‌‌سازی مشخص این عملکردهای مختلف پیچیده باشد، اساس آن نسبتا ساده‌‌ است: تمام این عملکردها یک عدد معمولی را به عنوان ورودی می‌‌گیرند و به شما عددی به عنوان خروجی می‌‌دهند و شما می‌‌توانید مشخص کنید که چه تعداد رقم دقت در خروجی خود می‌‌خواهید. MPMathباقی کار را انجام می‌‌دهد و مطمئن می‌‌شود که شما نتیجه‌‌ای دقیق و نسبتا سریع می‌‌گیرید.

حالا تمام این مسائل چگونه به اثبات کار و ارزهای رمزنگاری شده‌‌ مربوط است؟ برای فهمیدن این مسئله، بیایید عملکردهای هش را خیلی سریع با هم مرور کنیم. عملکرد هش، یک عملکرد یک‌‌طرفه است که داده‌‌های ورودی با هر طول و اندازه‌‌ای را دریافت می‌‌کند و به شما یک عدد به عنوان خروجی می‌‌دهد. اگر حتی یک جزء کوچک این داده‌‌های ورودی را تغییر دهید و هش را دوباره رایانش کنید، عدد به طور کلی تغییر خواهد کرد. یک عملکرد خوب هش، عملکردی است که رایانش یک مسیری آن بسیار سریع و آسان بوده، اما انجام آن در مسیر عکس تقریبا غیر ممکن است (به همین خاطر، پیدا کردن داده‌‌هایی که به یک هش مشخص به عنوان خروجی برسند، سخت خواهد بود).

هش‌‌ها معمولا با یک رشته طولانی از اعداد و حروف، شبیه حالت زیر ارائه می‌‌شوند:

00000000000000000a3ad90658c08cd4afdc24e3e36fda1a767c86bed17826

این هش یک بلاک بیت کوین تازه است. می‌‌توانید ببینید که صفرهای زیادی در ابتدای آن وجود دارد. هدف اصلی سیستم اثبات کار در بیت کوین، پیدا کردن چند شماره (nonce) می‌‌باشد. هنگامی که این شماره را به فهرست تمام داده‌‌های تراکنش بلاک می‌‌کنید و سپس نتیجه اِعمال این عملکرد هش به داده‌‌های ترکیبی را محاسبه می‌‌کنید (یا تراکنش+ نانس)، به شما نتیجه‌‌ای با چندین صفر آغازین می‌‌دهد.

من فکر می‌‌کنم این تعریف هش‌‌ها سبب ایجاد یک مانع غیرضروری در فهم عمومی فرایند استخراج می‌‌شود. هیچ نکته مبهمی درباره رشته بالا وجود ندارد. فقط یک عدد بزرگ (عدد صحیح) داریم که در قالب شانزده رقمی آمده و می‌‌توانید به جای 10 رقم، 16 رقم را بخوانید. همچنین ما صفرهای ابتدا را نگه می‌‌داریم تا رشته هش همیشه طول یکسانی از نظر تعداد کاراکتر داشته باشد. اگر از اعداد عادی استفاده می‌‌کردیم، دیدن صفر بدون اعشار، در ابتدا بسیار عجیب می‌‌شد.

اگر کمی به این موضوع فکر کنید، روش دیگر برای چیزی که ما در استخراج بیت کوین به دنبال آن هستیم، اعداد کوچکی هستند که از عملکرد هش به دست می‌‌آیند. چیزی که نانس‌‌ها را به چنین خروجی‌‌هایی می‌‌رساند، این است که نتایج اِعمال عملکرد هش به اغلب داده‌‌های ورودی، نتیجه‌‌ای با اندازه مشابه خواهد بود. البته می‌‌توانید به عددی برسید که بسیار کوچکتر باشد، اما همه چیز به شانس شما بستگی دارد و احتمال این مسئله بسیار پایین است؛ این احتمال به قدری کم است که باید با میلیاردها هش رقابت کنید تا احتمال پایینی برای پیدا کردن چنین نانسی در هنگام استخراج یک بلاک، آن هم زودتر از باقی افراد داشته باشید.

و بله، همینجا پیچیدگی استخراج بیت کوین به پایان می‌‌رسد؛ یک خروجی کوچک از عملکرد هش پیدا کنید. حتی الگوریتم‌‌های هش پیچیده‌‌تر هم اساسا از متغیرهای این ایده اساسی استفاده می‌‌کنند: یک عملکرد هش را بارها و بارها محاسبه می‌‌کنند (و شاید به اجزای ساختار داده بزرگتری در حافظه دسترسی داشته باشند) و سعی می‌‌کنند تعداد کوچکی به عنوان خروجی به دست آورند که البته انجام این کار ساده نیست. برخی از پروژه‌‌ها مثل الگوریتم اثبات کار دش، چند عملکرد هش را با هم متصل می‌‌کند تا خروجی اولین عملکرد به عنوان ورودی عملکرد هش دوم باشد و باقی زنجیره به همین شکل دنبال شود. با این که شاید این مسئله برای یک بیننده عادی مطمئن به نظر برسد، ایده بدی از آب درآمده، زیرا امنیت کلی سیستم به حداقل عملکرد هش ایمن مصرفی بستگی دارد (یا امنیتی که محاسبه عملکرد هش برعکس آن ساده‌‌ترین باشد). تغییر الگوریتم‌‌های هش به این روش، این مسئله را به گونه‌‌ای تبدیل می‌‌کند که اگر هر کدام از این الگوریتم‌‌ها بد عمل کنند، سیستم شما هم بد عمل می‌‌کند و از بین می‌‌رود!

ایده بهترسپ می‌‌تواند به صورت مستقل، هش‌‌های مختلف تولید کند. همچنین دیگر پروژه‌‌ها (مثل Verge) از این روش استفاده می‌‌کنند و به استخراج‌‌کنندگان اجازه می‌‌دهند تا با استفاده از الگوریتم‌‌های هشینگ مختلف، بلاک‌‌های معتبر تولید کنند که هر بلاک، سطح دشواری خاص خود را خواهد داشت. مشکل این روش این است که حاملین مختلفی برای حمله معرفی کرده که سبب تولید میلیون‌‌ها دلار سکه تقلبی در ماه‌‌های اخیر شده (و البته استخراج‌‌کنندگان نا امیدی که زمان و برق خود را صرف بلاک‌‌های نامعتبر کرده‌‌اند). اگر کمی به این مسئله فکر کنید، این طرح به شما هیچ امنیتی نمی‌‌دهد و در حقیقت ممکن است به شما آسیب هم بزند، زیرا که تعداد استخرهای مختلف نیروی رایانشی قابل‌‌اجاره برای مهاجمین موجود در شبکه را بالا می‌‌برد.

اساسا من با پایان روش‌‌های قبلی آغاز می‌‌کنم. به جای نیاز به یک خروجی هش، سیستم ارائه‌‌شده از طرف من (که من به آن اثبات کار بارگذاری‌‌شده می‌‌گویم زیرا با محاسبات اضافی بارگذاری شده) از 5 الگوریتم هش مجزا استفاده می‌‌کند که هر کدام به عنوان ورودی داده یکسان عمل خواهند کرد (یا داده‌‌های تراکنش به اضافه نانس). برای تضمین این مسئله که تمام خروجی‌‌های حاصل هش، طول یکسانی داشته باشند، من موارد کوچکتر را گرفتم (خروجی‌‌های 256 بیتی) و یک نسخه از تعداد معکوس را به انتهای آن افزودم تا همه آن‌‌ها خروجی‌‌های 512 بیتی شوند.

اینجا فهرستی از عملکرد هش انتخابی من، همراه با مثالی از ظاهر آن‌‌ها در نرم‌‌افزار نمونه آمده‌‌ است.

hash

پنج هش مجزا برای یک داده ورودی محاسبه می‌‌شوند.

این رشته‌‌های طولانی از اعداد و حروف ممکن است رمزنگاری شده‌‌ به نظر برسند، اما فقط در ذهن داشته باشید که آن‌‌ها فقط اعداد بزرگ بوده و هیچ چیز دیگری نیستند. پس حالا ما 5 عدد بسیار بزرگ داریم. با آن‌‌ها چه کاری انجام می‌‌دهیم؟ چگونه آن‌‌ها را با هم ترکیب می‌‌کنیم؟ چگونه به شرایط بسیار بعید ترکیب این 5 عدد نیاز داریم؟ چگونه می‌‌توانیم تمام ویژگی‌‌های مطلوب عملکرد اثبات کاری که توضیح دادیم را در اختیار داشته باشیم؟ اینجا است که MPMath وارد عمل می‌‌شود.

اینجا فهرستی از 100 عملکرد محاسباتی مورد استفاده من از MPMath آمده است:

MPMath

اگرچه من مجبور شدم با شمارش چیزهایی مثل ریشه مکعب ایکس به صورت مستقل از چهارمین ریشه ایکس دست و پنجه نرم کنم، باز هم پهنای زیادی از رایانش بر روی صفحه نمایش عملکرد فهرست بالا وجود دارد. حالا ما با این عملکردها چه می‌‌کنیم؟ چگونه از کجا می‌‌فهمیم که باید کدام را انتخاب کنیم؟ چند لحظه دیگر درباره این مسئله صحبت می‌‌کنم، اما بگذارید ابتدا فرض کنیم که 5 عملکرد از فهرست بالا انتخاب کرده‌‌ایم و برای هر نتیجه هش، از نانسی که در حال فهرست‌‌کردن آن هستیم، محاسبات را انجام داده‌‌ایم.

ایده اساسی سیستم من، این است که شما از هر کدام از این خروجی‌‌های هش به عنوان ورودی یک عملکرد دیگر استفاده می‌‌کنید. در ذهن داشته باشید که این موارد فقط عملکردهای ریاضیاتی هستند که یک شماره را به عنوان ورودی (همیشه یک عدد کامل برای ما) را می‌‌گیرند و سپس یک عدد خروجی همراه با چندین رقم اعشاری می‌‌دهند. این عدد ممکن است بزرگ یا بسیار کوچک باشد. همه چیز به عملکرد و اعداد ورودی (مثل 5 خروجی هش) که ما از آن استفاده می‌‌کنیم بستگی دارد.

وقتی ما بخش‌‌های کسری این پنج عدد را بگیریم، اعشارها را حذف کنیم و به صفرهای ابتدایی هم توجه نکنیم، یک عدد بزرگ 5 رقمی خواهیم داشت.

وقتی که ما آخرین رقم‌‌های این 5 عدد را در نظر می‌‌گیریم (عدد اصلی مضربی از سطح دشواری است که بعدا آن را توضیح خواهم داد)، 5 عدد کوچکتر برایمان باقی می‌‌ماند. چرا آخرین ارقام را به جای اولین‌‌ها در نظر می‌‌گیریم؟ این کار برای تضمین این مسئله است که استخراج‌‌کنندگان تمام محاسبات لازم برای دقت عددی را انجام می‌‌دهند.

در نهایت ما این 5 عدد کوچکتر را می‌‌گیریم و آن‌‌ها را در هم ضرب می‌‌کنیم تا به یک عدد بزرگ برسیم. به این عدد بزرگ هش نهایی می‌‌گویند.

بر خلاف استخراج بیت کوین، هدف ما در این قسمت پیدا کردن هش نهایی کوچک به عنوان خروجی نیست. در عوض ما یک هدف جدید تعریف می‌‌کنیم: می‌‌خواهیم هش نهایی با یک الگوی مشخص از اعداد آغاز شود؛ اعداد 1 تا 9 که به ترتیب هم هستند. پس به عنوان مثال در سطح دشواری 5، نیاز داریم که هش نهایی با ارقام 12345 آغاز شود. طبیعتا، اکثریت هش‌‌های نهایی با چنین الگویی آغاز نمی‌‌شوند؛ برای وقوع چنین حادثه‌‌ای نیاز به یک کار دقیق محاسباتی به شیوه‌‌ای خاص می‌‌باشد.

به جز این سطح دشواری که طول الگوی رقم مورد نظر ما برای استخراج یک بلاک معتبر را کنترل می‌‌کند، ما یک اهرم دیگر داریم که می‌‌توانیم برای آسان‌‌تر یا دشوارتر کردن رایانش‌‌ها از آن استفاده کنیم: تعداد مکان‌‌های اعشاری دقتی که ما از رایانش هر فرد نیاز داریم. من در سیستم اولیه‌‌ام این موضوع را در یک سطح نسبتا پایین، مثلا 50 رقم دقت قرار دادم و سپس با درصد مشخصی آن را بالا بردم تا بتوانم در گذر زمان، بلاک‌‌ها را با نرخ ثابتی تولید کنم. سطوح نهایی دقت، پیش از اینکه ضامن‌‌های سیستم به سطوح دقت پایینتر بازگردند، می‌‌تواند تا حدود 2000 کلمه یا بیشتر هم باشد؛ این رقم بسیار بیشتر از چیزی است که با رایانش‌‌های دقت ثابت می‌‌توان انجام داد و ASICها در مقابل پردازنده‌‌هایی مثل GPUها و CPUها از این حیث برتری زیادی دارد.

حالا چگونه عملکرد مورد نظر خود را انتخاب کنیم؟ یک راه‌‌حل بسیار ساده وجود دارد که می‌‌توانیم از آن برای هر بلاک جدید استفاده کنیم تا مطمئن شویم که روش به صورت صحیح کار می‌‌کند و هر گره بر روی عملکردهای مشخص بلاک بعدی توافق دارد. راه‌‌حل این است که ما هش آخر بلاک استخراج‌‌شده را می‌‌گیریم. این یک عدد طولانی است که شاید چنین ظاهری داشته باشد:

12342669353192025399050788645218821036796365857533579892578046344296766311405078019320129330745000

توجه کنید که عدد بالا با 1234 آغاز می‌‌شود: این عدد از بلاکی است که با سطح دشواری 4 استخراج شده. از آنجایی که شروع این عدد همیشه الگوی یکسانی دارد، ما ترتیب شماره‌‌ها را معکوس و صفرهای اول را حذف می‌‌کنیم تا به مجموعه‌‌ای از اعداد برسیم که هیچکس نتواند به روش ویژه آن‌‌ها را انتخاب کند. این اعداد نتایج نهایی یک رایانش بزرگ هستند و صرفا یک شرایط تصادفی محسوب می‌‌شوند. در هر حال، ما این هش نهایی معکوس را می‌‌گیریم و دو تا دو تا شروع به خواندن ارقام می‌‌کنیم تا هنگامی که به 5 عدد 2 رقمی برسیم؛ در مثال بالا، این اعداد چنین خواهند شد:

54, 70, 33, 92, 10

به یاد دارید که 100 عملکرد ریاضیاتی مختلف در فهرست بالا وجود داشت؟ این مسئله به ما یک روش بسیار ساده برای همکاری با یک عملکرد مختلف نسبت به هر 100 امکان بین 00 تا 99 می‌‌دهد؛ هر کدام به یکی از 100 عملکرد می‌‌رود و از ترتیب بالا برای هر عملکرد استفاده می‌‌کند. این به آن معنا است که هر کدام از این عملکردها را می‌‌توان برای بلاک بعدی به کار گرفت؛ همه آن‌‌ها عادلانه هستند و استخراج‌‌کنندگان باید آماده رایانش سریع تمام آن‌‌ها باشند.

این تصویر تمام ظاهر استفاده از خروجی رنگارنگ نرم‌‌افزار استخراج اولیه را نشان می‌‌دهد:

MPMath

این مسئله 3 هش از 5 هش را به دلیل فضا، حذف می‌‌کند.

گاهی اوقات خوش‌‌شانس هستید و به نانسی بر می‌‌خورید که ویژگی‌‌های نادر مورد نظر شما را دارد: این که نتیجه نهایی ضرب همراه با یکدیگر خروجی‌‌های تمام این عملکردهای گزینشی تصادفی به تمام نتایج هش اِعمال و همه چیز با 1234 هم آغاز می‌‌شود.

اگر کامپیوترهای کافی به استخراج سکه بپردازند، این سطح دشواری به سطح بالاتری رفته و هش نهایی با 1234567891234567 آغاز می‌‌شود تا بلاک‌‌ها بیش از حد استخراج نشوند.

اینجا ظاهری که هنگام پیدا کردن نانس در نرم‌‌افزار مشاهده می‌‌کنید آمده‌‌ است:

MPMath

در پیدا کردن یکی از این نانس‌‌ها موفق باشید!

بار دیگر ما می‌‌توانیم به صورت پویا، دقت مورد نیاز برای تنظیم سختی استخراج بلاک‌‌های جدید به روش دیگر با استفاده از سطح دشواری را بالا می‌‌بریم:

MPMath

می‌‌توانیم رایانش مورد نظر را به دقت مطلوب خود برسانیم.

برای فهم بیشتر ظاهر یک استخراج‌‌کننده در عملیات، اینجا یک ویدئوی کوتاه استخراج‌‌کننده اولیه که بر روی یک آی‌‌فون اجرا شده، آمده است (انجام این مرحله آسان است، فقط کد مرتبط با بالای گیت‌‌هاب را کپی کنید و آن را در Pythonistaapp پیست کنید):

و اینجا نحوه عملکرد بر روی یک کامپیوتر ویندوزی آمده است:

بیایید کمی به عقب برگردیم و به معنای کل مسائل دقت کنیم. اکنون ما یک سیستم اثبات کار داریم که امنیت روش‌‌های قبلی را در خود دارد. این امنیت به واسطه وجود ایده اساسی روش‌‌های قبلی به عنوان جزء اولیه طراحی جدید می‌‌باشد.

اما سپس یک قدم اضافی بر‌‌ می‌‌داریم و دقت مطلق را برای مجموعه بزرگ و پیچیده الگوریتم‌‌ها به کار می‌‌گیریم. توجه کنید که افزودن تعداد عملکردها، مثلا از 100 تا 1000 چندان سخت نیست. پروژه‌‌های متن باز بزرگ دیگری هم هستند که با عملکردهای ریاضیاتی پر شده‌‌اند و از اعداد مطلق به عنوان ورودی استفاده می‌‌کنند و خروجی‌‌های عددی با هر سطح دقت مطلوب، شامل موارد زیر می‌‌سازند:

  • GAP Algebra System
  • CGAL Computational Geometry Library
  • SAGE Math System

بر خلاف استخراج بیت کوین که سخت‌‌افزار استخراج سرعت بالایی دارد و فقط با یک قطعه کوچک از تجهیزات، میلیاردها هش در ثانیه انجام می‌‌گیرد، سرعت این اثبات‌‌کار بارگذاری‌‌شده بسیار بسیار پایین‌‌تر است. در بهترین دستگاه روی‌‌میزی، فقط چند هزار تکرار در ثانیه صورت می‌‌گیرد. به همین خاطر می‌‌توانید چند هزار نانس را در ثانیه آزمایش کنید تا ببینید که کدام مورد به درستی کار می‌‌کند.

اما همه چیز به شانس بستگی دارد و باید دید کدام یک از این 5 عملکرد برای استفاده در بلاک انتخاب می‌‌شوند. رایانش برخی از عملکردها آسان و سریع است، معمولا به این خاطر که برخی از تغییر جهت‌‌های ورودی یا تقارن در عملکرد، امکان سادگی را فراهم می‌‌کند. دیگر عملکردها ممکن است نیازمند چرخه‌‌های CPU بالاتر برای انجام رایانش در دقت مورد نظر باشد. در چنین موردی، ممکن است بتوانید در یک دستگاه سریع، 10 یا 12 نانس به ازای ثانیه آزمایش کنید. با این حال اگر دستگاه‌‌های کافی استخراج را انجام دهند و سطح دشواری هم به اندازه کافی بالا باشد، زمان بین بلاک‌‌ها باید به میانگین طولانی برسد و به سادگی به یابنده نزدیک‌‌ترین هش نهایی که بعد از دوره مشخصی، بدون استخراج بلاک جدید دیگر معتبر نیست، برسد.

چیزی که کمی تعجب‌‌آور است (حداقل برای من)، این است که این نرم‌‌افزار با سرعت بسیار بالا و با کمک نرم‌‌افزار Pythonista موجود در اپ‌‌استور آی‌‌او‌‌اس در آی‌‌فون اجرا می‌‌شود. دیدن اسب‌‌بخار رایانشی موجود در جیبمان بسیار هیجان‌‌انگیز است اما از نظر اثبات کار هم بدون استفاده باقی مانده (حداقل توسط پروژه‌‌های مشهور!). با دیدن اجرای این نرم‌‌افزار می‌‌توانم دنیایی را تصور کنم که در آن افراد پیش از خواب، یک نرم‌‌افزار استخراج را در گوشی‌‌های هوشمند خود باز کرده و صبح با کسب چند سکه در ازای شرکت در امنیت شبکه، روز خود را شروع می‌‌کنند.

در هر حال حیف نیست که این گوشی‌‌های پیشرفته که به کامپیوترهایی تبدیل شده‌‌اند، وقتی ما می‌‌خوابیم کار خاصی انجام ندهند؟ یک شبکه نامتمرکز توزیع‌‌یافته از استخراج‌‌کنندگان با زمان اندک که از لپ‌‌تاپ‌‌ها و گوشی‌‌های خود، استفاده بسیار بیشتری از ایمن‌‌کردن یک ارز رمزنگاری شده‌‌ انجام می‌‌دهند و در این شبکه تمام شرکت‌‌کنندگان تحت تاثیر Bitman و دولت چین قرار ندارند.

افرادی هم هستند که اعتراض خواهند کرد: اما می‌‌توانی یک ASIC برای هر الگوریتمی که بخواهی تولید کنی! پاسخ من به آن‌‌ها این است، بگذارید مردم تلاش کنند. در ابتدا، ساخت ASIC برای سیستم توضیح‌‌داده‌‌شده نسبت به یک سیستم سنتی اثبات کار مثل بیت کوین و زی‌‌کش، هزینه و دشواری بیشتری خواهد داشت. چرا یک شرکت مثل Bitman باید یک الگوریتم جدید مثل این را به کار بگیرد و پول بیشتر و سود سریعتر را از دست دهد و در همین حال هزینه R&D برای توسعه یک ASIC جدید را به سرعت به دست آورد؟ این همانند همان جوکی است که در یک جنگل با دوست خود قرار گرفته‌‌اید و یک خرس به شما حمله می‌‌کند: شما نباید سرعت بالاتری نسبت به خرس داشته باشید، فقط باید سریع‌‌تر از دوستتان بدوید!

اما من کمی بیشتر از این هم پیش می‌‌روم. فکر می‌‌کنم سیستمی که بالا توضیح دادم، به خوبی عمومی شده (به عنوان مثال با قرار دادن یک فهرست پویا و رو به رشد از عملکردهای ریاضیاتی فراتر از 100 عملکرد که در حال حاضر تعریف شده) و می‌‌تواند همیشه از خرس هم جلو بزند. از آنجایی که من فکر می‌‌کنم برای گرفتن یک تراشه ASIC که می‌‌تواند فهرست بلندبالایی از وظایف رایانشی را انجام دهد (و همچنین دقت مطلق)، نیازمند ترانزیستورها و دروازه‌‌های منطقی و همچنین زمان و انرژی بهترین طراحان و مهندسان تراشه خواهید بود، نهایتا به چیزی می‌‌رسید که اساسا مشابه هدف اصلی پردازنده می‌‌باشد. در این نقطه بهتر است یک پردازنده اصلی تولید کنید تا بتوانید از نظر اقتصادی مقیاس ساخت تعداد زیادی جزء مشابه در بازارهای متعدد را به دست آورید (مثل گوشی‌‌های هوشمند، تبلت، تلویزیون و غیره) که این مسئله همان نحوه ساخت تاریخی بازارها می‌‌باشد.

اما حتی اگر من اشتباه کنم و تولیدکنندگان ASIC بتوانند یک روش زیرکانه‌‌تر برای اِعمال این تراشه‌‌های مقرون به صرفه پیدا کنند، پیاده‌‌سازی‌‌ها چه خواهد بود؟ این مسئله به آن معنا است که Bitman یا رقبایش به روشی برای ساخت چیپ و اجرای یک آرایه وسیع از رایاش‌‌های مهندسی سودمند با هزینه و انرژی بسیار پایینتر نسبت به رایانه‌‌های سنتی رسیده‌‌اند. و با اینکه شاید از بازگشت Bitman به قدرت و سلطه بازاری ناراحت شوم، برای دنیا خوب خواهد بود که تراشه‌‌های ارزان و قدرتمند برای انواع محاسبات سودمند داشته باشند. به این موضوع به عنوان روشی برای مهار تمام این ثروت‌‌ها و اختراع کالاها و همچنین تقویت امنیت شبکه نگاه کنید.

کاربران از مشاهده بازگشت به زمانی که استخراج، دامنه‌‌ای از اپراتورهای متخصص نبود و همچنین فضایی که در آن حتی کاربران جدید و افرادی که در زمینه فنی سررشته‌‌ای ندارند هم بتوانند از منابع رایانشی خود استفاده کنند و به سکه‌‌های قابل‌‌توجهی دست یابند، هیجان‌‌زده خواهند شد؛ حداقل اگر خیلی زود در توسعه پروژه شرکت کنند چنین حالتی خواهند داشت!

شاید از این مطالب هم خوشتان بیاید.

ارسال پاسخ

آدرس ایمیل شما منتشر نخواهد شد.