
سگویت چیست؟
سگویت (SegWit) که کوتاهشدهی عبارت Segregated Witness است، در واقع یک طرح بهبود بیتکوین است که در راستای رفع مشکلات ایجاد شدهاست در ادامه با مجله ارز دیجیتال همراه شوید .
سگویت از سوی تیم توسعهدهندگان بیتکوین کور که در حال حاضر محبوبترین کلاینت مرجع بیتکوین است، پیشنهاد و در آگوست ۲۰۱۷ بر روی بلاکچین بیتکوین اعمال شد. برای درک اینکه سگویت چگونه کار میکند، ابتدا باید درک کلی از مفاهیم اولیه داشتهباشیم و بدانیم که تراکنش بیتکوین چگونه کار میکند؟
تراکنشهای بیتکوین چگونه کار میکنند؟
فرض کنید آلیس میخواهد تعداد مشخصی بیتکوین برای باب ارسال کند. سیستم تراکنش در بیتکوین چگونه کار میکند؟ تراکنشهای بیتکوین بسیار متفاوت از تراکنش ارزهای فیات هستند. اگر آلیس بخواهد ۲ دلار به باب بدهد، او ۲ دلار را به صورت فیزیکی از کیف پولش بر میدارد و آن را به باب میدهد؛ اما در بیتکوین اوضاع متفاوت است. شما به صورت فیزیکی بیتکوینی در اختیار ندارید، تاریخچه تراکنشها تنها مدرکی است که نشان میدهد شما بیتکوین دارید.
دو نکته مهمی دیگری که باید در رابطه با تراکنشهای بیتکوین بدانید:
۱. صحتسنجی و تایید تراکنشها توسط استخراجکنندگان انجام میشود. آنها در عوض ارائه چنین خدماتی پاداش استخراج و کارمزد تراکنش دریافت میکنند.
۲. هنگامی که بحث در رابطه با ارز فیات است، شما دقیقا به خاطر ندارید که چگونه و از کجا آن را به دست آوردهاید. اگر دوست دارید میتوانید امتحان کنید. کیف پول خود را باز کنید و تمام اسکناسها و سکههای آن را بیرون بریزید. حالا آیا دقیقا میتوانید بگویید که منشا این پولها از کجا بودهاست؟ احتمالا نمیتوانید. اما در ارزهای دیجیتال با بلاکچین عمومی اینگونه نیست؛ تاریخچه تراکنشها برای شما مشخص خواهد بود.
خب، حالا بیایید تراکنش بیتکوینی که بین آلیس و باب در جریان است را با دقت بیشتری مورد بررسی قرار دهیم. این تراکنش دو قسمت دارد، ورودی و خروجی.
ورودی تراکنش (Input)
برای اینکه چنین تراکنشی اتفاق بیافتد، آلیس باید بیتکوینهایی که از تراکنشهای قبلی دریافت کردهاست را در اختیار داشتهباشد. اگر خاطرتان باشد، پیشتر گفتیم که در بیتکوین، به دلیل داشتن تاریخچه تراکنش شما حساب تک تک سکههای خود را خواهید داشت.
به این ترتیب، فرض کنید که آلیس باید از تراکنشهایی که ما آنها را با نامهای (TX(1) ،TX(0 و (TX(2 مشخص کردهایم، بیتکوین بردارد. این سه تراکنش با هم جمع خواهند شد و ورودی تراکنش جدید را که (TX(Input نام دارد، تشکیل میدهند.
خب، این فعل و انفعالات بخش ورودی تراکنش بود. حالا بیایید بببینیم که در سمت خروجی چه اتفاقی میافتد.
خروجی تراکنش (Output)
خروجی، اساسا تعدادی بیتکوین های تراکنش جدید و تراکنش برگردان (Change) خواهد بود که به خود آلیس برگشت داده میشود. این تغییرات به مقادیر ورودی آلیس برای تراکنشهای بعدیاش تبدیل میشود.
حالا، این یک تراکنش بسیار ساده است که جدای از تغییرات، تنها یک خروجی دارد. البته برخی تراکنشها میتوانند چندین خروجی داشتهباشند. این همان چیدمان اصلی تراکنش است. برای اینکه تمام این اتفاقات دقیق و بدون نقص انجام شود، باید شرایط خاصی برآورده شود.
شرایط تراکنش
۱. تراکنش ورودی همیشه باید بزرگتر از تراکنش خروجی باشد:
(TX(Input) > TX(Output
در هر تراکنش، تفاوت بین ورودی و خروجی (خروجی + برگردان) در واقع همان کارمزد تراکنشی است که نصیب ماینرها میشود. در نتیجه میتوان اینگونه نوشت:
( برگردان +TX(Input) – ( TX(Output) = کارمزد تراکنش
۲. در سمت ورودی تراکنش:
(TX(0) + TX(1) + TX(2) = TX(Input
اگر آلیس پول لازم برای انجام تراکنش را نداشته باشد، ماینرها تراکنش را رد خواهند کرد.
۳. باب باید نشان دهد که مدرک کافی برای اثبات اینکه میتواند این بیتکوین را دریافت کند، فراهم میکند. آلیس تراکنش را با آدرس عمومی باب قفل میکند. باب باید برای باز کردن قفل تراکنشها و دسترسی به سرمایههایش، کلید خصوصی خود را استفاده کند.
۴. آلیس در گام اول باید مالکیت خود نسبت به این بیتکوینها را تایید کند و نشان دهد که اجازه خرج کردن آنها را دارد. روشی که او با استفاده از آن این فرآیند را انجام میدهد به این گونه است که او با امضای دیجیتال خود (یا همان کلید خصوصیاش) تراکنش را مورد تایید قرار دهد. هر کسی میتواند با استفاده از کلید عمومی آلیس این را رمزگشایی کند و تایید کند که آیا واقعا آلیساست که این دادهها را فرستاده یا خیر.
اگر بخواهیم مفاهیم بالا را به صورت سادهتری توضیح دهیم؛ در بیتکوین برای خرج کردن داراییها نیاز به یک نوع کلمه عبور است و این کلمه عبور، امضای دیجیتال نام دارد. مثل یک امضای دستنویس، امضای دیجیتال معتبر بودن یک پیام را تصدیق میکند. اما این کار با استفاده از یک الگوریتم ریاضی خاص انجام میشود و کپی و جعل آن را غیرممکن میکند.
امضای دیجیتال مانند یک کلمه عبور ساده و ثابت نیست بلکه برای هر تراکنش، باید امضایی کاملا متفاوت درج شود. یادتان باشد که در شبکه بیتکوین شما با افراد کاملا غریبه سر و کار دارید، بنابراین باید امنیت شما تامین شود و داراییهای شما امن بماند. یک امضای دیجیتال با استفاده از دو کلید جداگانه کار میکند. این دو کلید با وجود متفاوت بودن، مکمل یکدیگر هستند.
کلید خصوصی، یک امضا تولید میکند و با یک کلید عمومی بقیه میتوانند معتبر بودن امضا را بررسی کنند. کلید خصوصی را به عنوان کلمه عبور واقعی در نظر بگیرید و امضای دیجیتال مدرکی است که نشان میدهد شما کلمه عبور را دارید. نام کل این تراکنش چه خواهد بود؟
ورودی که شامل داده امضا نیز میشود و اطلاعات خروجی با یکدیگر جمع میشوند و با استفاده از الگوریتم SHA256، این دادهها هش میشوند. «هش خروجی» نامی است که به تراکنش داده میشود.
کد جزئیات تراکنش
در تصویر زیر کد تراکنش را مشاهده میفرمایید. فرض کنید که آلیس میخواهد ۰.۰۰۱۵ بیت کوین برای باب ارسال کند. برای انجام این کار او ورودی را میفرستد که ارزشی برابر با ۰.۰۰۱۵۷۷۰ بیتکوین دارد. جزئیات تراکنش به صورت زیراست.
اولین چیزی که میبینید نام تراکنش است که در واقع همان هش مقادیر ورودی و خروجی است. در بخش بعدی Vin-sz نوشته شدهاست. این پارامتر همان تعداد دادههای ورودی است. از آنجایی که آلیس تنها با استفاده از یکی از تراکنشهای پیشینش این مبلغ را تامین میکند، در نتیجه این عدد در اینجا ۱ است. خروجی یا همان Vout-sz برابر ۲ است. چرا که خروجیها در اینجا باب و خروجی برگردان هستند.
ابتدای بخش دادههای خروجی نشان میدهد که باب ۰.۰۰۱۵ BTC دریافت میکند. در قسمت دوم نشان میدهد که ۰.۰۰۰۰۵۱۲ BTC چیزیاست که به عنوان تغییرات به آلیس برگشت داده میشود. پیشتر گفته بودیم که دادههای ورودی ۰.۰۰۱۵۷۷۰ BTC است، و این عدد از جمع دو عدد ۰.۰۰۱۵ و ۰.۰۰۰۰۵۱۲۰ بزرگتر است. تفاوت این دو عدد کارمزد تراکنشی است که کسر میشود.
ساختار بلاک در بیتکوین
تمام اطلاعات و دادههایی که در بالا درباره آنها صحبت کردیم در بلاکهایی که سایز آنها ۱ مگابایت است و به صورت میانگین ظرفیت نگهداری حدود ۲,۵۰۰ تراکنش را دارند، ذخیره میشوند. هر بلاک از اجزای مختلفی تشکیل شدهاست که بهطور دقیقتر این اجزا را میتوان به دو بخش بلاک هدر (Block Header) و بدنه بلاک (Block Body) تقسیم کرد.
سایز بلاک هدر ۸۰ بایت است و به شش جز تقسیم میشود:
شمارهی نسخهی برنامه (Bitcoin Version Number)
هشِ بلاک قبلی (Previous Block Hash)
هشِ ریشهی درخت مرکل (Merkle Tree)
زمانسنج (Timestamp Unix)
هدف سختی فعلی (Difficulty Target)
عدد تصادفی نانس (Nonce)
مابقی اطلاعات تراکنش مانند لیستی از ورودیها و خروجیها در مابقی فضای بلاک که با نام «تراکنش» شناخته میشود قرار میگیرند. در میان این دادهها، بیشترین فضا و حجم را «دادههای امضا» تشکیل میدهند، چیزی در حدود ۶۵ درصد کل سایز بلاک. حالا بیایید نگاهی جزییتر به مشکلات مطرح شده بیندازیم تا به ضرورت اجرای سگویت پی ببریم.
انعطافپذیری
مهمترین مشکلی که هدف اولیه سگویت بود و این ارتقا با هدف رفع این مشکل در شبکه بلاکچین بیتکوین اعمال شد، انعطافپذیری است. همانطور که پیشتر نیز گفته شد، صحت اطلاعات مربوط به هر تراکنش در بلاکچین بیتکوین از طریق امضای دیجیتال تایید میشود. امضای دیجیتال مبتنی بر رمزنگاری نامتقارن است و از جفت کلیدهای خصوصی و عمومی برای رمزگذاری و رمزگشایی دادهها استفاده میکند.
روش کار به این صورت است که ابتدا هش مربوط به تمامی دادههای تراکنش محاسبه میشود، این هش با کلید خصوصی فرستنده رمزگذاری شده و در کنار سایر اطلاعات، امضای دیجیتال را تشکیل میدهد. امضای دیجیتال بههمراه پیام برای گیرنده ارسال میشود و او با استفاده از کلید عمومی فرستنده امضای دیجیتال را رمزگشایی میکند و هش را آزاد میکند.
گیرنده خودش هش را به صورت جداگانه محاسبه میکند. اگر هشی که کامپیوتر گیرنده محاسبه کرده با هش فرستنده برابر باشد به این معنا خواهد بود که محتوای پیام هیچگونه تغییری نکردهاست. اگر امضای دیجیتال را که در حقیقت رشتهای از اعداد و حروف است را به نحوی تغییر دهیم که به لحاظ ریاضی ارزش آن تغییر نکند، شناسهی تراکنش عوض خواهد شد بدون آن که محتوای تراکنش تغییر کند، به این خاصیت انعطافپذیری تراکنشهای بیتکوین گفته میشود.
در واقع این ویژگی نقصی است که به هر کسی امکان تغییر جزئیات کوچکی که باعث اصلاح شناسه تراکنش بدون تغییر محتوای آن میشود را میدهد. شاید این مشکل، مساله بحرانیای برای بیتکوین نباشد، اما مانع پیشرفت ویژگیهای پیچیدهتری از جمله پروتکلهای لایه دوم مانند شبکه لایتنینگ و قراردادهای هوشمند میشود.
محدودیت سایز بلاک و مقیاسپذیری
بیت کوین ارز دیجیتالی است که با استفاده از علم رمزنگاری و با هدف حفظ امنیت تراکنشها ایجاد شدهاست. اطلاعات و دادههای مربوط به شبکه بیتکوین و تراکنشهای آن به صورت دائمی بر روی واحدهایی به نام بلاک ذخیره میشوند. در واقع هر بلاک شبیه به صفحهای از دفترکلاست.
هر زمانی که بلاکی تکمیل میشود، با استفاده از یک هش رمزنگاری به صورت متوالی به بلاک پیشین خود متصل میشود و بقیه اطلاعات بر روی بلاک بعدی ذخیره خواهند شد. انجام مکرر این کار، زنجیرهای از بلاکها و یا همان بلاکچین را شکل میدهد. هر بلاک بیتکوین، شامل اطلاعاتی در رابطه با فرستنده و گیرنده بیتکوین انتقالی و همچنین امضایی که هر تراکنش را تایید میکند،است.
در ابتدا هیچ محدودیتی برای سایز بلاک وجود نداشت. این بدان معنا بود که افراد مخرب میتوانستند دادههای بلاک جعلی بسازند و حمله دیداس به شبکه را ترتیب دهند. بلاکهای جعلی آنها قابل شناسایی و تشخیص بود، اما انجام این کار بسیار زمانبر بود و سرعت عملکرد کل سیستم را پایین میآورد. راهکار ساتوشی ناکاموتو برای مقابله با این مساله، اعمال محدودیت ۱ مگابایتی برای هر بلاک بود که در اواخر سال ۲۰۱۰ به طور مخفیانه در کد بیت کوین قرار داد.
به این ترتیب، حملههایی که با استفاده از بلاکهای بزرگ شکل میگرفتند، به راحتی و به سرعت شناسایی و رد میشدند. در حال حاضر سایز بلاک بیتکوین ۱ مگابایت است. بنابراین ترتیب تعداد تراکنشهای هر بلاک محدود و به تبع آن سرعت انجام تراکنشها پایین است. با افزایش محبوبیت بیتکوین، محدودیت سایز بلاکها دردسرساز شد و سبب کم شدن سرعت تراکنشها شد.
مقیاسپذیری در ارزهای دیجیتال، با تعداد تراکنشهایی که هر بلاکچین در ثانیه میتواند پردازش کند سنجیده میشود و تابعی از اندازهی بلاک و زمان تشکیل یک بلاک است. زمان تشکیل یک بلاک بر مبنای بازه زمانی قراردادیای که از سوی ساتوشی ناکاموتو تعیین شد، به صورت میانگین ۱۰ دقیقهاست.
با توجه به محدودیت سایز بلاک، تنها تعداد محدودی تراکنش و به اندازهای که ظرفیت بلاک اجازه دهد، میتوانند در آن قرار بگیرند.هرچه اندازهی بلاک بزرگتر باشد، تعداد تراکنشهای بیشتری میتوانند در این زمان بر روی بلاکچین ثبت شوند.
در حال حاضر سرعت انجام شدن تراکنشها در بیتکوین نسبت به سایر ارزهای دیجیتال و یا کارتهای اعتباری بسیار پایین است و گاهی ممکن است تایید یک تراکنش حتی ساعتها به طول انجامد. عدهای با طرحها و ایدههایی مثل «پرداختهای برون زنجیرهای» به دنبال حل مشکل مقیاسپذیری بلاکچین بیتکوین هستند و در تلاشند تا تراکنشها بدون نیاز به تایید بلاکچین، انجام شوند.
سگویت چگونه کار میکند؟
با دانستن چگونگی انجام تراکنشهای بیتکوین و ساختار بلاک در بلاکچین آن و همچنین مشکلاتی که در نتیجه این شرایط به وجود میآیند، زمان آن رسیده که بدانیم سگویت چگونه این مشکل را برطرف میکند. سگویت با جداسازی دادههای مربوط به امضای دیجیتال از تراکنشها، اندازهی بلاک را افزایش میدهد به همین علت است که نام آن از عبارت Segregate به معنی جدا کردن و witnesses به معنی تصدیقها یا همان امضاها گرفته شدهاست.
به این ترتیب سگویت با یک تیر دو نشان زد؛ فضای بلاک خالیتر شد و مشکل انعطافپذیری تراکنشها برطرف شد. سگویت در واقع دادههای مربوط به امضای بخش اطلاعات ورودی را به بخش جداگانهای که در انتهای بلاک قرار دارد انتقال میدهد و به این ترتیب محاسبه شناسه تراکنش را بسیار آسانتر میکند و در نتیجه تا حد زیادی از حمله انعطافپذیری جلوگیری میکند.
شبکهی لایتنینگ
سگویت نه تنها این مشکل اساسی را از سر راه بیتکوین برداشت، بلکه زمینه را برای روی کار آمدن راهکارهای مقیاسپذیری لایهی دوم فراهم کرد. یکی از این راهکارها شبکهی لایتنینگ بود. با خارج شدن حجم عمدهای از تراکنشها از زنجیرهی اصلی و پردازش آنها بهصورت برونزنجیرهای، ظرفیت شبکه بهشکل چشمگیری افزایش مییابد.
سگویت سایز هر بلاک را از ۱ مگابایت به حداکثر ۴ مگابایت افزایش میدهد و بر حسب شرایط شبکه این عدد میتواند متغیر باشد. متخصصین اعلام کردند که سایز بلاک بلافاصله پس از فعالسازی سگویت در محدودهی ۲ مگابایت تا ۲.۱ مگابایت قرار میگیرد.
افزایش سایز بلاک به این علت اتفاق میافتد که هر بایت در تراکنشهایی که سگویت در آنها فعال شدهاست، برابر با ۱ واحد وزنی است در حالی که در حالت معمول هر بایت برابر با ۴ واحد است. در نتیجه زمانی که بخشی از دادهها از بلاک اصلی جدا میشوند، ۴ برابر آن مقدار در بلاک فضای خالی ایجاد میشود.
خارج کردن امضاها از ورودی تراکنش، مشکلات خاص خود را دارد. ریشه درخت مرکل که در واقع بالاترین نقطه در درخت مرکل است، در بخش بلاک هدر، ساختاری است که به بلاک این امکان را میدهد تراکنشها را بدون نیاز به بررسی حجم زیادی از اطلاعات تراکنش صحتسنجی و تایید کنند.
با اعمال سگویت، دادههای مربوط به امضا دیگر بخشی از شناسه تراکنش نیستند؛ اما هنوز باید در تراکنش گنجانده شوند، در غیر این صورت بلاک معتبر نخواهد بود. در نتیجه درخت مرکل جداگانهای برای دادههای مربوط به امضای تراکنش مورد نیاز است. اما ریشه درخت مرکل دادههای امضا باید در کجا قرار گیرد؟
تراکنش کوینبیس
توسعهدهندگان میدانستند که برای فعالسازی سگویت به صورت سافتفورک، ریشه دادههای امضا باید در بلاک قرار گیرد. آنها تراکنش کوینبیس (coinbase) را برای اینکار انتخاب کردند. تراکنش کوینبیس، اولین تراکنشی است که در بلاک اتفاق میافتد و اطلاعات ورودی ندارند.
علاوه بر این، این تراکنشها پاداش استخراجی که ماینرها در ازای ایجاد این بلاک دریافت میکنند را مشخص میکند، که در حال حاضر ۱۲.۵ بیتکوین است. با اتصال ریشه درخت مرکل به تراکنش کوینبیس، دادههای امضا و تراکنش به یکدیگر متصل خواهند شد و به این ترتیب به سگویت امکان سازگاری معکوس دادهمیشود.
آدرسهای سگویت چگونه است؟
همانطور که نسخههای متعددی برای پروتکل اینترنت مانند IPv4 و IPv6 وجود دارد، سه نوع آدرس عمومی متفاوت در بیتکوین وجود دارد. از هر سهی این آدرسها برای فرستادن و دریافت بیتکوین میتوان استفاده کرد و احتمال اینکه صرافیها و سرویسهای نگهداری حداقل از یکی از آنها پشتیبانی کند، بسیار بالاست؛ اما فقط تعداد انگشتشماری از ارائهدهندگان خدمات از هر سه آدرس به طور همزمان پشتبانی میکنند.
لِگاسی (P2PKH)
اگر آدرس بیتکوین شما با عدد ۱ شروع میشود، شما از آدرس لگاسی یا P2PKH استفاده میکنید: مانند ۱BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2 این اولین فرمت آدرس بیتکوین بود که هنوز هم به درستی کار میکند. عبارت P2PKH مخفف Pay-to-Pubkey Hash است. آدرسهای لگاسی با سگویت سازگار نیستند؛ اما شما به راحتی و بدون هیچ مشکلی میتواند از یک آدرس P2PKH به آدرس سگویت بیتکوین ارسال کنید. میانگین کارمزد تراکنش در تراکنشهای انجام شده با آدرسهای لگاسی بیشتر از سگویت است.
آدرس P2SH
ساختار آدرسهای P2SH مشابه آدرسهای P2PKH است، با این تفاوت که همانند ۳J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy، به جای عدد ۱ با عدد ۳ آغاز میشوند. P2SH مخفف عبارت Pay To Script Hash است و قابلیتهای بیشتری نسبت به آدرسهای لگاسی دارد. تابع اسکریپت P2SH اغلب برای آدرسهای امضای چندگانه مورد استفاده قرار میگیرد.
این فرمت آدرس همچنین با استفاده از فرآیندی که با نام P2WPKH-in-P2SH شناخته میشود، تراکنشهای غیربومی (non-native) سگویت را فعال میکند. کاربران معمولی نباید خودشان را درگیر عملکرد پیچیده فرمت P2SH کنند. چیزی که اهمیت دارد این است؛ این نوع از آدرس به طور گستردهای پشتیبانی میشود و میتوان از آن برای ارسال ارز به هر دو آدرس P2PKH و bech32 استفاده کرد.
آدرس بومی سگویت (bech32)
آدرسهای bech32 کاملا متفاوت از آدرسهای نوع P2 هستند. هر آدرس bech32 با عبارت bc1 آغاز میشود و طولانیتر از دو نوع آدرس دیگر است. این نوع آدرس توسط اکثر نرمافزارها و کیفپولها پشتیبانی میشود، اما تعداد صرافیهایی که از این آدرس پشتیبانی میکنند محدود است. در حال حاضر بسیاری از صرافیهای امکان ارسال بیتکوین به این آدرس را فراهم کردند، اما کاربرانشان قادر به دریافت بیتکوین با این فرمت آدرس نیستند. تا کنون، تنها ۱.۳ درصد از بیتکوینهای موجود در بازار با فرمت آدرس bech32 ذخیره شدهاند و این روند با سرعت کمی در حال رشداست.