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

فهرست مطالب۴ بخش
- چرا پول دیجیتال ممکن است دو بار خرج شود؟
- بلاکچین چطور جلوی خرج دوباره را میگیرد؟
- یک دفتر عمومی با ترتیب مشخص
- در بیتکوین: هر تکه پول فقط یک بار خرج میشود
- در اتریوم: هر تراکنش یک شماره ترتیب دارد
- صف انتظار: از دو تراکنش متضاد فقط یکی میماند
- تأییدها: هر بلاک تازه، یک لایه محافظ بیشتر
- خرج دوباره در عمل چطور اتفاق میافتد؟
- ۱. حمله مسابقه: تراکنشی که جایگزین میشود
- ۲. حمله فینی: ماینری که بلاکش را پنهان نگه میدارد
- ۳. بازنویسی چند بلاک آخر
- ۴. حمله ۵۱ درصد
- اگر از غریبه رمزارز میگیرید، چند تأیید صبر کنید؟
- قبل از تحویل جنس، اینها را چک کنید
- اگر پرداخت فوری لازم دارید
دابل اسپند (Double Spend) یا «خرج دوباره» یعنی کسی یک رمزارز را دو بار خرج کند؛ مثلاً همان بیتکوینی را که برای شما فرستاده، به کیف پول دیگری هم بفرستد که مال خودش است. بلاکچین جلوی این کار را با یک دفتر حساب عمومی میگیرد که همه نسخهای از آن را دارند. از دو تراکنشی که یک پول را خرج میکنند فقط یکی در زنجیره ثبت میشود، و هر بلاکی که بعد از آن ساخته شود، برگرداندنش را سختتر و گرانتر میکند.
نقطه ضعف، فاصله کوتاه قبل از تأیید است. تراکنشی که هنوز در هیچ بلاکی ننشسته، فقط یک پیشنهاد است و فرستنده میتواند تراکنش دیگری جایش بگذارد. پس اگر از کسی که نمیشناسید رمزارز میگیرید، جنس یا پول را بعد از تأییدهای کافی تحویل بدهید. پایینتر جدولی گذاشتهایم که نشان میدهد برای هر مبلغ چقدر صبر کنید.
چرا پول دیجیتال ممکن است دو بار خرج شود؟
عکسی که در تلگرام برای دوستتان میفرستید، هم پیش شما میماند و هم پیش او. در دنیای دیجیتال، فرستادن در واقع یعنی کپی کردن. این برای عکس خوب است، ولی برای پول فاجعه است. اگر سکه دیجیتال هم مثل فایل کپی شود، هر کسی میتواند یک سکه را بارها خرج کند و آن پول دیگر هیچ ارزشی ندارد.
بانکها این مشکل را با یک دفتر مرکزی حل کردهاند. وقتی کارت میکشید، بانک در دفتر خودش از موجودی شما کم میکند و دیگر نمیگذارد همان مبلغ دوباره خرج شود. ایرادش این است که همه باید به این دفتردار اعتماد کنند.
ساتوشی ناکاموتو وایتپیپر بیتکوین را از همین مسئله شروع میکند. امضای دیجیتال ثابت میکند پول مال کیست، ولی ثابت نمیکند صاحبش آن را قبلاً به کس دیگری نداده باشد. راهحل قدیمی یک مرجع مرکزی بود که همه تراکنشها را چک کند. حرف ساتوشی این بود که برای مطمئن شدن از اینکه تراکنش دیگری در کار نیست، باید از همه تراکنشها باخبر بود. پس اگر قرار است داوری وسط نباشد، فهرست همه تراکنشها باید عمومی باشد و همه روی ترتیبشان توافق کنند.
بلاکچین چطور جلوی خرج دوباره را میگیرد؟
این محافظت چند لایه دارد و هر لایه بخشی از مسئله را حل میکند.
یک دفتر عمومی با ترتیب مشخص
بلاکچین همان دفتر عمومی است. هزاران کامپیوتر، که به هر کدامشان نود (Node) میگویند، نسخهای از آن را نگه میدارند و تراکنشها دستهدسته در بلاکها ثبت میشوند. ترتیب بلاکها ترتیب تراکنشها را هم معلوم میکند. به تعبیر وایتپیپر، تراکنشی که زودتر ثبت شده حساب است و تلاشهای بعدی برای خرج دوباره اهمیتی ندارد. نودها هم فقط بلاکی را میپذیرند که همه تراکنشهایش معتبر باشند و پولی را خرج نکنند که قبلاً خرج شده است.
اینکه هزاران نود بدون اعتماد به هم چطور روی یک ترتیب به توافق میرسند، کار الگوریتم اجماع است.
در بیتکوین: هر تکه پول فقط یک بار خرج میشود
در خود شبکه بیتکوین، برخلاف حساب بانکی، چیزی به اسم «موجودی» ثبت نمیشود. کیف پول شما مجموعهای از تکهپولهاست که هر کدام خروجی یک تراکنش قبلی است. به این تکهها UTXO یا «خروجی خرجنشده تراکنش» میگویند. وقتی پول میفرستید، تراکنش شما یک یا چند UTXO را بهعنوان ورودی مصرف میکند و خروجیهای تازه میسازد. هر UTXO فقط یک بار مصرف میشود.
راهنمای توسعهدهندگان بیتکوین خرج دوباره را دقیقاً همینطور تعریف میکند: دو یا چند تراکنش که یک ورودی مشترک را خرج میکنند. همان راهنما میگوید وقتی تراکنشی در بلاک ثبت شد، خرج دوبارهاش بدون دست بردن در تاریخچه بلاکچین ممکن نیست.
در اتریوم: هر تراکنش یک شماره ترتیب دارد
اتریوم و شبکههای مشابهش بهجای تکهپول، برای هر آدرس یک موجودی نگه میدارند؛ شبیه حساب بانکی. اینجا شمارندهای به اسم nonce نقش اصلی را دارد. هر تراکنشی که از یک حساب بیرون میرود شمارهای دارد و این شماره یکییکی بالا میرود. طبق مستندات اتریوم، برای هر حساب فقط یک تراکنش با یک شماره مشخص اجرا میشود. اگر کسی دو تراکنش با یک شماره امضا کند، فقط یکیشان در زنجیره مینشیند.
صف انتظار: از دو تراکنش متضاد فقط یکی میماند
تراکنش قبل از ثبت در بلاک، در صف تراکنشهای منتظر هر نود میماند که به آن mempool میگویند. طبق قواعد Bitcoin Core، دو تراکنش وقتی «متضاد» حساب میشوند که دستکم یک ورودی مشترک را خرج کنند. تراکنش تازه فقط وقتی جای تراکنش قبلی را در صف میگیرد که کارمزد بیشتری بپردازد.
این قاعده دو رو دارد. اگر تراکنش خودتان با کارمزد کم گیر کرده باشد، میتوانید با کارمزد بیشتر جایگزینش کنید. ولی کسی هم که برای شما پول فرستاده، میتواند همین کار را بکند و این بار پول را به آدرس خودش برگرداند.
تأییدها: هر بلاک تازه، یک لایه محافظ بیشتر
وقتی تراکنش در یک بلاک ثبت شد، یک تأیید (Confirmation) گرفته است و هر بلاک بعدی یک تأیید دیگر به آن اضافه میکند. از این به بعد، برگرداندنش فقط با بازنویسی تاریخچه ممکن است: کسی باید زنجیرهای جایگزین بسازد که کار محاسباتی بیشتری از زنجیره فعلی پشتش باشد، چون نودها همیشه زنجیرهای را درست میدانند که بیشترین کار پشتش است. هرچه تراکنش زیر بلاکهای بیشتری برود، این کار گرانتر میشود. اینکه هر شبکه کی تراکنش را نهایی میداند و چرا هر صرافی عدد متفاوتی میخواهد، در مطلب تأیید تراکنش در بلاکچین مفصل توضیح دادهایم.
خرج دوباره در عمل چطور اتفاق میافتد؟
از نظر پروتکل، خرج دوباره یک تراکنش تأییدشده کار بسیار سختی است. برای همین تقریباً همه حملههای واقعی سراغ کسی رفتهاند که زودتر از موعد اعتماد کرده است: فروشندهای که با دیدن تراکنش تأییدنشده جنس را داده، یا سرویسی که به تعداد کمی تأیید بسنده کرده است.
۱. حمله مسابقه: تراکنشی که جایگزین میشود
سادهترین روش، حمله مسابقه (Race Attack) است. خریدار پول را برای شما میفرستد و همزمان یا کمی بعد، تراکنش دومی میفرستد که همان پول را به آدرس خودش برمیگرداند. شما تراکنش اول را در حالت «در انتظار» میبینید و جنس را میدهید. اگر تراکنش دوم کارمزد بیشتری بدهد یا زودتر به ماینرها برسد، همان در بلاک مینشیند و تراکنش شما برای همیشه باطل میشود. ویکی بیتکوین میگوید فروشندهای که پرداخت را با صفر تأیید قبول کند در معرض همین حمله است. احتیاطهای فنی فقط ریسکش را کم میکنند و از بین نمیبرند.

در بیتکوین این کار حالا از همیشه سادهتر است. Bitcoin Core، نرمافزار اصلی نودهای بیتکوین، از نسخه ۰٫۱۲ به بعد بهطور پیشفرض فقط تراکنشهایی را جایگزینپذیر میدانست که فرستنده خودش علامت جایگزینی با کارمزد (Replace-By-Fee یا RBF) رویشان گذاشته بود. در نسخه ۲۸ که ۱۴ مهر ۱۴۰۳ منتشر شد، پیشفرض عوض شد و نودها هر تراکنش تأییدنشدهای را، با علامت یا بیعلامت، با نسخه پرکارمزدتر جایگزین میکنند. در نسخه ۲۹ هم گزینه خاموش کردن این رفتار حذف شد، با این توضیح که این سیاست بهطور گسترده پذیرفته شده است.
نتیجه برای فروشنده روشن است: تراکنش بیتکوینی که هنوز در بلاک نیست، پرداخت نیست. قولی است که فرستنده تا قبل از تأیید میتواند پسش بگیرد. اینکه کیف پول یا اکسپلورر علامت RBF را نشان ندهد، دیگر هیچ اطمینانی نمیدهد.
در اتریوم هم تراکنش در انتظار همین وضع را دارد. راهنمای متامسک توضیح میدهد که میشود تراکنش pending را با فرستادن تراکنشی تازه که همان nonce و کارمزد بیشتری دارد، لغو کرد. همان راهنما میگوید تراکنشی که تأیید شده، دیگر برگشت ندارد.
۲. حمله فینی: ماینری که بلاکش را پنهان نگه میدارد
در حمله فینی (Finney Attack) مهاجم خودش ماینر است. بلاکی استخراج میکند که در آن پولش را از یک آدرس به آدرس دیگر خودش منتقل کرده، ولی بلاک را منتشر نمیکند. بعد با همان پول از شما خرید میکند. شما چند ثانیه صبر میکنید، هیچ تراکنش متضادی در شبکه نمیبینید و جنس را تحویل میدهید. همان موقع مهاجم بلاکش را منتشر میکند و تراکنش او، که از قبل در بلاک است، جای تراکنش شما را میگیرد.
ویکی بیتکوین میگوید ریسک این حمله برای کسی که صفر تأیید قبول میکند با هیچ احتیاطی صفر نمیشود. ترکیب آن با حمله مسابقه، که به آن Vector76 میگویند، حتی تراکنشی را که یک تأیید گرفته هم میتواند برگرداند.
یک نمونه ثبتشده: طبق همان ویکی، در پاییز ۱۳۹۲ نشانههایی پیدا شد که استخر استخراج GHash.io بارها با خرج دوباره از سایت شرطبندی BetCoin Dice پول برده است. این سایت برای هر شرط یک تراکنش میگرفت و منتظر تأیید نمیماند. GHash.io گفت کار یک کارمند خودسر بوده که اخراج شده، ولی مدرکی برای این ادعا منتشر نکرد.
۳. بازنویسی چند بلاک آخر
مهاجمی که سهمی از قدرت استخراج شبکه دارد، میتواند پرداخت به شما را منتشر کند و همزمان در خفا زنجیرهای جایگزین بسازد که در آن همان پول به خودش برگشته است. اگر وقتی شما تأییدهای لازم را دیدید و جنس را دادید، زنجیره او از زنجیره اصلی جلو افتاده باشد، منتشرش میکند و تراکنش شما از تاریخچه حذف میشود.
ساتوشی در بخش ۱۱ وایتپیپر فرمولی برای احتمال موفقیت این حمله داده است. جدول زیر همان فرمول را برای چند حالت رایج حساب کرده است:
تأییدهایی که صبر میکنید | مهاجم با ۱۰٪ قدرت شبکه | مهاجم با ۲۰٪ | مهاجم با ۳۰٪ |
|---|---|---|---|
۱ | ۲۰٫۵٪ | ۴۱٫۶٪ | ۶۲٫۸٪ |
۲ | ۵٫۱٪ | ۲۰٫۴٪ | ۴۴٫۶٪ |
۳ | ۱٫۳٪ | ۱۰٫۳٪ | ۳۲٫۵٪ |
۶ | ۰٫۰۲٪ | ۱٫۴٪ | ۱۳٫۲٪ |
عددها شانس موفقیت مهاجم را در مدل ساده وایتپیپر نشان میدهند. وایتپیپر حساب میکند که برای رساندن این شانس به کمتر از یک در هزار، در برابر مهاجم ۱۰ درصدی ۵ تأیید و در برابر مهاجم ۳۰ درصدی ۲۴ تأیید لازم است.
دو نکته از این جدول پیداست. هر تأیید اضافه شانس مهاجم را چند برابر کم میکند، و عدد ۶ جادویی نیست؛ در برابر مهاجمی با سهم بزرگ، ۶ تأیید هم کم است. از آن طرف، چنین حملهای برای خود مهاجم هم هزینه دارد. او بهجای استخراج صادقانه، بلاکهایی میسازد که اگر حمله شکست بخورد پاداششان از دست میرود. ویکی بیتکوین میگوید این حمله فقط وقتی بهصرفه است که مبلغ معامله با پاداش یک بلاک قابل مقایسه باشد.
۴. حمله ۵۱ درصد
اگر یک نفر یا یک گروه بیش از نیمی از قدرت استخراج شبکه را در دست داشته باشد، تعداد تأیید هم جلویش را نمیگیرد. زنجیره او دیر یا زود از زنجیره بقیه جلو میزند و صبر بیشتر فقط هزینه حمله را بالا میبرد.
یک نمونه مستند: در دی ۱۳۹۷، صرافی کوینبیس گزارش داد که بلاکهای شبکه اتریوم کلاسیک (ETC) ۱۵ بار بازنویسی شدهاند و ۱۲ مورد آن خرج دوباره داشته است؛ رویهم ۲۱۹٬۵۰۰ اتریوم کلاسیک که آن زمان حدود ۱٫۱ میلیون دلار میارزید. عمیقترین بازنویسی ۱۲۳ بلاک را جایگزین کرده بود. کوینبیس واریز و برداشت ETC را متوقف کرد و وقتی حدود دو ماه بعد دوباره بازش کرد، نوشت به خاطر تعداد زیاد تأیید لازم، تراکنشها ممکن است ۲۴ ساعت یا بیشتر طول بکشند.
جزئیات این حمله را در مطلب حمله ۵۱ درصد بخوانید.
اگر از غریبه رمزارز میگیرید، چند تأیید صبر کنید؟
از همه اینها یک قاعده ساده بیرون میآید: هرچه مبلغ بزرگتر و طرف ناشناستر باشد، تأیید بیشتری لازم است. جدول زیر پیشنهاد ما برای کسی است که در ازای کالا، خدمات یا تومان از دیگران رمزارز میگیرد:
موقعیت | بیتکوین | تتر روی ترون | اتریوم و توکنهای ERC-20 |
|---|---|---|---|
تراکنش هنوز در انتظار است (صفر تأیید) | جنس را ندهید؛ با RBF جایگزینشدنی است | جنس را ندهید | جنس را ندهید؛ با همان nonce لغوشدنی است |
مبلغ کم، از آدم آشنا | ۱ تأیید (حدود ۱۰ دقیقه) | نهایی شدن بلاک (حدود ۱ دقیقه) | ثبت در بلاک |
مبلغ معمولی، از غریبه | دستکم ۳ تأیید (حدود نیم ساعت) | نهایی شدن بلاک | وضعیت finalized (حدود ۱۵ دقیقه) |
مبلغ بزرگ | ۶ تأیید (حدود یک ساعت) | نهایی شدن بلاک، بهاضافه چک کردن قرارداد توکن | وضعیت finalized، بهاضافه چک کردن قرارداد توکن |
مبلغی در حد پاداش یک بلاک یا بیشتر | چند ده تأیید؛ ویکی بیتکوین تا ۱۰۰ تأیید (حدود ۱۷ ساعت) را توصیه میکند | مثل ردیف قبل | مثل ردیف قبل |
این عددها قانون شبکه نیستند. پایهشان اینهاست:
- صفر و یک و شش تأیید: راهنمای توسعهدهندگان بیتکوین میگوید تراکنش تأییدنشده را نباید بدون تحلیل ریسک پذیرفت. با یک تأیید ریسک خرج دوباره خیلی کم میشود، ولی بلاک آخر گاهی تصادفی جایگزین میشود. شش تأیید یعنی حدود یک ساعت کار شبکه، و راهنما توصیه میکند نرمافزارهایی که مبلغ بالا جابهجا میکنند یا در معرض کلاهبرداریاند، دستکم شش تأیید صبر کنند. البته خودش این عدد را «تا حدی دلبخواهی» میداند.
- سه تأیید: صرافی Kraken در راهنمای واریزش که ۱۳ مهر ۱۴۰۵ بهروز شده، نوشته واریز بیتکوین را بعد از سه تأیید به حساب میزند و هدفش را جلوگیری از خرج دوباره گفته است. صرافیها این عدد را گاهی عوض میکنند.
- مبلغهای خیلی بزرگ: پاداش هر بلاک بیتکوین بعد از آخرین هاوینگ ۳٫۱۲۵ بیتکوین است. ویکی بیتکوین برای مبلغی در این حد ۱۰۰ تأیید را توصیه میکند، چون آنوقت حمله ممکن است برای یک ماینر بهصرفه شود.
- ترون و اتریوم: این دو شبکه نقطه نهاییشدن مشخصی دارند. بلاک ترون حدود یک دقیقه بعد نهایی میشود و بلاک اتریوم حدود ۱۵ دقیقه بعد. برگرداندن بلاک نهاییشده اتریوم یعنی از دست رفتن دستکم یکسوم کل اتر سپردهشده در شبکه. جزئیات هر دو در مطلب تأیید تراکنش آمده است.
قبل از تحویل جنس، اینها را چک کنید
- TXID را خودتان در اکسپلورر باز کنید. شناسه تراکنش را از خریدار بگیرید و در مرورگر بلاکچینِ همان شبکه، که خودتان باز کردهاید، جستوجو کنید. اسکرینشات و لینکی که او میفرستد ملاک نیست. TXID چیست نشان میدهد صفحه تراکنش را چطور بخوانید.
- آدرس، مبلغ و شبکه را چک کنید، نه فقط اینکه «تراکنشی هست». تعداد تأیید یا وضعیت نهاییشدن را هم در همان صفحه ببینید.
- اگر پول به حساب صرافی میآید، خود صرافی تا تأییدهای لازمش تمام نشود حساب را شارژ نمیکند. ملاک شما موجودی شارژشده است، نه حرف خریدار.
- تا تأییدها کامل نشده، پول را جلوتر نفرستید. راهنمای توسعهدهندگان بیتکوین هشدار میدهد که خرج کردن پولی که هنوز تأیید نشده، ریسک خرج دوباره را به نفر بعدی هم منتقل میکند.
- در تتر، بعد از نهایی شدن تراکنش، خرج دوباره تقریباً مطرح نیست. خطرهای جدیتر جای دیگری است: توکن جعلیای که اسمش USDT است (تتر فیک چیست) و مسدود شدن آدرس از طرف شرکت تتر (ریسکهای تتر).
اگر تتر را در معامله همتا به همتا میفروشید، دامهای طرف تومانی ماجرا، مثل رسید جعلی و پول دزدی، در راهنمای معامله P2P تتر آمده است.
اگر پرداخت فوری لازم دارید
قبول کردن تراکنش تأییدنشده راهش نیست. دو راه امنتر هست.
- شبکه لایتنینگ برای بیتکوین: لایتنینگ برای همین ساخته شده است. طبق سایت پروژه، پرداختها در کسری از ثانیه تا چند ثانیه انجام میشوند، بدون اینکه منتظر تأیید بلاک بمانید.
- انتقال داخلی در یک سرویس: اگر خریدار هم در سواپولت حساب دارد، فرستادن رمزارز به مخاطب سواپولت روی بلاکچین نمیرود و فوری در دفتر خود سواپولت ثبت میشود، پس تأییدی برای شمردن نیست. در عوض، به ثبت سواپولت اعتماد میکنید، نه به بلاکچین.
پرسشهای رایج
دابل اسپند با هک شدن کیف پول چه فرقی دارد؟
در هک، کسی به کلید خصوصی شما دست پیدا میکند و پول خودتان را میبرد. در خرج دوباره، فرستنده با پول خودش بازی میکند: پولی را که به شما داده، پیش از قطعی شدن پس میگیرد. کیف پول شما سالم است؛ چیزی که از دست میرود جنس یا پولی است که زودتر از موعد تحویل دادهاید.
RBF یعنی بیتکوین ناامن شده است؟
نه. RBF فقط روی تراکنشی اثر دارد که هنوز در هیچ بلاکی نیست. بعد از ثبت در بلاک، جایگزینی با کارمزد ممکن نیست. فایدهاش هم برای خود شماست: اگر تراکنشتان با کارمزد کم گیر کرد، میتوانید با کارمزد بیشتر سریعترش کنید. تنها چیزی که عوض شده این است که دیگر نمیشود به هیچ تراکنش تأییدنشدهای تکیه کرد، که از اول هم توصیه نمیشد.
در تتر هم خرج دوباره ممکن است؟
تا وقتی تراکنش نهایی نشده، از نظر تئوری بله؛ این فاصله در ترون حدود یک دقیقه و در اتریوم حدود ۱۵ دقیقه است. بعد از آن، برگرداندن تراکنش عملاً ممکن نیست. برای همین خطر اصلی تتر خرج دوباره نیست، بلکه توکن جعلی و مسدود شدن آدرس است.
اگر قربانی خرج دوباره شدم، راهی برای برگرداندن پول هست؟
خود شبکه راهی ندارد. از نگاه بلاکچین، پرداخت به شما هیچوقت قطعی نشده و آن پول همچنان در کیف پول فرستنده است. تنها راه، پیگیری از طریق خود آن فرد یا پلتفرمی است که معامله در آن انجام شده. TXID، آدرسها و گفتوگوها را نگه دارید.
چرا شبکههای کوچکتر بیشتر در معرض خرج دوبارهاند؟
چون در شبکهای که قدرت استخراج یا سرمایه سپردهشده کمتری پشتش است، به دست آوردن سهم بزرگی از آن ارزانتر است. ماجرای اتریوم کلاسیک در دی ۱۳۹۷ نمونه همین بود و کوینبیس بعد از آن برای واریز ETC تعداد زیادی تأیید خواست. پس اگر در شبکهای کمطرفدار پول میگیرید، بیشتر صبر کنید.
