فروشنده ای را تصور کنید که کالا را تحویل می دهد چون روی گوشی مشتری نوشته «تراکنش ارسال شد». ده دقیقه بعد آن تراکنش از شبکه ناپدید می شود و پولی در کار نیست.

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

خرج مضاعف چیست؟

خرج مضاعف چیست؟

خرج مضاعف یعنی یک واحد از یک ارز دیجیتال، دو بار خرج شود.

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

پاسخ بیت کوین یک دفتر عمومی است که همه در آن توافق می کنند کدام خرج زودتر ثبت شده. نکته اینجاست که این توافق آنی نیست؛ زمان می برد. و در همان فاصله است که حمله ممکن می شود.

یک تصحیح لازم: خرج مضاعف با حمله بازپخش یکی نیست

این بند را به این دلیل می نویسیم که نسخه قبلی همین صفحه دقیقا همین اشتباه را داشت.

در متن های فارسی، double spend گاهی به «حمله مجدد» ترجمه شده و بعد «حمله مجدد» با replay attack یکی گرفته شده. این ها دو چیز کاملا متفاوت اند:

  • خرج مضاعف یعنی یک دارایی دو بار خرج شود، روی یک شبکه.
  • حمله بازپخش یا replay attack یعنی یک تراکنش معتبر روی شبکه دوم هم پخش شود؛ حالتی که بعد از انشعاب یک بلاک چین به دو شاخه پیش می آید و ربطی به سناریوی این مقاله ندارد.

اگر جایی خواندید که «حمله مجدد یعنی تکرار یک تراکنش روی شبکه دیگر»، آن متن دارد replay attack را توضیح می دهد و عنوانش با محتوایش نمی خواند.

حمله رقابتی: ساده ترین و رایج ترین حالت

در حمله رقابتی یا race attack، مهاجم تقریبا هم زمان دو تراکنش می فرستد. یکی به آدرس فروشنده، یکی به آدرس خودش. هر دو از یک منبع خرج می کنند، پس فقط یکی می تواند در بلاک چین ثبت شود.

مهاجم کاری می کند که تراکنش دوم برنده شود. رایج ترین راهش قابلیتی است به نام Replace-By-Fee یا RBF: تراکنش دوم با کارمزد بالاتر فرستاده می شود و چون ماینرها کارمزد بیشتر را ترجیح می دهند، همان ثبت می شود و اولی کنار می رود. این قابلیت از نسخه ۰.۱۲ نرم افزار بیت کوین کور و بر اساس پیشنهاد BIP 125 به شکل گسترده در دسترس قرار گرفت.

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

حمله فینی: فقط از دست ماینر برمی آید

این حمله به نام هال فینی نامگذاری شده، یکی از اولین کسانی که با بیت کوین کار کرد و خودش این سناریو را توضیح داد. در متن های فارسی گاهی به اشتباه «حمله فنلاندی» ترجمه شده است؛ ربطی به فنلاند ندارد.

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

در عمل این حمله گران و پرریسک است. ماینر باید بلاکی را که پیدا کرده نگه دارد و ریسک کند که ماینر دیگری زودتر بلاک منتشر کند و کل زحمتش هدر برود. برای همین در دنیای واقعی تقریبا دیده نمی شود.

حمله ۵۱ درصدی و چیزی که نمی تواند بکند

معروف ترین حمله این فهرست و بیشترین سوءبرداشت هم درباره همین یکی است.

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

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

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

در عمل چه کار کنیم

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

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

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

بیت کویننرخ لحظه ای بیت کوین ۱.۳۴٪
۱۵,۸۸۰,۴۷۶,۲۴۳ تومان
$78,815.99 نرخ جهانی
تغییر ۲۴ ساعته - بروزرسانی ۰۲:۱۳ مشاهده نرخ بیت کوین

سوال های پرتکرار

آیا خرج مضاعف در بیت کوین ممکن است؟

روی تراکنش های تایید شده، عملا نه. روی تراکنش های تایید نشده، بله و این کار سختی هم نیست. تمام دفاع بیت کوین در برابر خرج مضاعف روی همین تفاوت سوار است، و کسی که تراکنش بدون تایید را می پذیرد از این دفاع بیرون ایستاده است.

چند تایید برای اطمینان کافی است؟

بستگی به مبلغ دارد. برای مبالغ کوچک یک تا دو تایید در عمل کافی است و برای مبالغ بزرگ عرف رایج شش تایید است. هر تایید یعنی یک بلاک دیگر روی تراکنش شما ساخته شده و برگرداندنش سخت تر شده است.

تفاوت حمله رقابتی و حمله فینی چیست؟

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

آیا این حمله ها روی تتر و رمزارزهای دیگر هم اثر دارند؟

منطق یکسان است: تا وقتی تراکنش تایید نشده، قطعی نیست. اما شبکه های مختلف سرعت و تعداد تایید متفاوتی دارند. برای انتقال تتر هم همین قاعده برقرار است و علاوه بر آن باید حواستان به شبکه انتخابی باشد؛ توضیحش در اعتبار تتر و نکاتی که باید بدانید آمده است.

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