دوبار خرج کردن (Double Spending) چیست؟
تضمین امنیت و درستی تراکنشها یکی از بزرگترین چالشهای حوزه ارز دیجیتال است. شبکههای بلاکچینی برای این کار تدابیر مختلفی اندیشیدهاند. با این وجود، باز هم حملات و آسیبپذیریهایی وجود دارند که اگر جلوی آنها گرفته نشود، میتوانند امنیت و اعتبار ارزهای دیجیتال را زیر سوال ببرند. یکی از این آسیبپذیریها دوبار خرج کردن یا دابل اسپندینگ نام دارد. این آسیبپذیری به افراد اجازه میدهد از یک ارز دیجیتال برای انجام چند تراکنش مختلف به صورت همزمان یا در فواصل زمانی بسیار کوتاه استفاده کنند. با افزایش قیمت ارزهای دیجیتال، تمایل افراد و گروههای خرابکار به انجام چنین حملاتی نیز بیشتر میشود. در این مقاله از مجله نوبیتکس قصد داریم انواع حملات دوبار خرج کردن را بررسی کنیم و ببینیم متخصصان بلاکچین و ارز دیجیتال چه اقداماتی برای حل این مشکل انجام دادهاند. اگر دوست دارید بیشتر با مفهوم دابل اسپندینگ در ارزهای دیجیتال آشنا شوید، این مطلب را از دست ندهید.
دوبار خرج کردن (Double Spending) چیست؟
اصطلاح دوبار خرج کردن یا دابل اسپندینگ به این معناست که از یک واحد از یک ارز دیجیتال در چند تراکنش مختلف استفاده کنیم. به عبارت سادهتر یعنی ارز دیجیتال خودمان را چندبار خرج کنیم. در سیستمهای مالی سنتی، تأمین امنیت و اعتبار تراکنشها بر عهده نهادهای واسط مثل بانکها است. ماهیت فیزیکی اسکناسها نیز به افراد اجازه نمیدهد که بتوانند پول خود را بیش از یک بار خرج کنند. اما در حوزه ارزهای دیجیتال که ماهیت غیرمتمرکز دارند و خبری از پول فیزیکی نیست، جلوگیری از دابل اسپندینگ اهمیت زیادی پیدا میکند.
برای درک بهتر دابل اسپندینگ، فرض کنید یک نفر مقداری ارز دیجیتال، مثلاً بیت کوین دارد. وقتی این فرد با بیت کوین خود تراکنشی انجام میدهد، نودهای بلاکچین باید این تراکنش را اعتبارسنجی کنند و در صورتی که مشکلی وجود نداشته باشد، با آن همگام یا بهاصطلاح sync شوند. حالا فرض کنید این فرد در یک شرایط خاص، دو تراکنش را به طور همزمان یا پشت سر هم ثبت کند، به نحوی که فرصت کافی برای تأیید تراکنش اولیه و همگامسازی با آن وجود نداشته باشد. در این صورت او میتواند از یک بیت کوین برای انجام دو تراکنش متفاوت استفاده کند یا به عبارتی بیت کوین خود را دوبار خرج کند.
انواع حملات دابل اسپندینگ
حملات دوبار خرج کردن به شیوههای مختلفی انجام میشوند که سه مورد از مهمترین آنها عبارتند از:
- حمله ۵۱ درصدی (51% Attack)
- حمله رقابتی یا ریس (Race Attack)
- حمله فینی (Finney Attack)
در ادامه، هر یک از این حملات را به صورت جداگانه بررسی میکنیم.
حمله ۵۱ درصدی
حمله ۵۱ درصدی یا 51% Attack که به آن حمله اکثریت هم میگویند، زمانی اتفاق میافتد که یک ماینر یا گروهی از ماینرها بتوانند کنترل بیش از ۵۰ درصد توان محاسباتی (هش پاور) یک شبکه بلاکچین را در اختیار بگیرند. در چنین شرایطی آنها میتوانند مکانیزم اجماع (consensus mechanism) بلاکچین را دستکاری کنند و از این طریق، حمله دوبار خرج کردن را انجام دهند. در واقع ماینرهای خرابکار میتوانند با در اختیار گرفتن کنترل شبکه، تراکنشهای مشکلدار را تایید کنند و حمله خود را با موفقیت به نتیجه برسانند.
در یک حمله دابل اسپندینگ ۵۱ درصدی، مهاجم میتواند یک نسخه جایگزین از بلاکچین ایجاد کند و تراکنشی را که قرار است دوبار خرج شود در آن بگنجاند. مهاجم با در اختیار گرفتن اکثریت هش پاور میتواند بلاکها را سریعتر از بقیه شبکه استخراج یا ماین کند و یک زنجیره جایگزین بلندتر بسازد. وقتی طول این زنجیره از یک زنجیره معتبر بیشتر شود، به زنجیره غالب (dominant) تبدیل میشود و در نتیجه آن، تراکنش دابل اسپندینگ معتبر تلقی خواهد شد.
حمله رقابتی یا ریس اتک
یکی دیگر از حملات رایج برای اجرای دابل اسپندینگ، حمله رقابتی یا Race Attack نام دارد که به آن «double spending race» هم میگویند. در این حمله، مهاجم سعی میکند از تأخیر زمانی لازم برای تأیید و اعتبارسنجی تراکنش سوءاستفاده کند و یک واحد ارز دیجیتال را در دو تراکنش مختلف خرج کند. در حمله رقابتی هدف مهاجم این است که وقتی یکی از تراکنشها هنوز تأیید نشده است، تراکنش دیگر تأیید و به بلاکچین اضافه شود، در این صورت او میتواند همان واحد ارز دیجیتال را دوبار خرج کند.
عدم قطعیت و اختلاف زمانی در تأیید تراکنشها، و اجماع نداشتن نودهای شبکه درباره معتبر بودن تراکنشهای مغایر با هم، از جمله عواملی هستند که امکان اجرای این حمله را فراهم میسازند.
حمله فینی
حمله فینی (Finney Attack) در واقع اولین حملهای است که یک مهندس نرمافزار با نام هال فینی درباره امکان اجرای آن روی بیت کوین صحبت کرد. این نوع حمله دوبار خرج کردن نیاز به دانش فنی نسبتاً زیادی دارد. در این نوع حمله، یک ماینر مهاجم میتواند بلاکی حاوی یک تراکنش از آدرس A به B ایجاد کند (که هر دو آدرس A و B متعلق به خود او هستند). سپس پرداخت دیگری با همان ارز دیجیتال انجام دهد و مبلغ را از A به C منتقل کند (که آدرس C متعلق به شخص دیگری است). اگر شخص مذکور تراکنش را بدون تأیید شبکه بپذیرد، مهاجم میتواند بلاکی را که تراکنش اولیه او در آن گنجانده شده بود به شبکه منتقل کند. در این صورت، شبکه تراکنش اول را معتبر میشناسد و تراکنش دوم باطل میشود. در نتیجه مهاجم میتواند دابل اسپندینگ انجام دهد و ارز دیجیتال خود را دوباره خرج کند.
حمله اکلیپس
یکی از حملات دیگری که میتواند امنیت شبکههای بلاکچین را به خطر بیندازد حمله اکلیپس یا Eclipse Attack نام دارد. در این حمله مهاجم یک محیط مصنوعی پیرامون نود یا نودهای هدف خود ایجاد میکند. با این کار میتواند این نودها را از شبکه جدا و حمله خود را اجرا کند. به عبارتی، مهاجم سعی میکند کنترل ارتباطات ورودی و خروجی نودهای مورد نظر خود را در دست بگیرد، سپس این ارتباطات را بهجای نودهای مجاور آن، به سمت نودهای مخربی که در اختیار خود اوست هدایت کند.
وقتی نود هدف از شبکه جدا و در یک محیط مصنوعی و مخرب گرفتار شود، مهاجم میتواند درک آن نود را از وضعیت شبکه بلاکچین و تاریخچه تراکنشها تغییر دهد. در نتیجه باعث میشود آن نود یک تراکنش معتبر را به اشتباه تأیید کند. از این طریق امکان اجرای حمله دوبار خرج کردن وجود خواهد داشت.
مقابله با حملات دوبار خرج کردن
سیستمهای مالی متمرکز و غیرمتمرکز از روشهای مختلفی برای مقابله با دابل اسپندینگ استفاده میکنند. از آنجایی که نحوه مدیریت داراییها و تراکنشها در این سیستمها با هم متفاوت است، اقدامات هر یک از آنها نیز با هم فرق دارد. در ادامه به طور مختصر به هر یک از آنها اشاره میکنیم.
سیستمهای متمرکز چطور با حملات دوبار خرج کردن مقابله میکنند؟
در یک سیستم متمرکز، یک نهاد مرکزی مسئولیت تأیید و اعتبارسنجی تراکنشها را بر عهده میگیرد تا از حملات دابل اسپندینگ جلوگیری کند. در واقع نهاد مرکزی کنترل کاملی روی موجودی حساب افراد دارد و پیش از انجام هر تراکنش، بررسی میکند که موجودی حساب کافی باشد و یک دارایی بیشتر از یک بار خرج نشود. سیستمهای مالی متمرکز، ابزارها و الگوریتمهای مختلفی را توسعه دادهاند تا بتوانند الگوهای مشکوک یا خطرناک را شناسایی کنند و جلوی حمله دوبار خرج کردن را بگیرند. یکی از نقاط ضعف سیستمهای متمرکز هم همین است که افراد باید به نهادهای مرکزی مثل بانکها اعتماد کنند و شفافیتی در این باره وجود ندارد.
سیستمهای غیرمتمرکز چطور جلوی حمله دوبار خرج کردن را میگیرند؟
در سیستمهای غیرمتمرکز مثل ارزهای دیجیتال، نهاد مرکزی وجود ندارد و به همین خاطر اقدامات دیگری برای جلوگیری از دابل اسپندینگ انجام شده است. در ادامه، تعدادی از این اقدامات را به صورت خلاصه بررسی میکنیم.
استفاده از مکانیزمهای اجماع مناسب
استفاده از مکانیزمهای اجماع مناسب یکی از اقدامات ضروری برای پیشگیری از حملات دوبار خرج کردن در شبکههای بلاکچین است. الگوریتمهایی مثل اثبات کار (PoW) و اثبات سهام (PoS) تضمین میکنند که مشارکتکنندگان شبکه بر سر اعتبار تراکنشها با هم توافق دارند. این مکانیزمها از طریق حل کردن مسائل و یا حق رأی بر اساس سهام کار میکنند، در نتیجه نودها برای اینکه بتوانند در فرآیند اجماع شرکت کنند باید با استفاده از منابع و یا سهام خود در شبکه سرمایهگذاری کنند. با این کار، اجرای حملات برای مهاجم از نظر اقتصادی دشوار خواهد بود.
استفاده از اعداد تکبار برای پیشگیری از حملات بازپخش
حملات بازپخش (Replay Attack) به حملاتی میگویند که در آنها شخص مهاجم سعی میکند یک تراکنش ثبتشده را دوباره اجرا کند. شبکههای بلاکچینی برای جلوگیری از این حملات از یک عدد منحصربهفرد با عنوان تکبار (nonce) استفاده میکنند. استفاده از تکبار کمک می کند تا حتی اگر جزئیات تراکنشها هم مشابه بود، مطمئن شویم که دو تراکنش با هم متفاوت هستند و به این طریق از اجرای حملات دوبار خرج کردن پیشگیری میشود.
برچسب زمانی یا تایماستمپ
تایماستمپها (Timestamps) نقش مهمی در پیشگیری از حملات دابل اسپندینگ ایفا میکنند. تایماستمپها یک تاریخچه مرتب از زمان انجام تراکنشها فراهم میسازند. شبکههای بلاکچین با گنجاندن تایماستمپ در تراکنشها، سوابق تراکنش را به شکلی یکپارچه حفظ میکنند. با این کار، هر اقدامی که برای دستکاری ترتیب تراکنشها یا ایجاد تراکنشهای متناقض انجام شود به راحتی قابل شناسایی خواهد بود. در نتیجه، اجرای حملات دوبار خرج کردن دشوارتر میشود و مهاجم نمیتواند به سادگی سناریوی حمله را به سرانجام برساند.
هزینه بالای نگهداری نودها
یکی از ویژگیهای شبکههای بلاکچینی که تا حدی جلوی حملات دوبار خرج کردن را میگیرد بالا بودن هزینه راهاندازی و نگهدرای نودها است. مشارکت در یک شبکه بلاکچین نیازمند منابع پردازشی قوی، مصرف انرژی بالا و سرمایهگذاری روی زیرساختهای لازم است. به همین خاطر برای بسیاری از مهاجمها راهاندازی و نگهداری نودهای مورد نیاز برای اجرای حجملات دابل اسپندینگ در مقیاس بزرگ صرفه اقتصادی ندارد. در نتیجه، بالا بودن هزینه خودبهخود به عنوان مانعی برای پیشگیری از حملات دوبار خرج کردن عمل میکند.
نظارت مرکزی
نظارت یا کنترل مرکزی یکی از نقاط ضعف سیستمهای مالی متمرکز است و آسیبپذیریهای خاص خود را به همراه دارد. نقطه قوت شبکههای بلاکچین در غیرمتمرکز بودن آنهاست و این شبکهها با حذف ناظر مرکزی، ریسک اقدامات خرابکارانه را به حداقل رساندهاند. ماهیت غیرمتمرکز بلاکچین باعث میشود تا یک شبکه توزیعشده از نودها بتوانند تأیید و اعتبارسنجی تراکنشها را بر عهده بگیرند. در نتیجه، هیچ نهاد متمرکزی وجود ندارد که بتواند به صورت یکجانبه تراکنشها را تغییر دهد یا شبکه را برای انجام حملات دوبار خرج کردن دستکاری کند.
تأیید خرج شدن UTXO
خروجیهای خرجنشده تراکنش (UTXO ها) نقش مهمی در پیشگیری از حملات دابل اسپندینگ در ارزهای دیجیتال ایفا میکنند. هر UTXO نشاندهنده مقدار ارز دیجیتالی است که هنوز خرج نشده است. به عبارتی مقدار ارز دیجیتالی را که بعد از انجام یک تراکنش باقی میماند به ما نشان میدهد. این خروجیها به صورت پیوسته پردازش میشوند و بخشی از آغاز و اتمام هر تراکنش هستند. وقتی یک تراکنش انجام میشود، خروجیهای خرجنشده در یک دیتابیس به عنوان ورودی ثبت میشوند تا بعداً از آنها برای انجام تراکنش جدید استفاده شود. با این کار جلوی دوبار خرج کردن ارزهای دیجیتال در تراکنشهای مختلف گرفته میشود.
بررسی پروتکلهای بلاکچین و قراردادهای هوشمند
یکی دیگر از کارهایی که میتوان برای جلوگیری از آسیبپذیریها و اجرای حملات مختلف از جمله دوبار خرج کردن انجام داد، بررسی پروتکلهای بلاکچین و قراردادهای هوشمند (Smart Contract ها) است. بررسی کدها، انجام ارزیابیهای امنیتی و بازرسیهای شخص ثالث کمک میکند تا ضعفهای احتمالی موجود در سیستمها را شناسایی کنید و جلوی سوءاستفاده از آنها را بگیرید. انجام بازرسیها هنگام پیادهسازی و اجرای قراردادهای هوشمند اهمیت زیادی دارد، چرا که وجود باگها یا آسیبپذیریهای احتمالی در کدهای این قراردادها میتواند فرصت اجرای حملات خرابکارانه و دابل اسپندینگ را در اختیار مهاجمها قرار دهد.
نکاتی درباره دوبار خرج کردن در معاملات ارز دیجیتال
با اینکه احتمال اجرای موفق حملات دوبار خرج کردن در ارزهای دیجیتال چندان زیاد نیست، بهتر است هنگام معامله با آنها به چند نکته توجه داشته باشید. مهمترین نکته این است که هنگام دریافت یک ارز دیجیتال، صبر کنید تا تعداد تأییدیههای تراکنش به حد نصاب برسد و پیش از آن اقدامی نکنید. مثلاً اگر فروشگاهی دارید که محصولات خود را با ارز دیجیتال میفروشید، پیش از دریافت حداقل تأییدیههای لازم، از تحویل محصول دیجیتال یا ارسال کالا خودداری کنید.
علاوه بر این میتوانید پیش از خرید ارز دیجیتال درباره آن تحقیق کنید و از امن بودن آن مطمئن شوید. اطلاعیههای رسمی سازندگان و توسعهدهندگان را دنبال کنید تا در جریان آخرین بهروزرسانیها و آسیبپذیریهای امنیتی ارزهای دیجیتال خودتان قرار داشته باشید. همچنین برای اطلاع از قیمت بیت کوین و انجام معاملات خودتان از یک صرافی معتبر مثل نوبیتکس استفاده کنید تا خیالتان از لحاظ بهکارگیری اقدامات امنیتی مختلف برای مقابله با حملات دوبار خرج کردن راحت باشد.
جمعبندی
در دنیای بلاکچین و ارزهای دیجیتال، دابل اسپندینگ اهمیت زیادی دارد و باید با اقدامات مختلف جلوی آن گرفته شود. در سیستمهای مالی متمرکز، مسئولیت این کار بر عهده یک نهاد مرکزی است. از آنجایی که در بلاکچین خبری از نهادهای مرکزی مثل بانکها نیست، تدابیر دیگری برای مقابله با دوبار خرج کردن اندیشیده شده است. شفافیت و غیرقابل تغییر بودن شبکه بلاکچین، بهکارگیری مکانیزمهای اجماع و مشارکت افراد مختلف در تأیید و اعتبارسنجی تراکنشها توانسته است به خوبی جلوی حملات دابل اسپندینگ را بگیرد.