در ارزهای رمزنگاری شده، فورک (fork) به تغییرات در زیر ساخت و قوانین کدهای یک رمز ارز گفته میشود که این اتفاق میتواند به صورت کلی (هارد فورک) و یا جزئی (سافت فورک) رخ دهد. در نوع هارد فورک، در عمل یک بلاک چین جدید ایجاد شده و بلاکهای جدید با نودهای شبکه پیشین همخوانی ندارند ولی در نوع سافت فورک، این سازگاری وجود دارد. در این مطلب ابتدا به توضیح مفاهیم فورک، هارد فورک و سافت فورک در بحث ارزهای رمزنگاری شده و سپس به مقایسه هارد فورک و سافت فورک میپردازیم.
فورک ها (Forks) یا اثرات ناشی از آنها یکی از مشخصههای اصلی در حوزه رمز ارزها است. فورک در حقیقت چیست؟ چرا فورک ها اهمیت دارند؟ هارد فورک (hard fork) و سافت فورک (soft fork) چه تفاوتی با یکدیگر دارند؟ در مقایسه هارد فورک با سافت فورک با ما همراه باشید.
« فورک » اصطلاحی در برنامهنویسی است که به معنای بهینه سازی یک کد متن باز میباشد. کدهای فورک شده معمولا شبیه کدهای معمولی هستند اما اصلاحات مهمی در آنها صورت گرفته و به صورت « شاخههای چنگال » به موازات یکدیگر عمل میکنند. گاهی برای آزمایش کردن یک فرآیند از فورک استفاده میشود اما فورک ها در زمینه رمز ارز ها اغلب برای اعمال تغییرات بنیادی استفاده میشوند و یا اینکه برای ایجاد دارایی جدیدی با مشخصات مشابه (اما نه یکسان) نسبت به دارایی اصلی به کار گرفته میشوند.
همه فورک ها تعمدی و ارادی نیستند. با وجود کد پایه متن باز که در پهنهای گسترده توزیع شده است، در برخی موارد هنگامیکه همه گرهها اطلاعات یکسانی را تکثیر نمیکنند، فورکی به صورت تصادفی به وجود میآید. استخراجکنندگان معمولا این فورک ها را شناسایی و رفع میکنند. با این وجود بیشتر فورک های موجود در رمز ارزها ناشی از اختلاف نظر بر سر ویژگی های ذاتی ایجاد شدهاند. یکی از مواردی که در مورد فورک ها باید در نظر داشت این است که آنها تاریخچه مشترکی دارند و بایگانی ثبت شده تراکنشها در هر یک از زنجیرهها (قدیمیو جدید) پیش از تفکیک شدن آنها یکسان هستند.
به طور کلی در برنامهنویسی دو نوع فورک: سخت (هارد فورک) و نرم (سافتفورک) وجود دارد.
هارد فورک تغییری در یک پروتکل است که باعث نامعتبر شدن نسخههای پیشین میشود. اگر نسخههای قبلی همچنان به اجرا درآیند، در نهایت پروتکل کاملا متفاوتی پیدا خواهند کرد و دیتای آنها نسبت به نسخه جدید متفاوت خواهد شد. این مساله باعث سردرگمیشدید میشود و ممکن است به خطا بیانجامد.
در بیت کوین، گاهی برای تعریف پارامترهایی همچون اندازه بلوک، دشواری مسائل رمزنگاریشدهای که نیاز به حل دارند، محدودیت اطلاعات اضافی قابل افزودن و غیره، لازم است از هارد فورک استفاده شود. بروزرسانی و ایجاد تغییر در هر یک از این قوانین باعث میشود بلوکها از سوی یک پروتکل جدید پذیرفته شوند اما از سوی نسخههای قبلی رد شوند؛ در نتیجه مشکلات بزرگی ایجاد میشود که حتی ممکن است وجوه از دست بروند.
برای نمونه اگر قرار است محدودیت اندازه بلوک از 1 MB به 2 MB افزایش داده شود، آنگاه یک بلوک 2 MB از سوی گرههایی که با نسخه جدید کار میکنند پذیرفته میشود اما از سوی گرههایی که با نسخه قبلی کار میکنند مردود اعلام میشود. فرض کنیم این بلوک 2 مگابایتی توسط یک گره بهروزشده تایید میشود و به بلاک چین افزوده میشود، اگر بلوک بعدی توسط گرهی که با نسخهی قبلی پروتکل کار میکند تایید شود آنگاه چه رخ میدهد؟ گره سعی میکند بلوک خود را به بلاک چین بیفزاید اما متوجه میشود که آخرین بلوک اضافه شده معتبر نیست؛ در نتیجه آن بلوک را نادیده میگیرد و بلوک جدید خود را به جای قبلی میگذارد و ناگهان دو بلاک چین خواهیم داشت؛ یکی از آنها حاوی هر دو نوع بلوک قدیم و جدید است و دیگری تنها با بلوکهای نسخه قدیمی کار میکند. اینکه کدام زنجیره سریعتر رشد میکند، به گرههایی بستگی دارد که اعتبار بلوکهای بعدی را تایید میکنند و امکان دارد در ادامه باز هم انشعابهایی ایجاد شود و همچنین این امکان وجود دارد که دو یا چند زنجیره هم راستا با یکدیگر همچنان ادامه پیدا کنند.
هارد فورک به این صورت بوده و معمولا با آشفتگی همراه است. هارد فورک ها ریسک زیادی هم دارند زیرا ممکن است بیت کوین های پرداخت شده در یک بلوک جدید امکان خرج شدن در یک بلوک قدیمیتر را داشته باشند (زیرا تریدرها، کیف پولها و کاربرانی که کد قبلی را اجرا میکنند، متوجه خرج شدن در کد جدیدی که از نظر آنها نامعتبر است نخواهند شد).
تنها راه حل ممکن این است که یکی از انشعاب را رها کنیم و کار را با یک زنجیره ادامه دهیم. این کار باعث میشود برخی استخراجکنندگان شانس خود را از دست بدهند (خود تراکنش ها گم نمیشوند بلکه به مکان جدیدی انتقال پیدا میکنند). راه دیگر آن است که تمامی گرهها همزمان به نسخه جدیدتر بیایند؛ انجام این کار در سیستم نامتمرکزی که به شدت گسترده میباشد کار بسیار سختی است؛ اگر هیچکدام از این راهها عملی نباشد، بیت کوین منشعب میشود. اتفاقی که قبلا افتاده و بیتکوینکش (bitcoin cash) نمونه آن است.
سافت فورک این قابلیت را دارد که همچنان با نسخههای قدیمیتر کار کند. برای نمونه اگر با اعمال قوانین سختگیرانهتر، یک پروتکل تغییر پیدا کند و تغییری کلی اعمال شود یا تابع جدیدی افزوده شود که به هیچ وجه روی ساختار تاثیر نمیگذارد، آنگاه بلوکهای نسخهی جدید توسط گرههای نسخهی قدیمی پذیرفته میشوند. عکس این روند امکان پذیر نیست و نسخهی جدید که سختگیرانهتر است، بلوکهای نسخهی قدیمی را قبول نخواهد کرد.
در بیت کوین، در حالت ایده آل استخراجکنندگان نسخه قدیمی متوجه میشوند که بلوکهای آنها رد شده است و در نتیجه خود را ارتقاء میدهند. هرچه استخراجکنندگان بیشتری به نسخه جدید ارتقاء پیدا کنند، زنجیرهی دارای بیشترین بلوکهای جدید بلندتر میشود و در نتیجه کار بلوکهای نسخه قدیمی مدام سختتر شده و ماینرها به فکر ارتقاء میافتند و به این ترتیب سیستم خود را اصلاح میکند. از آنجایی که بلوکهای نسخه جدید هم از سوی گرههای قدیمی و هم از سوی گرههای ارتقاء یافته پذیرش میشوند، در نهایت بلوکهای نسخه جدید برنده خواهند شد.
برای نمونه فرض کنید، جامعه یک پول دیجیتال تصمیم بگیرد اندازه بلوک را از حداکثر محدوده 1MB به 0.5MB کاهش دهد. گرههای نسخه جدید بلوکهای 1 مگابایتی را رد خواهند کرد و (در صورتی که استخراج با نسخه بهروزرسانی شده کد صورت گیرد)، کار ساخت را روی بلوک قبلی انجام خواهند داد؛ در نتیجه یک فورک موقت ایجاد میشود. این یک سافتفورک است و تاکنون بارها اتفاق افتاده است. در اصل بیت کوین برای اندازه بلوک محدودیتی نداشت و ایجاد محدودیت 1MB در بیت کوین به واسطهی یک سافت فورک صورت گرفت، چرا که قانون جدید « سختتر » از قبلی بود. تابع پرداخت به هش اسکریپت (pay-to-script-hash) که بدون ایجاد تغییر در ساختار کد آن را گسترش میدهد نیز به شکل موفقیتآمیزی از طریق یک سافت فورک به سیستم اضافه شده است. این قبیل پیوستها اغلب تنها نیازمند ارتقاء توسط بخش بزرگی از استخراجکنندگان هستند و در نتیجه به آسانی میسر میشوند و کمتر اختلاف و تضاد ایجاد میکنند.
سافت فورک ها برخلاف هارد فورک ها فاقد ریسک خرج دوباره هستند، زیرا تریدرها و کاربرانی که با گرههای قدیمیکار میکنند هر دو نوع بلوک نسخه قدیمی و جدید را میبینند. برای مشاهده نمونههایی از تغییراتی که نیازمند سافت فورک هستند به softfork wishlist مراجعه نمایید.