در زمان‌بندی و بلوک‌ها در بلاکچین دیدیم که چطور بیت کوین با تعریف یک مسئله‌ی ریاضی که حل کردن آن جز با حدس زدن اعداد تصادفی ممکن نیست مانع از این شد که هر کسی بتواند بلوکی از تراکنش‌ها را ایجاد و به زنجیره بلوک ( بلاکچین ) اضافه کند.

اگر دو عضو هم‌زمان مسئله را حل کنند؟

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

دوپرداختی ها در بلاکچین

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

در صورت انشعاب چه اتفاقی رخ می‌دهد؟

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

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

چه اتفاقی برای زنجیره‌ی کوچک‌تر رخ می‌دهد؟

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

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

دوپرداختی در بلاکچین چیست؟

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

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

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

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

دوپرداختی در بلاکچین چگونه رخ می‌دهد؟

عرفان جوانی با تجربه‌ی کم در دنیای وب و البته رمزارزهاست. او به تازگی براساس ایده‌ی جدیدی یک طرح بازی نوشته است. یک کلاه‌بردار به عرفان پیشنهاد می‌کند که این طرح را در مقابل 5 بیت کوین به او بفروشد. 5 بیت کوین در زمان معامله حدود 18 میلیون تومان ارزش داشت و این از نظر عرفان برای اولین طرحش رقم بسیار خوبی است.

کلاه‌بردار یک تراکنش به مبلغ 5 بیت کوین از شماره حساب خود ( که در آن 5 بیت کوین دارد ) به آدرس عرفان ایجاد می‌کند و آن را با کلید خصوصی خود امضا می‌کند و در شبکه منتشر می‌کند.

آقای توانا تراکنش تایید نشده‌ی عرفان را در کنار چند تراکنش دیگر قرار می‌دهد و یک بلوک می‌سازد و شروع به حل مسئله‌ی ریاضی می‌کند.

آقای توانا دقایقی بعد موفق می‌شود مسئله را حل کند. او این بلوک را که حاوی تراکنش عرفان است به زنجیره‌ی بلوک اضافه می‌کند و دفاتر حساب در شبکه به‌روزرسانی می‌شوند.

عرفان با دیدن اینکه تراکنشش با ایجاد بلوک توسط آقای توانا تأیید شد و بیت کوین ها به آدرسش
آمد خوشحال می‌شودو طرح بازی خود را برای کلاه‌بردار می‌فرستد.

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

فرض کنیم کلاه‌بردار یک سیستم بسیار قدرتمند کامپیوتری در اختیار دارد. اون با توان پردازش بالایی که دارد مسئله‌ی ریاضی بلوک را حل می‌کند و بلوک خود را به زنجیره‌ی بلوک متصل می‌کند.

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

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

هنوز کار تمام نشده است

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

در این‌صورت چه اتفاقی رخ می‌دهد؟

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

اما بلوک‌های شاخه دیگر حذف می‌شوند و تراکنش‌های آن‌ها از حالت تأییدشده خارج شده و دوباره به حالت تأییدنشده تبدیل می‌شوند و برای بررسی به شبکه باز می‌گردند. تراکنشی که بر طبق آن 5 بیت کوین از حساب کلاه‌بردار به حساب عرفان منتقل شده بود هم جز این تراکنش‌هاست.

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

بیت‌کوین چگونه از دوپرداختی در بلاکچین جلوگیری می‌کند؟

مسئله‌ی امنیتی بیان شده ظاهراً بسیار مهم است و می‌تواند اعتماد به کل شبکه را از بین ببرد. بیت‌کوین چگونه این مسئله را حل می‌کند؟

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

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

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

در شبکه‌ی بیت‌کوین با ایجاد 5 بلوک بعدی (6 بلوک با خود بلوک اصلی) احتمال ناصحیح شدن تراکنش نزدیک به صفر است و آن تراکنش عملاً قطعی در نظر گرفته می‌شود. از آنجا که برای ایجاد هر بلوک به طور متوسط 10 دقیقه زمان سپری می‌شود تأیید کامل یک تراکنش به حدود 60 دقیقه زمان نیاز دارد.

منبع: intellavision.com