مشکل دوبار خرج کردن در بلاک چین
مشکل دوبار خرج کردن یکی از مسائل مهم امنیتی در طراحی سیستمهای پولی و مالی دیجیتال است. بهطور کلی هر جا که قرار است مقدار زیادی پول ذخیره یا جابهجا شود، همیشه باید خطر حمله به شبکه را در نظر بگیریم. هکرها همیشه به دنبال یافتن راهی برای نفوذ و بهسرقتبردن داراییها هستند و چه جایی بهتر از یک سیستم دیجیتال که دیگر نیازی به جابهجایی پول نقد هم نیست.
دوبار خرج کردن یک نوع مشکل محاسباتی در شبکه است که اگر فردی قبل از سازنده شبکه بتواند آن را پیدا کند، میتواند اعتبار یک شبکه را زیر سوال ببرد. در این مقاله تصمیم داریم در مورد مشکل دوبار خرج کردن در سیستمهای مالی و بلاک چین صحبت کنیم و با راههای جلوگیری از آن آشنا شویم.
مفهوم دوبار خرج کردن
در سیستمهای پولی دیجیتال، «دوبار خرج کردن» (Double Spending) زمانی به وجود میآید که یک مقدار ثابت از داراییها را بهطور همزمان برای دو گیرنده ارسال کنیم و شبکه نتواند تشخیص دهد که این دو مبلغ ارسالشده در حقیقت یکی هستند و هر کدام را به عنوان یک تراکنش معتبر بشناسد. در چنین حالتی کاربران هم مجبورند پولی که دریافت کردهاند را تایید کنند، درحالیکه واقعیت این است که دقیقا آن پول در جای دیگری هم خرج شده است.
در طراحی سیستمهای پولی دیجیتال باید این اطمینان وجود داشته باشد که هیچ کدام از اعضای شبکه تحت هیچ شرایطی نتوانند واحدهای پولی خود را کپی کنند. اگر یک کاربر بتواند موجودی خود را با چند بار کپی کردن سکههایش، مثلا از ۱۰ سکه به ۱۰۰ سکه برساند، تمام شبکه به خطر خواهد افتاد. به طور مشابه، هیچکس هم نباید بتواند تمام موجودیاش را که مثلا ۱۰ سکه است، یکبار برای گیرنده اول و بار دیگر برای گیرنده دوم ارسال کند. پس تمام سیستمهای پولی دیجیتال باید مکانیزمی داشته باشند که از بروز چنین مسائلی جلوگیری کند.
راه های جلوگیری از دوبار خرج کردن
برای جلوگیری از مشکل دوبار خرج کردن راهحلهای مختلفی وجود دارد. ما تصمیم داریم راهحل موجود برای حل مشکل دوبار خرج کردن در سیستمهای متمرکز و غیرمتمرکز را بهطور جداگانه بررسی کنیم. ابتدا با راهحل سیستمهای متمرکز شروع میکنیم.
جلوگیری از مشکل دوباره خرج کردن در شبکه متمرکز
همانطور که گفتیم، یکی از راههای جلوگیری از مشکل دوبار خرج کردن، استفاده از راه حل متمرکز است. پیادهسازی سیستمهای متمرکز آسانتر است و ایده کلی این است که یک واحد مرکزی تعیین میشود تا مدیریت و کنترل تمام اتفاقاتی که در شبکه میافتد را به عهده بگیرد. یکی از نمونههای بارز چنین طرحی، سیستم پول الکترونیک «eCash» است که توسط David Chaum ساخته شده است. در این سیستم پولی، کاربران میتوانند تراکنشهای ناشناس و غیر قابل ردیابی را ارسال کنند.
سیستم eCash برای اینکه بتواند یک دارایی دیجیتال که دقیقا معادل یک پول فیات است را در اختیار کاربران قرار دهد، به طوری که آنها قادر باشند آن را مثل پول واقعی خرج کنند یا به یکدیگر ارسال کنند، از نوعی امضای الکترونیکی که به Blind Signatures معروف است استفاده میکند.
در چنین سیستمی، اگر یک کاربر بخواهد ۱۰۰ دلار برای شخص دیگری ارسال کند، ابتدا آن را بهطور مثال به ۵ بخش تقسیم میکند و به هر کدام یک یا چند عدد تصادفی اختصاص میدهد. برای اینکه حتی خود سیستم یا بانک هم نتواند این انتقال را ردیابی کند، کاربر به هر کدام از این بخشها یک فاکتور دیگر اضافه میکند که به آن Blinding Factor میگویند.
در حقیقت یک درخواست از کاربر به بانک ارسال میشود که در آن اعلام شده هر کدام از این ۵ بخش نشاندهنده درصدی از آن ۱۰۰ دلار هستند. او حالا میتواند موجودی خود را خرج کند. فرض میکنیم این کاربر به یک رستوران میرود و میخواهد ۴۰ دلار هزینه غذایش را بپردازد. قسمت جالب ماجرا اینجاست؛ کاربر برای اینکه بتواند ۴۰ دلار را بپردازد، میتواند Blinding factor (که در اینجا چیزی مثل رمز یا کلید خصوصی است) مربوط به بخشهایی از موجودی خود که ۴۰ دلار ارزش دارد را به فروشنده بدهد تا او بتواند به ۴۰ دلار از موجودی کاربر دسترسی پیدا کند و از بانک درخواست کند آن را به حساب رستوران منتقل کند.
بانک برای این کار امضاها را تطبیق میدهد و در صورت برقراری تمامی شرایط، ۴۰ دلار را به حساب رستوران واریز میکند. نکته مهم اینجاست که بانک در این مرحله امضاهای مربوط به آن ۴۰ دلار را از حساب کاربر میسوزاند و او دیگر به آن ۴۰ دلار دسترسی نخواهد داشت و حتی رستوران هم اگر بخواهد آن ۴۰ دلار را خرج کند، باید امضاهای جدید بسازد.
این سیستم بهخوبی میتواند انتقال پول محرمانه و غیرقابل ردیابی را تأمین کند ولی یک مشکل وجود دارد و آن این است که اگر سیستم بانک دچار اختلال شود، همهچیز به خطر خواهد افتاد. یک امضا یا کد به تنهایی هیچ اعتباری ندارد و فقط بانک است که میتواند آن را به مقداری پول از حسابی خاص ارتباط دهد و به نوعی همه مجبورند به بانک اعتماد کنند. این دقیقا همان موضوعی بود که بلاک چینها و ارزهای رمزنگاریشده با آن مخالفاند و راه حل دیگری برای آن دارند.
جلوگیری از مشکل دوبار خرج کردن در شبکه غیرمتمرکز
ارائه راه حلی غیرمتمرکز که بتواند بدون یک واحد کنترل مرکزی از مشکل دوبار خرج کردن در سیستم جلوگیری کند، مسئلهای به نسبت پیچیده و دشوار است. در این حالت نیاز است که تمام اعضای شبکه قدرت یکسانی داشته باشند و بر اساس قوانین خاصی با هم در تعامل باشند و تمایل همه حسن انجام کار باشد.
بزرگترین دستاورد شبکهای مثل بیت کوین این بود که توانست در «وایت پیپر» (White Paper) خود راهحلی عملی برای مشکل دوبار خرج کردن ارائه دهد. در حقیقت خالق بیت کوین از ساختار دادهای خاصی برای پیادهسازی شبکه بیت کوین استفاده کرد که ما آن را با نام «بلاک چین» (Blockchain) میشناسیم.
بلاک چین پایگاه دادهی خاصی است که به همه اعضا یا «نود»ها (Nodes) اجازه میدهد یک نسخه از این پایگاه داده یا «دفترکل» (Ledger) را داشته باشند. نودها با استفاده از نرمافزار شبکه همیشه دفترکل خود را آپدیت نگه میدارند. به کمک چنین ساختاری، همه اعضا میتوانند تاریخچه تمام تراکنشهای شبکه از روز اول تا حالا را مشاهده کنند. از این طریق میتوان جلوی هرگونه اقدام غیرقانونی مثل دوبار خرج کردن را گرفت.
بیایید نگاهی به اتفاقاتی که در یک شبکه بلاک چین (مثل بیت کوین) میافتد بیندازیم تا ببینیم یک تراکنش چگونه به شکلی امن انجام شود. وقتی کاربر یک تراکنش ارسال میکند، شبکه آن را بلافاصله تأیید نمیکند.
ابتدا باید آن تراکنش بررسی شود و در صورت داشتن اعتبار و موجودی کافی، به همراه تعداد دیگری از تراکنشها در یک بلاک قرار بگیرد و به زنجیره اصلی متصل شود. بعد از این مراحل میتوان یک تراکنش را تأییدشده در نظر گرفت و مطمئن بود که این مقدار پول، همزمان در جای دیگری خرج نشده است.
زمانی که یک تراکنش تأیید میشود، مالکیت سکهها یا پولِ جابهجاشده به گیرنده واگذار میشود و تمام اعضا این مسئله را مشاهده و تأیید میکنند. البته پیشنهاد میشود که بهتر است بعد از تأیید شدن بلاک، منتظر تشکیل چند بلاک دیگر نیز بمانیم. هر بلاکی که بعد از بلاک مورد نظر ما به زنجیره اضافه شود، در حقیقت یک مهر تأیید قویتر است و احتمال خرابکاری یا دستکاری بلاک ما را کمتر میکند.
مثال رستوران را به خاطر بیاورید. فرض کنید کاربر مورد نظر اینبار میخواهد همان ۴۰ دلار را بهصورت «بیت کوین» (BTC) بپردازند. کاربر برای مثال مقدار ۰.۰۰۵ بیت کوین را به آدرس کیف پول رستوران ارسال میکند. این تراکنش امضای کاربر را به همراه دارد و ثابت میکند که این مقدار موجودی در کیف پول او است و همچنین اجازه خرج کردن آنها را هم دارد.
رستوران زمانی میتواند تراکنش را انجامشده در نظر بگیرد که بلاکِ حاوی این تراکنش به بلاک چین اضافه شده باشد. البته در مورد بیت کوین پیشنهاد میشود که تا ۶ بلاک بعدی منتظر تأیید بمانید که نهایتا ۱ ساعت طول خواهد کشید.
مشکل دوبار خرج کردن در بیت کوین
در طراحی شبکه بیت کوین توجه زیادی به مسئله دوبار خرج کردن شده است، به همین خاطر توصیه میشود که تا زمانی که بلاکِ حاوی تراکنش به زنجیره اصلی اضافه نشده، آن را انجامشده در نظر نگیرید. اما وقتی بلاک مربوطه تشکیل و به بلاک چین اضافه شود، دستکاری و برگرداندن آن کار بسیار سختی خواهد بود.
برای اجرای عملیات دوبار خرج کردن در یک شبکه بلاک چین مثل بیت کوین، راههای مختلفی وجود دارد. در ادامه ۳ مورد از آنها را بررسی میکنیم:
- حمله ۵۱ درصد (51% attack): اگر یک نود یا سازمان مجزا بتواند بیش از نیمی از توان پردازشی شبکه را در اختیار خودش بگیرد، میتواند وضعیت تراکنشهای بلاکها را بهصورت دلخواه تغییر دهد. پیادهسازی چنین حملهای به شبکه بیت کوین بسیار بعید است، ولی برخی بلاک چینها این حمله را تجربه کردهاند.
- حمله مسابقه (Race attack): این حمله زمانی میتواند رخ دهد که گیرنده، بدون اینکه منتظر تأیید شبکه بماند، تراکنش را انجامشده در نظر بگیرد. در این نوع حمله، هکر ۲ تراکنش متناقض را بهطور همزمان به شبکه ارسال میکند که یکی برای گیرنده اصلی و دیگری برای آدرس دیگری است که به هکر تعلق دارد. او منتظر میماند تا شبکه تراکنشی را تأیید کند که درنتیجه آن پول به حساب خودش منتقل شود.
- حمله فینی (Finney attack): در حمله فینی، هکر ابتدا یک تراکنش خاص را بهصورت ماینشده در یک بلاک قرار میدهد و قبل از اینکه آن را به شبکه ارسال کند، همان تراکنش را بهصورت واقعی انجام میدهد و پول مورد نظر را یک بار خرج میکند. سپس بلاکی که از قبل ماینشده را به شبکه میفرستد که باعث میشود، تراکنش قبلی او غیرمعتبر شود. این نوع حمله نیاز به رعایت ترتیب بسیار خاصی در ارسال اطلاعات دارد و مثل حمله مسابقه، زمانی میتواند رخ دهد که گیرنده منتظر تأیید بلاک نماند و تراکنش خود را انجامشده در نظر بگیرد.
همانطور که دیدید، اگر گیرنده تراکنش مقداری صبر داشته باشد و تأیید چند بلاک بعدی هم اتفاق بیفتد، بعید است از مشکل دوبار خرج کردن آسیبی ببیند.
سخن پایانی
یک کاربر میتواند با استفاده از مشکل دوبار خرج کردن در سیستم پولی دیجیتال، یک دارایی را چند بار در جاهای مختلف خرج کند و به سود زیادی برسد و در نتیجه به سایر کاربران و شبکه ضرر وارد کند. پس نیاز است که در طراحی این سیستمها، کلیه راههای نفوذ و ایجاد چنین مشکلاتی از قبل پیشبینی شده و برای آن راه حل مناسبی در نظر گرفته شود.
به مرور، راهحلهایی برای جلوگیری از این مسئله به کار گرفته شد که Blind Signatures در سیستمهای متمرکز یکی از آنهاست. در نهایت با استفاده از فناوری بلاک چین و الگوریتمهای اجماع مثل گواه اثبات کار و ساخته شدن شبکه بیت کوین، سیستم پولی غیرمتمرکز متولد شد که تا حد زیادی میتواند جلوی مشکل دوبار خرج کردن را بگیرد.
برای دریافت مشاوره تخصصی رایگان از کارشناسان ما، اطلاعات خواسته شده رو تکمیل فرمایید.