بلاکچین(Blockchain) یکی از تکنولوژیهایی است که این روزها محبوبیتش رو به افزایش است. هدف اصلی آن غیرمتمرکز کردن فعالیتهاست و یک جامعه، خود بتواند شبکه را مدیریت کند. برای مثال در یک شبکه اجتماعی متمرکز، تمامی پردازشها و ذخیره دادهها روی سرورهای شرکت انجام میشود. بنابراین کنترل این دادهها کاملاً در اختیار شرکت است و میتواند درصورت درخواست خودش یا دولت دادههای مربوط به کاربران را بدون اجازه آنها اضافه، حذف یا ویرایش کند. ولی با استفاده از بلاکچین میتوان شرایطی را فراهم کرد که این کنترل مرکزی حذف شود و افراد، خود دادههای خود را مدیریت کنند و هیچ دادهای نتواند بدون اجازه تغییر کند. توجه کنید که مفهوم غیرمتمرکز با توزیعشده متفاوت است. دادههای یک شبکه اجتماعی میتوانند روی چندین سرور به شکل توزیعشده باشند ولی همچنان دادههای تمام سرورها توسط شرکت قابل ویرایش است. درحالیکه در بحث غیرمتمرکز بودن، هدف حذف این کنترل مرکزی است.
بلاکچین در حوزههای متعددی کاربرد دارد و روزبهروز برای کاربردهای جدیدی از آن استفاده میشود. بعضی از این حوزهها عبارتند از شبکههای اجتماعی، به اشتراکگذاری پروندههای پزشکی افراد، رایگیری، ثبت مدارک و اسناد و…. البته قطعاً شناختهشدهترین و محبوبترین کاربرد آن تا به امروز که موجب شناخت بیشتر آن در میان مردم شد، رمزارزها (crypto currencies) و به خصوص رمزارز بیتکوین (Bitcoin) است. در این مقاله میخواهیم یک آشنایی با بلاکچین و ساختار آن و کاربرد آن داشته باشیم که برای ملموس شدن موضوع به طور خاص آن را در حوزه رمزارزها و رمزارز بیتکوین بررسی میکنیم. بنابراین تمام مباحثی که در ادامه مطرح میشود الزاماً به ساختار بلاکچین مربوط نمیشود ولی تا حد امکان سعی میشود تا بخشهای اختصاصی بیتکوین و رمزارزها نسبت به بقیه مباحث بلاکچین تمیز داده شود.
مقدمهای بر بیتکوین
بیت کوین یک رمزارز محبوب در دنیای رمزارزهاست که توسط فردی ناشناس با نام مستعار Satoshi Nakamoto توسعه داده شده و پس از مدتی آن را برای نگهداری و بهروزرسانی به جمعی از متخصصان حوزه بلاکچین سپرده است. کد بیتکوین با زبان C++ ولی تستهای مربوط به آن با زبان Python نوشته شده و اکنون به شکل کد باز در گیت هاب از اینجا قابل دسترس است. همه برنامهنویسان سراسر جهان میتوانند کد آن را خوانده و در توسعه آن مشارکت کنند ولی برای تغییرات عمده باید در یک ریپازیتوری دیگر به نام BIPS (Bitcoin Improvement Proposals) جزئیات طرح خود را تحت عنوان یک BIP جدید شرح دهند و پس از مشورت دیگر برنامهنویسان و در صورت تأیید طرح، میتوانند به پیادهسازی آن در ریپازیتوری اصلی بیت کوین اقدام کنند.
مسأله
برای تشریح بیشتر بیتکوین و رمزارزها ابتدا به مسألهای که سبب پیدایش آنها شد میپردازیم. مسأله نگهداری و انتقال پول از گذشته تاکنون دستخوش تغییرات بسیاری شدهاست. در دنیای فعلی پولها عموماً یا به صورت اسکناس یا مجموعهای از اعداد و تراکنش در پایگاهدادههای بانکها در دسترس هستند. بنابراین این پولها هم در مسأله «خلق پول» و هم «انتقال پول» وابسته به دولتها هستند و عملاً در استفاده از آنها نیازمند اعتماد به دولتها هستیم. بنابراین تلاشهایی انجام شد تا به شکلی کنترل خلق پول و انتقال پول در کنترل یک قدرت مرکزی نباشد و خود مردم بتوانند آن را مدیریت کنند.
بنابراین هدف این بود که تراکنشهای انتقال پول دست یک قدرت واحد نباشد. یکی از اولین راههایی که به ذهن میرسد، این است که پولها به صورت فایلهایی باشند و توسط خود افراد از طریق ارتباط همتا به همتا (P2P) منتقل شود. ولی بزرگترین مشکل در این حالت این است که هر فایل مجموعهای از صفر و یکهاست و به راحتی میتواند کپی شده و یک پول دوبار خرج شود(Double Spending). بنابراین ناگزیر باید تراکنشها را ثبت کنیم تا اطمینان حاصل شود یک پول دوبار خرج نشود. برای اینکه نمیخواهیم یک نفر کنترل کاملی روی تراکنشها داشته باشد، این تراکنشها را باید در قالب یک Ledger (دفتر حساب) تمام افراد شبکه داشته باشند و البته از طریق ارتباط P2P محتوای لجر خود را با دیگران به اشتراک بگذارند تا همه از تراکنشهای جدید آگاه باشند.
برای اینکه یک تراکنش در لجر معتبر باشد و نتوان تراکنشی اضافه کرد که پولی را بدون اجازه از یک حساب شخص خارج کند، بیتکوین از امضای دیجیتال۱ استفاده کرده است. به این صورت که هر اکانت از یک جفت کلید عمومی و خصوصی تشکیل شدهاست که آدرس حساب هر فرد، هش کلید عمومی اوست و برای اینکه یک تراکنش معتبر باشد، باید فرستنده آن را با کلید خصوصی خود امضا کند.
با استفاده از امضای دیجیتال میتوان صحت تراکنشها را تشخیص داد ولی همچنان ممکن است فردی یک تراکنش قدیمی را در لجر خود حذف کند که باعث میشود لجرها با یکدیگر متفاوت شوند و نتوان تشخیص داد کدام لجر واقعاً معتبر است. برای این منظور مفهوم بلاکچین مطرح شد.
بلاکچین
به طور ساده، یک بلاکچین(زنجیره بلاک) یک لیست پیوندی است که hash هر بلاک باید در ابتدای بلاک بعدی وجود داشته باشد. با استفاده از این تکنیک، تغییر دادههای قدیمی به شدت سخت میشود. چون تغییر در یک بلاک باعث تغییر هش آن میشود و بنابراین باید مقدار هش در بلاک بعدی نیز آپدیت شود که خود باعث بروز تغییر در آن بلاک و در نتیجه تغییر هش آن میشود و به همین شکل باید از آن بلاک تا انتهای زنجیر تمام بلاکها آپدیت شود که هم باعث راحتتر دیده شدن تغییرات میشود و هم اینکه در صورتی که اضافه کردن بلاک جدید به راحتی ممکن نباشد، کار بسیار سخت میشود. بیتکوین برای این منظور از هش SHA-256 استفاده میکند. در هربلاک میتواند مجموعهای از تراکنشها نگهداری شود تا از آنها در مقابل تغییرات محافظت کنیم.
برای رعایت بحث نامتمرکز بودن قدرت، تمامی افراد باید کل بلاکچین را نگهداری کنند(بنابراین بدیهی است که تمامی تراکنشها در شبکه بلاکچین برای افراد شفاف است ولی چون آدرس حسابها با استفاده از یک شماره مشخص میشوند که اطلاعات بیشتری همراه خود ندارد، کسی نمیتواند بفهمد که صاحب این حساب کیست. ). این بلاکچین باید بین افراد یکسان باشد. ولی در شبکه P۲P تأخیر در ارسال دادهها وجود دارد که باعث میشود ترتیب دریافت اطلاعات تراکنشها بین افراد مختلف تغییر کند که باعث تغییر بلاکها و هشهای آنها میشود و مانعی برای یکسان بودن بلاکچینها در شبکه میشود.
ماینینگ
برای حل مشکل بلاکچین یکسان در شبکه تراکنشها میتوانند در دو بخش نگهداری میشوند. در ابتدا دادههای جدید در یک بخش موقت (در بیت کوین MemPool) نگهداری میشوند و هربار یک نفر در شبکه انتخاب میشود تا MemPool خود را پس از اعتبارسنجی تراکنشها در قالب یک بلاک بستهبندی کند و به انتهای بلاکچین اضافه کند. سپس به دیگران بلاک جدید خود را ارسال میکند تا آنها نیز پس از اعتبارسنجی بلاک، آن را به انتهای بلاکچین خود اضافه کنند. با توجه به امضای دیجیتال امکان جعل تراکنش اشتباه وجود ندارد و اگر هم کسی تراکنشی را نادیده بگیرد، در نوبت بعدی که یک فرد دیگر برای اضافه کردن بلاک جدید به بلاکچین انتخاب میشود، میتواند آن را به بلاک بعدی اضافه کند. با این حال باید انگیزهای به وجود بیاوریم تا افراد هم علاقهمند به ساخت یک بلاکجدید شوند و هم سعی کنند اعتبارسنجی درستی قبل از ساخت بلاک انجام دهند و به دنبال تقلب نباشند. بنابراین به یک مکانیسم تشویق نیاز داریم.
در بیت کوین این تشویق از دو طریق ایجاد میشود:
- به ازای هر تراکنش موجود در بلاک جدید مقداری کارمزد از مبلغ تراکنش به سازنده بلاک ارسال میشود.
- سازنده بلاک میتواند یک تراکنش خلق پول با مقداری مشخص به حساب خود در انتهای لیست تراکنشهای بلاک اضافه کند. این امر به غیرمتمرکز بودن فرآیند خلق پول نیز کمک میکند. مقدار تراکنش خلق پول در زمان نگارش این مطلب، ۶.۲۵ بیتکوین است و به طور متوسط هر ۴ سال یکبار این مقدار نصف میشود که به این فرآیند Halving گفته شود. پیشبینی میشود تا سال ۲۱۴۰ تمام بیتکوینهای ممکن خلق شوند و پس از آن فقط از کارمزد تراکنشها به سازندگان بلاک سود پرداخت شود.
با توجه به جایزهای که برای ساخت بلاک جدید در نظر گرفته شده است، طبیعتاً افراد به دنبال ساخت بلاک جدید و دریافت جایزه هستند. بنابراین سعی در تقلب در تراکنشها نمیکنند تا افراد دیگر این بلاک را تأیید کنند و بتوانند جایزه خود را دریافت کنند. به علاوه نمیتوان فرد سازنده بلاک را به طور تصادفی انتخاب کرد چون با توجه به ناشناس بودن در دنیای بیتکوین، هر فرد میتواند تعداد زیادی گره در شبکه راهاندازی کند تا شانس بیشتری برای انتخاب شدن داشته باشد. به همین منظور نیازمند یک «الگوریتم اجماع» هستیم تا براساس آن این فرد انتخاب شود. الگوریتمهای متعددی توسط بلاکچینهای مختلف استفاده میشوند. بیتکوین از الگوریتمی تحت عنوان Proof of Work (PoW) یا اثبات کار استفاده میکند. در این الگوریتم شانس افراد برای انتخاب شدن وابسته به هزینهای است که با استفاده از توان پردازشی خود میپردازند. ساتوشی ناکاموتو این طرح را باایده ۱CPU-1Vote مطرح کرد. در این حالت اگر افراد به دنبال راهاندازی گرههای زیاد برای افزایش شانس خود باشند، نیاز به CPUهای زیاد و مصرف برق زیاد دارند که باعث میشود سود دریافتی از جایزه ساخت بلاک با هزینه صرف شده برای انجام پردازشهای مدنظر متناسب باشد و همچنین فرد نتواند به هرتعدادی که میخواهد گره جعلی راهاندازی کند.
در بیت کوین برای اینکه این پردازش CPU را بتواند اندازهگیری کند و برمبنای آن فرد انتخاب شود، یک مسأله خاص برای آن طراحی شدهاست. در این مسأله، هر فرد آزادانه امکان ساخت بلاک جدید را دارد، مشروط به آن که هش بلاک جدید حتماً از مقدار مشخصی به نام Target Hash کمتر باشد. برای اینکه بتوان هش بلاک را تغییر داد تا به مقدار مناسب رساند، افراد میتوانند یک مقدار دلخواه به نام Nonce را به بلاک خود اضافه کنند. با توجه به ویژگیهای هشها برقراری این شرط با استفاده از تغییر nonce روش مشخص و سادهای ندارد. بنابراین افراد مجبورند nonce را مدام تغییر دهند تا یکبار به طور تصادفی هش بلاک کمتر از Target Hash شود. این آزمون و خطا برای هربار تغییر nonce و محاسبه مقدار جدید هش نیازمند پردازش زیاد توسط cpu است و افرادی که توان پردازشی بیشتری داشته باشند امکان آزمون و خطای بیشتری در رقابت با دیگر افراد دارند تا nonce مناسب را پیدا کنند و با استفاده از آن بلاک جدید خود را بتوانند به بلاکچین اضافه کنند. که به این فرآیند در اصطلاح «ماین کردن» گفته میشود. سختی شبکه (Network difficulty) پارامتری است که گاهاً با Target Hash اشتباه گرفته میشود و بیانگر سختی پیداکردن nonce مناسب است. سختی شبکه با Target Hash رابطه عکس دارد و با تغییر Target Hash میتوان آن را تنظیم کرد. بیتکوین مقدار سختی شبکه را مدام به گونهای آپدیت میکند که ماین کردن بلاک جدید تقریباً هر ۱۰ دقیقه یکبار انجام شود.
زنجیره معتبر
با توجه به اینکه شبکه به صورت P2P است و در آن تأخیر وجود دارد، ممکن است دو نفر در زمان تقریباً یکسان یک بلاک جدید ماین کنند در حالیکه از ماین شدن بلاک توسط یکدیگر هنوز خبردار نشدهاند. در این حالت اعضای شبکه بلاک مربوط به فردی که زودتر خبرش به آنها برسد را به بلاکچین خود اضافه میکنند و در اصطلاح بلاکچین fork میشود و به دو بلاکچین مجزا تقسیم میشود که عملکرد سیستم را دچار اختلال میکند. سیاستی که بیتکوین برای این منظور در نظر گرفته این است که به این دو بلاکچین اجازه دهد تا چند بلاک دیگر پیشروی کنند و در نهایت موقعی که خبر بلاکچین دیگر به گوش افراد برسد در انتخاب میان این دو بلاکچین، بلاکچین طولانیتر را انتخاب میکنند و دیگری را دور میاندازند. بنابراین احتمال کمی وجود دارد که افراد پس از ماین کردن یک بلاک و اضافه کردن آن به بلاکچین، بلاکشان از بلاکچین سیستم خارج شود و جایزه خود را از دست بدهند. البته تقریباً پس از گذشت حداقل ۶ بلاک میتوان با درصد بالایی مطمئن شد که دیگر این زنجیر مطمئن است و امکان از دست رفتن آن وجود ندارد. به همین دلیل توصیه میشود پس از تراکنشهای مهم حداقل ۶ بلاک منتظر ماند تا از ثبت ماندن تراکنش در بلاکچین اطمینان حاصل شود.
در صورتی که عدهای از افراد با توان پردازشی ۵۱ درصد شبکه با هم تبانی کنند میتوانند قدرت برتر در تعیین زنجیره اصلی باشند و تراکنشهایی را نادیده بگیرند که در این حالت گفته میشود «حمله ۵۱ درصد» رخ داده و از خطراتی است که شبکه بلاکچین را تهدید میکند. البته ممکن است خود افراد نیز به دنبال چنین چیزی نباشند. زیرا ارزش رمزارزها فقط وابسته به اعتماد مردم است و در این حالت رمزارز به شدت افت میکند و بیارزش میشود.
تغییرات بیت کوین در گذر زمان
سختافزارهای ماینینگ
بیتکوین در ابتدا با این هدف توسعه یافت که فرآیند ماینینگ برروی CPUها انجام شوند و قاعده ۱CPU-۱Vote رعایت شود. ولی به تدریج از این موضوع فاصله گرفت. پس از مدتی عدهای به سراغ GPUها رفتند تا بتوانند با توجه به ساختار خاص GPUها با سرعت بیشتری هش SHA-۲۵۶ را محاسبه کنند و CPUها به حاشیه رفتند. سپس عدهای برای سرعت سریعتر از GPU به سراغ سختافزارهای قابل برنامهریزی FPGA رفتند که میشد آنها را برنامهریزی کرد که با قدرت بالاتر SHA-۲۵۶ را محاسبه کنند. و در نهایت نیز سختافزارهای اختصاصی ASIC به وجود آمدند که به طور اختصاصی برای محاسبه سریع SHA-۲۵۶ طراحی شدند. بنابراین امروزه عملاً ماینینگ بدون استفاده از سختافزارهای ASIC به صرفه نیست.
Mining Pool
با افزایش رقابت برای ماین کردن، به مرور زمان استخرهای ماین (Mining Pools) به وجود آمدند. در این استخرها یک فرد به عنوان مالک استخر، ساختار بلاک جدید را تشکیل میدهد و محدوده nonceهای مختلف را بین افراد عضو استخر تقسیم میکند تا همه اعضا به کمک هم سعی در پیدا کردن nonce مناسب کنند. درصورتی که یک فرد توانست nonce را پیدا کند، مالک استخر جایزه را میگیرد و عموماً یک درصد جایزه را خود برمیدارد و بقیه را به نسبت توان پردازشیای که هرکدام در استخر هزینه کردند بین افراد تقسیم میکند. بنابراین حتی افرادی که در پیداکردن nonce کمک کرده بودند ولی خود نتوانستند nonce مناسب را پیدا کنند نیز جایزه میگیرند. امروزه با گسترش استخرهای ماین، عملاً یک فرد تنها، بدون عضویت در یک استخر شانسی برای ماین کردن یک بلاک در این رقابت شدید ندارد.
Wallet
با توجه به اینکه هر فرد برای ایجاد حساب و کار با رمزارزها نیاز به راهاندازی یک نود دارد که نیازمند نگهداری کل بلاکچین روی سیستم و مصرف اینترنت بالاست، عدهای تصمیم گرفتند خود یک نود راهاندازی کنند و رابطی فراهم کنند تا افراد بتوانند از طریق ارتباط با آنها حساب جدید ایجاد کرده و تراکنشهای خود را انجام دهند. به این سیستمها در اصطلاح کیف پول (Wallet) گفته میشود.
انتقادات به PoW
انتقادات زیادی البته به الگوریتم PoW وارد است که این الگوریتم باعث اتلاف انرژی و آسیب به محیط زیست برای حل مسألهای بیهوده میشود. ولی عدهای معتقدند که این موضوع برای امن کردن شبکه استفاده میشود و در مقابل انرژی مورد مصرف در ساختار سیستمهای بانکی و شعبههای آنها، این مقدار ناچیز به نظر میرسد.
- رمزنگاری دادهها به دو شیوه متقارن و نامتقارن میتواند انجام شود. در شیوههای رمزنگاری متقارن یک داده با یک کلید(رمز عبور) رمز میشود و برای اینکه از حالت رمزشده خارج شود مجدداً از همان کلید استفاده میشود. ولی در شیوههای رمزنگاری نامتقارن دو کلید عمومی و خصوصی متفاوت وجود دارند که کلید عمومی در دسترس همه قرار دارد و کلید خصوصی را فقط فردی که میخواهد داده را رمز کند نگهداری کند. این دو کلید به گونهای طراحی شدهاند که اگر داده با هرکدام از آنها، رمز شود فقط با کلید دیگر امکان خارج کردن آنها از حالت رمزشده وجود دارد. این موضوع کاربردهای متعددی دارد که یکی از آنها امضای دیجیتال است. به این صورت که فرد برای اثبات این که داده از طرف اوست میتواند داده را با کلید خصوصی خود رمز کند و افراد دیگر در صورتی که توانستند با کلید عمومی او آن را رمزگشایی کنند مطمئن میشوند که او صاحب اصلی دادههاست، چون فقط اوست که کلید خصوصی را در اختیار دارد.