برای فهم بهتر نحوهی عملیات بلاکچین، بهتر است قدم به قدم فرایندی را که یک تراکنش طی میکند، دنبال کنیم.
به گزارش گرداب، انتقال رمزارز (در این مثال بیتکوین) از کاربر شمارهی ۱ به کاربر شمارهی ۲ فرایندی طی میکند که برای انجام انجام هر تراکنش بر روی بلاکچین باید انجام بگیرد.
مرحلهی اول: کیف پول بیتکوین
اولین کاری که کاربر شمارهی ۱ باید انجام دهد، انتخاب یک کیف پول بیکوین است. بیکوین پروتکلی است که از طریق یک نرمافزار قابل دسترسی است. در حال حاضر کیف پولهای متعدد بیتکوین وجود دارد (مانند Bitcoin core و یا نمونهی رایجتر در ایران trust wallet). همان طور که مرورگرهای مختلفی در اینترنت وجود دارد (مانند کروم، فایرفاکس، اوپرا و ...) کیفپولهای متعددی نیز وجود دارد.
انتخاب از میان نرمافزارهای متعدد کیف پول بیتکوین بستگی به میزان تخصص کاربر و ویژگیهایی دارد که هرکدام ارائه میدهند. پس از بارگیری و نصب کیف پول بیتکوین، کاربر در صفحهی اصلی برنامه صفحهای را مشاهده میکند که حساب او و آدرس کیف پول بیتکوین (ترکیبشده از رشتهای گسترده از حروف و اعداد) را نشان میدهد. آدرس بیتکوین از نظر امنیتی حساسیت چندانی ندارد و مانند آدرس ایمیل است. میتوان آن را با کاربران دیگر به اشتراک گذاشت و اگر کسی بخواهد بهطور مستقیم بیتکوین به کیف پول شما وارد کند، باید آدرس کیف پول خود را در اختیار او قرار دهید.
مرحلهی دوم: عناصر اصلی تراکنشها
میتوان بیتکوین را به عنوان یک دفترکل حسابداری با مدخل دوگانه تصور کرد؛ از یک طرف ما یک یا چند «ورودی» مطابق با بدهیهای آن حساب داریم و از طرف دیگر با یک یا چند «خروجی» طرف هستیم که مانند اعتبار به حساب اضافه میشود. اما به هر حال بر روی بلاکچین به معنی دقیق کلمه هیچ «حسابی» وجود ندارد؛ بلکه فی الواقع چیزی که در بلاکچین با آن سروکار داریم با مفهوم «حساب» در معنای چیزی که در سپردههای بانکی با آن طرف هستیم، بسیار تفاوت دارد.
در بلاکچین به جای یک حساب منفرد، شاهد قسمتهای متعدد سرمایههای کریپتو هستیم که UTXO نام دارد. این واژه مخفف خروجی هزینه نشدهی تراکنش است. UTXOها اجزای پایهی یک تراکنش بر بلاکچین میباشند؛ اجزای تقسیمناپذیر بیتکوین که به مالکی یکسان متعلق هستند و به عنوان واحد اعتبار در سراسر شبکه شناخته میشوند.
هرگاه که یک تراکنش تائید میشود، سکههای مصرف شده از پایگاه دادهی UTXO حذف میشود، اما سابقهی چنین سکههای مصرف شدهای همچنان بر روی دفتر کل باقی میماند. تراکنشهای بیتکوین از این رو بیشتر شبیه دسته چک است. به طور مثال اگر نیاز به هزینهای معادل ۱ BTC باشد، الگوریتم ممکن است ۰.۴ BTC از یک بایت داده بردارد و ۰.۶ از بایت دادهی دیگر.
هر تغییر در خروجی این قسمتها به پایگاهدادهی UTXO فرستاده میشود که در آن همهی سوابق تغییر تراکنشهای بیتکوین نگهداری میشود. از این رو میزان بیتکوین در حساب یک کاربر چیزی بیش از خلاصهی همهی UTXOهایی که به آن کاربر تعلق دارد، نیست که تنها میتواند توسط کلید خصوصی همان کاربر مورد استفاده قرار گیرد.
فلسفهی پشت UTXOها این است که میزان خالص سکههای کوچک که شبکهی بیتکوین را میسازند، باعث میشود تراکنشهای مشخصی بدون سود باشد و هزینهی تراکنش ممکن است بیشتر از هزینهی واقعی خریداری محصول با بیتکوین باشد.
ورودی و خروجی و کارکرد هش
هنگامی که کاربر کیف پول بیتکوین را بارگیری و نصب کند، آمادهی انتقال و دریافت بیتکوین میشود. او برای انتقال بیتکوین تنها نیاز به دو عدد ورودی دارد: آدرس کیف پول گیرنده و میزان بیتکوینی که ارسال میشود. برای انجام تراکنش به شیوهی درست و در زمان مقرر، برنامهی کیف پول کاربر مقدار اندکی به عنوان هزینهی تراکنش دریافت میکند که توسط یک استخراجکننده به عنوان کارمزد تائید تراکنش و گنجاندن آن در بلوک جمعآوری میشود.
نیاز به گفتن نیست که رمزارزهایی مانند بیتکوین اقدامات امنیتی بسیار مستحکمی ایجاد کردهاند تا از دستکاری کاربران در سامانه جلوگیری کنند. اما به هر حال، برخلاف ارزهای فیات (ارزهای ثابت مانند ریال، دلار و یورو)، رمزارزها دارای یک قدرت مرکزی نیستند که تامین مالی را نظارت کند و اقدامات ضد پولشویی داشته باشد. برای جبران نبود چنین نهاد بازدارندهای، رمزارزها، همان طور که نام آنها نیز به آن اشاره دارد، از رمزنگاری بسیار پیشرفتهای استفاده میکنند.
رمزنگاریای که در بلاکچین استفاده میشود، بر هشها و توابع هش متکی است. هش یک تابع ریاضیاتی است که ورودیای را دریافت میکند و آن را به رشتهای از حروف و اعداد که «دایجست» نام دارد، تبدیل میکند. یک تابع هش به طور بنیادی سه خاصیت دارد: ۱- ورودی آن میتواند به یک رشته در هر اندازهای تبدیل شود. ۲- فرایند آن یک خروجی با اندازهی ثابت دارد. ۳- بهطور موثری محاسبهپذیر است؛ بدین معنا که شما میتوانید خروجی را در یک زمان معقول محاسبه کنید).
برای این که یک تابع هش از نظر رمزنگارانه ایمن باشد، باید این ویژگیها را داشته باشد: ۱- مقاومت در برابر برخورد (برخورد هنگامی رخ میدهد که دو ورودی مجزا خروجی یکسانی داشته باشند)، ۲- مخفی بودن (ویژگی مخفی بودن بدین معناست که اگر ما خروجی یک تابع هش را داشته باشیم، راه سادهای وجود ندارد برای این که بفهمیم ورودی چه بوده است.) و ۳- معماپذیر بودن.
شبکهی بیتکوین از تابع هش SHA-۲۵۶ استفاده میکند که نخست توسط اناسای (آژانس امنیت ملی آمریکا) توسعه داده شد و یک ورودی ۷۶۸ بیتی را دریافت میکند و یک خروجی ۲۵۶ بیتی تحویل میدهد.
بهطور خلاصه، وقتی که یک کاربر میخواهد تراکنشی انجام دهد، قبل از ارسال آن به شبکه باید فرایندهای زیر را انجام داده باشد:
۱. رشتهای از حروف و اعداد از تراکنش (دایجست) با استفاده از تابع هش بسازد.
۲. این دایجست را با استفاده از کلید شخصی خود امضا کند.
۳. و در نهایت کلید عمومی گیرنده را اضافه بکند.
در نتیجه ورودی، خروجی یک تراکنش (یعنی یک کد) به شکل رشتهای از حروف و اعداد رمزگذاریشده در زبانی کدنویسی ساخته میشود که بهطور مشخص برای بیتکوین توسعهداده شده است. این زبان اسکریپت (Script) نام دارد. اسکریپت پیامی این چنین میدهد که «این خروجی قابل پرداخت به هرکسی است که بتواند یک امضا از کلید آدرس عمومی گیرنده ارسال کند.» و تنها گیرنده است که کیف پولی با کلیدی اینچنین دارد. از این رو فرستنده خروجی را با امضایی از کیف پول گیرنده محدود کرده است و تنها کیف پول گیرنده امضای دیجیتالی لازم برای دریافت این خروجی را دارد.
بسیار اهمیت دارد که در ذهن داشته باشیم که آدرس ذکر شده (آدرس گیرنده) یک تابع هش از کلید عمومی است (یعنی یک دایجست که با استفاده از تابع هش ساخته شده) و از این رو به صرف داشتن آدرس نمیتوانیم بفهمیم که کلید عمومی آن کاربر چیست.
هنگامی که تراکنش تائید شد، غیرقابل برگشت است و بر روی شبکهی نظیر به نظیر بیتکوین منتقل میشود. هر گره شبکهی بیتکوین که یک تراکنش جدید تائید شده دریافت کند، آن را از طریق مکانیسم انتشاری که فلودینگ یا به اصطلاح اشغال شبکه نام دارد، برای سایر گرهها که به آنها متصل است، ارسال میکند.
تائید تراکنش
تراکنش به جزئی از بلاکچین تبدیل نمیشود مگر زمانی که مورد تائید قرارگرفته و در یک بلوک از طریق فرایندی که ماینیگ یا استخراج نام دارد، گنجانده شود.
نخستین مرحله، تائید تراکنش است که میتواند توسط هر گره از شبکه انجام شود. هدف از این غربالگری اولیه، اجتناب از انتشار تراکنشهای نامعتبر در شبکه است. گرهها معیارهای متعددی را برای ارزیابی صحت و اعتبار یک تراکنش دنبال میکنند که بهطور مثال شامل درست بودن ساختار داده و ترکیب آنها، اندازهی سایز در بایتها و فهرست ورودیها و خروجیهاست.
مهمتر از هرچیز گرهها بررسی میکنند که آیا برای هر ورودی یک خروجی مرتبط وجود دارد یا نه، و این گونه از پدید آمدن مشکل پرداخت مجدد جلوگیری میکنند. پس از این تائید تراکنش و قبل از انتشار آن در شبکه، هر گره یک استخر معتبر (اما تائیدنشده) از تراکنشها را ایجاد میکند که «استخر تراکنش» یا «استخر حافظه» نام دارد؛ جایی که تراکنشها در آنجا در انتظار گنجانده شدن در یک بلوک هستند.
فرایند تائید اکنون وارد مرحلهی دوم خود میشود که با عنوان «استخراج» یا «ماینینگ» شناخته میشود. در این مرحله، تراکنش در درون یک بلوک حفر میشود. بعضی از گرهها بر روی شبکه گرههای تخصصی هستند که ماینر یا استخراجکننده نام دارند. درحالی که تراکنش در حال انتشار بر روی شبکه است، هر استخراجکننده میتواند تصمیم بگیرد که با سایر استخراجکنندگان رقابت کند و تلاش کند معمای ریاضی را برای تائید تراکنش و دریافت جایزه حل کند.
بهترین شیوه برای فهمیدن این فرایند پیچیده و دشوار که در بنیاد تراکنشهای بلاکچین قرار گرفته است، دنبال کردن این سه سوال اساسی است که:
۱. استخراجکنندگان چه کسانی هستند؟
۲. چه نوع پاداشی از فعالیت استخراج دریافت میکنند؟
۳. استخراج چه هدفی دارد؟
۴. استخراجکنندگان چگونه تراکنشها را تائید میکنند و معتبر میسازند؟
در پاسخ به سوال نخست، باید گفت که در روزگار نخستین پدید آمدن بلاکچین، استخراج بیشتر توسط کاربران در خانه و از طریق رایانههایشان انجام میشد و تنها نیاز به سیپییو (واحد مرکزی پردازشگری) ساده داشت. وقتی که این سیستم مدام پیچیدهتر شد، معماهای ریاضی نیز نیاز به نیروی محاسباتی بیشتری داشتند و فعالیتهای استخراج به عهدهی استخرهای ماینینگ (یعنی گروهی از استخراجکنندگان) قرار گرفت که از مدارهای مجتمع با کاربرد خاص (ASIC) بسیار قدرتمند از یک سیپییوی عادی استفاده میکنند؛ این تجهیزات بسیار گران قیمت هستند و مصرف برق بسیار زیادی دارند و از این رو نیاز به سرمایهگذاری کلان دارند.
استخراجکنندگان از اینرو گرههای هوشمندی هستند که میتوانند بر یک سیستم با نیروی محاسباتی قدرتمند حساب بازکنند و برای تائید تراکنشها با حل معماهای پیچیدهی ریاضی تخصص لازم را دارند.
اکنون به پاسخ به سوال دوم میپردازیم. مسلما استخراجکنندگان برای انجام فرایند تائید که هزینه و انرژی زیادی میطلبد، نیاز به مشوقهایی دارند.
در این رابطه آنها معمولا دو نوع پاداش دریافت میکنند: بیتکوینهایی جدید که در هر بلوک ساخته میشود و یا کارمزد تراکنشهایی که آنها تائیدشان میکنند و در یک بلوک جایشان میدهند. از آنجا که اولویت با تراکنشهایی است که در انتظار تائید شدن هستند، هرچه هزینهی کارمزد بیشتر باشد، تائید شدن تراکنش توسط استخراجکننده سریعتر خواهد بود.
پرسش سوم، اما مستقیما به هستهی مرکزی فناوری بلاکچین، یعنی غیرمتمرکز بودن مربوط میشود. بر روی بلاکچین هیچ قدرت مرکزی وجود ندارد که به کنترل تراکنشها بپردازد و یک دفترکل از تمام اقدامات مالی جمعآوری کند. این سامانه بر پایهی شبکهی نظیر به نظیر بنا شده است که در آن یک توافق جمعی گسترده جایگزین فقدان یک قدرت مرکزی است. اصطلاح «توافق جمعی» در این جا بدین معناست که همهی گرهها بر روی شبکهی بلاکچین باید قواعد یکسانی را بپذیرند.
چنین چیزی این شبکه را یبه ک اکوسیستم خود نظارتکننده تبدیل میکند. دو کارکرد بنیادی این توافق جمعی از قرار زیر هستند:
الف) اجازه به بلاکچین برای این که به روز رسانی شود.
ب) ممانعت از این که هر گره منفرد بتواند تمام شبکهی بلاکچین را دستکاری و یا کنترل کند.
افزون بر این کنترل کردن بیش از ۵۱% یک شبکهی بلاکچین به سرمایهگذاری عظیم انرژی و یا پول نیاز دارد و هر کلاهبردار بالقوه از چنین اقدامی پشیمان خواهد شد. حتی اگر تصور کنیم که سارقین بتوانند کنترل شبکهی بلاکچین را به دست گیرند، تمام گرههای دیگر به راحتی میتوانند بفهمند که این شبکه دیگر ایمن نیست و بی فوت وقت چنین شبکهای را ترک کنند.
حال میتوان پرسش سوم را این گونه جواب داد که هدف از استخراج این است که بدون نیاز به یک قدرت مرکزی، از درست و ایمن بودن عملیات نظیر به نظیر سامانه اطمینان حاصل شود؛ زیرا همان طور که میدانیم، امنیت و نظارت غیرمتمرکز شده و در میان همهی گرههای شبکهی بلاکچین توزیع شده است.
سوال چهارم جنبهی فنی بیشتری دارد؛ زیرا که به مکانیسمی اشاره میکند که به وسیلهی آن استخراجکنندهها تراکنشهای جدید را تائید میکنند و آنها را در یک بلوک میگنجانند. وقتی که یک تراکنش جدید به وسیلهی گرهها تایید میشود و در سراسر شبکه منتشر میشود، رقابت میان استخراجکنندگان برای تائید آن تراکنش آغاز میشود؛ چرا که تنها نخستین استخراجکنندهای که آن تراکنش را تائید کند، پاداش دریافت میکند.
برای تائید یک تراکنش، استخراجکننده باید با حل مسائل ریاضی پیچیده که نیاز به مصرف انرژی دارد، راهکاری برای الگوریتم «گواه انجامکار» (PoW) پیدا کند. برای انجام چنین کاری، استخراجکنندگان باید بلوکی جدید بسازند و سپس یک تابع هش را که کوچکتر از هدف مشخصی است، محاسبه کنند.
به زبان فنی، فرایند استخراج یک عملیات هش کردن معکوس است؛ استخراجکننده باید عدد تراکنش (که «نانس» (nonce) خوانده میشود) را پیدا کند. به گونهای که الگوریتم رمزنگاری شدهی هش از دادههای بلوک نتیجهای کمتر از آستانهی تحمل قراردادی داشته باشد. این آستانهی تحمل با درجهی سختی، چیزی است که ذات رقابتی استخراج را مشخص میکند. هرچه آستانهی تحمل کمتر باشد، به نیروی برق بیشتری برای حل مسالهی ریاضی و ساخت بلوک جدید نیاز خواهیم داشت.
این روش استخراجکنندگان را به سرمایهگذاری بر روی پردازشگرهای قدرتمندتر سوق میدهد تا کارآیی سامانههای استخراجشان را بهبود ببخشند. روش دیگری که عموما برای تائید تراکنشها در سایر رمزارزها (به جز بیتکوین) به کار میرود، گواه اثبات سهام (Proof-of-Stake) نام دارد که به وسیلهی آن استخراجکنندگان بر پایهی سهام مشخصی (مانند میزان سکههای متعلق به استخراجکننده) انتخاب میشوند و میزان سهام استخراجکننده با احتمال انتخاب شدن او به عنوان تائیدکنندهی بلوک، رابطهی مستقیمی دارد.
گنجانده شدن تراکنش در بلاکچین
هنگامی که کاربر تراکنش را با پیدا کردن الگوریتم گواه انجام کار تائید کند، او سایر گرههای شبکه را از این تائید آگاه میکند. در این مرحله، سایر گرهها تنها صحت فرایندی را که توسط استخراجکننده انجام شده است، تایید میکنند. اگر چنین فرایند تائیدی خروجی مثبت داشته باشد، ورودی جدید (که شامل تراکنش جدید است) به بلاکچین اضافه میشود و به بلوک قبلی (که با نام بلوک مادر شناخته میشود) متصل میشود. فی الواقع هر بلوک ارجاعی به بلوک پیشین خود در عرصهی «هش بلوک قبلی» دارد و از اینرو کار گرهها برای پیدا کردن بلوک قبلی در زنجیره آسان است.
اما در مواردی که بلوک مادر پیدا نشود، بلوک به عنوان «یتیم» شناخته میشود و در استخر بلوکهای یتیم قرار داده میشود تا زمانی که گرهها بلوک مادر را پیدا کنند. این اتفاق معمولا وقتی اتفاق میافتد که گرهها بلوک جدید را قبل از بلوک قدیمیتر دریافت کنند.
هدف از این فرایند تائید نهایی اطمینان حاصل کردن از این نکته است که تنها بلوکهای معتبر به بلاکچین اضافه میشوند و از فعالیت استخراجکنندههایی که فریبکارانه رفتار میکنند، جلوگیری شود و پاداش به آنها تعلق نگیرد؛ زیرا که بلوک آنها توسط سایر گرهها رد میشود.