دوبار خرج کردن Double Spending یک مسئله بالقوه در یک سیستم نقدی دیجیتال است که در آن وجوه یکسان برای دو گیرنده به طور همزمان خرج میشود. بدون هیچگونه اقدام متقابل کافی، پروتکلی که مشکل را حل نمیکند اساساً تضعیف میشود – کاربران راهی برای تأیید اینکه وجوهی که دریافت کردهاند قبلاً در جای دیگری خرج نشده است ندارند.
وقتی صحبت از پول نقد دیجیتال به میان میآید، اطمینان از اینکه واحدهای خاص نمیتوانند تکرار شوند، از اهمیت بالایی برخوردار است. اگر آلیس بتواند 10 واحد دریافت کند، 10 بار آنها را کپی و جایگذاری کند و 100 واحد را در اختیار داشته باشد، کل سیستم تضعیف میشود. به طور مشابه، اگر او بتواند همان 10 واحد را به طور همزمان برای باب و کارول ارسال کند، چنین طرحی نمی تواند کار کند. بنابراین، برای عملکرد پول دیجیتال، باید مکانیسم هایی برای جلوگیری از این رفتار وجود داشته باشد.
چگونه میتوان از Double Spending جلوگیری کرد؟
رویکرد متمرکز پیاده سازی
مسیر متمرکز به طور قابل ملاحظهای آسانتر از جایگزینهای غیرمتمرکز است. این معمولاً شامل یک ناظر است که سیستم را مدیریت میکند و صدور و توزیع واحدها را کنترل میکند. یک مثال خوب از یک راه حل متمرکز برای مشکل دوبار خرج کردن، eCash دیوید چاوم است. برای صدور یک دارایی دیجیتال تقلید کننده پول نقد به کاربران (قابلیت تبادل ناشناس و همتا به همتا)، یک بانک میتواند از امضاهای کور استفاده کند. در چنین شرایطی، اگر کاربری بخواهد 100 دلار پول نقد دیجیتال دریافت کند، باید ابتدا به بانک اطلاع دهد. به شرطی که موجودی در حساب خود داشته باشد، سپس یک عدد تصادفی (یا تعداد زیادی، برای فرقه های کوچکتر) ایجاد میکند. فرض کنید او پنج عدد تولید میکند که به هر کدام 20 دلار اختصاص داده میشود. برای جلوگیری از ردیابی بانک از واحدهای خاص، دن اعداد تصادفی را با افزودن یک عامل کور کننده به هر یک از آنها مبهم میکند.
سپس این دادهها را به بانک تحویل میدهد که 100 دلار حسابش را بدهکار میکند و پیامهایی را امضا میکند که تأیید میکند هر یک از این 5 قطعه اطلاعات به قیمت 20 دلار قابل بازخرید است. دان اکنون میتواند وجوه صادر شده توسط بانک را خرج کند. او به رستوران ارین میرود و یک وعده غذایی 40 دلاری برایش میخرد. Dan میتواند عامل کورکننده را حذف کند تا شماره تصادفی مرتبط با هر «صورتحساب» نقدی دیجیتال را که بهعنوان یک شناسه منحصربهفرد برای هر واحد عمل میکند (مثلاً یک شماره سریال) در معرض نمایش بگذارد. او دو مورد از آنها را به ارین فاش میکند، که اکنون باید آنها را فوراً در بانک بازخرید کند تا دن آنها را با تاجر دیگری خرج نکند. بانک بررسی میکند که امضاها معتبر هستند و اگر همه چیز درست به نظر برسد، 40 دلار به حساب ارین اعتبار میدهد.
صورتحسابهای استفادهشده اکنون اساساً سوزانده شدهاند، و اگر ارین بخواهد موجودی جدید خود را به همین روش خرج کند، باید بیشتر صادر شود. راه اندازی Chaumian eCash ممکن است برای نقل و انتقالات خصوصی ارزشمند باشد. اما در انعطاف پذیری شکست میخورد زیرا بانک نقطه مرکزی شکست است. اسکناس صادر شده به خودی خود ارزشی ندارد، زیرا ارزش آن صرفاً از تمایل بانک به مبادله آن با دلار ناشی میشود. مشتریان تحت الحمایه بانک هستند و برای کارکرد پول باید به حسن نیت آن اعتماد کنند. این دقیقاً همان مشکلی است که ارز دیجیتال قصد دارد آن را برطرف کند.
رویکرد غیر متمرکز
حصول اطمینان از اینکه وجوه را نمیتوان در اکوسیستمی بدون ناظر دوبار خرج کرد، چالش برانگیزتر است. شرکتکنندگانی که به همان اندازه قدرتمند هستند باید پیرامون مجموعهای از قوانین هماهنگ شوند که از تقلب جلوگیری میکند و همه کاربران را تشویق میکند تا صادقانه عمل کنند.
بزرگترین نوآوری ارائه شده در وایت پیپر بیت کوین، راه حلی برای مشکل دوبار خرج کردن بود. اگرچه ساتوشی به آن ارجاع داده نمیشود، ساختار دادهای را پیشنهاد کرد که اکنون به طور گسترده به عنوان زنجیره بلوکی شناخته میشود.
یک بلاکچین در واقع فقط یک پایگاه داده با برخی ویژگیهای منحصر به فرد است. شرکتکنندگان در شبکه (که به آنها گرهها گفته میشود) نرمافزار تخصصی را اجرا میکنند که به آنها امکان میدهد نسخه خود را از پایگاه داده با همتایان خود همگامسازی کنند. نتیجه این است که کل شبکه میتواند تاریخچه تراکنشها را که به بلوک پیدایش باز میگردد، بررسی کند. با داشتن بلاکچین قابل مشاهده به صورت عمومی، شناسایی و جلوگیری از فعالیتهای تقلبی، مانند تراکنشهایی که سعی در دو برابر کردن هزینه دارند، آسان است. هنگامی که کاربر یک تراکنش را پخش میکند، بلافاصله به بلاکچین اضافه نمیشود – ابتدا باید از طریق استخراج در یک بلوک گنجانده شود. به این ترتیب، گیرنده باید تراکنش را تنها پس از اضافه شدن بلوک آن به زنجیره معتبر بداند. در غیر این صورت، آنها خطر از دست دادن وجوه را دارند، زیرا فرستنده میتواند همان سکهها را در جای دیگری خرج کند.
هنگامی که تراکنش تأیید شد، سکهها را نمیتوان دوبار خرج کرد، زیرا مالکیت به یک کاربر جدید اختصاص مییابد – و کل شبکه میتواند این را تأیید کند. به همین دلیل است که بسیاری توصیه میکنند قبل از پذیرش یک پرداخت به عنوان معتبر، منتظر تأییدهای متعدد باشید. هر بلوک بعدی میزان تلاش مورد نیاز برای اصلاح یا بازنویسی زنجیره را به شدت افزایش میدهد (که ممکن است در طول یک حمله 51٪ رخ دهد).
بیایید سناریوی رستوران را دوباره مرور کنیم. دن به رستوران بر میگردد و این بار متوجه برچسب بیت کوین Accepted Here روی پنجره میشود. او از غذایی که دفعه قبل خورده بود لذت برد، بنابراین دوباره آن را سفارش داد. برای او 0.005 بیت کوین هزینه دارد. ارین یک آدرس عمومی به او ارائه میدهد که باید وجوه را به آن بفرستد. Dan تراکنش را پخش میکند، که اساساً یک پیام امضا شده است مبنیبر اینکه 0.005 بیت کوین که در اختیار دن بود اکنون در اختیار Erin است.
بدون پرداختن به جزئیات زیاد، هرکسی که تراکنش امضا شده توسط دن ارائه میشود، میتواند تأیید کند که او واقعاً سکهها را در اختیار دارد، و بنابراین صلاحیت ارسال آنها را دارد. همانطور که گفته شد، تراکنش تنها در صورتی معتبر است که در بلوکی که تایید شود گنجانده شود. پذیرش تراکنشهای تایید نشده بسیار شبیه پذیرش 40 دلار به صورت eCash از مثال قبلی است، بدون اینکه بلافاصله آن را به بانک نقد کنید – این به فرستنده اجازه میدهد آن را در جای دیگری خرج کند. بنابراین، توصیه میشود که ارین حداقل ۶ تائید بلاک (تقریباً یک ساعت) قبل از پذیرش پرداخت دن صبر کند.
دوبرابر خرج کردن در بیت کوین
بیت کوین با دقت طراحی شده است تا از حملات Double Spending جلوگیری کند، حداقل زمانی که پروتکل مطابق انتظار استفاده میشود. یعنی اگر افراد منتظر بمانند تا تراکنشها در یک بلوک تایید شود، هیچ راه آسانی برای فرستنده وجود ندارد که آن را لغو کند. برای انجام این کار، آنها باید بلاکچین را “معکوس” کنند، که به مقدار غیرواقعی قدرت هش نیاز دارد. با این حال، تعداد انگشت شماری از حملات دوگانه وجود دارد که طرف هایی را هدف قرار میدهند که تراکنشهای تایید نشده را میپذیرند. به عنوان مثال، برای خریدهای کم ارزش، یک تاجر ممکن است نخواهد منتظر باشد تا معاملات در یک بلوک گنجانده شود. یک رستوران فست فود شلوغ احتمالاً نمیتواند از پس پرداخت هزینه برآید زیرا شبکه هر خریدی را پردازش میکند. بنابراین، اگر یک کسبوکار پرداختهای «آنی» را امکانپذیر کند، خود را برای هزینههای مضاعف باز میکند. ممکن است شخصی یک برگر سفارش دهد، هزینه آن را بپردازد، سپس بلافاصله همان وجوه را به آدرس خودش بفرستد. با کارمزد بالاتر، احتمالاً این تراکنش جدید ابتدا تأیید میشود و بنابراین تراکنش قبلی را باطل میکند.
سه روش متداول برای انجام دوبار خرج کردن وجود دارد:
- حملات 51٪ – 51% attacks: زمانی که یک نهاد یا سازمان موفق به کنترل بیش از 50٪ از نرخ هش شود، که به آنها اجازه می دهد تا ترتیب تراکنش ها را حذف یا تغییر دهند. چنین حمله ای به بیت کوین بسیار بعید است، اما در شبکه های دیگر رخ داده است.
- حملات مسابقهای – Race attacks: دو تراکنش متناقض پشت سر هم با استفاده از وجوه یکسان پخش می شوند – اما تنها یک تراکنش تایید می شود. هدف مهاجم این است که پرداخت را صرفاً با اعتبارسنجی تراکنشی که به نفع اوست (مثلاً ارسال همان وجوه به آدرسی که کنترل می کند) باطل کند. حملات Race گیرنده را ملزم میکند که یک تراکنش تایید نشده را به عنوان پرداخت بپذیرد.
- حملات فینی – Finney attacks: مهاجم یک تراکنش را بدون اینکه فوراً به شبکه پخش کند، از قبل ماین می کند. در عوض، او همان سکه ها را در تراکنش دیگری خرج می کند و تنها پس از آن بلوک استخراج شده قبلی خود را پخش می کند، که ممکن است پرداخت را باطل کند. حملات Finney مستلزم وقوع توالی خاصی از رویدادها است و همچنین مشروط به پذیرش تراکنشهای تایید نشده توسط گیرنده است.
آیا باید نگران حملات دو بار خرج کردن بود؟
تا زمانی که تراکنشهای تأیید نشده را نپذیرید، نباید نگران حملات دوبار خرج کردن باشید. اکثر کیف پولها و صرافیها معاملاتی را که تأیید نشدهاند به عنوان “تأیید نشده” برچسب گذاری میکنند. علاوه بر این، هرچه بیشتر منتظر بمانید، امنیت تراکنش بیشتر است. نوشتن بیش از چند بلوک در بلاکچین بیت کوین در جلوی بلاک با تراکنش شما، احتمال برگشت را بسیار ناچیز میکند.
زمان انتظار توصیه شده وابسته به مقدار تراکنش ارسال شده و بلاکچین دارد. برای پرداختهای کمتر از 1000 دلار بیت کوین، یک تأیید به طور گسترده ایمن تلقی میشود. برای پرداخت تا سقف 10000 دلار، سه تأیید مطمئنتر است. بسیاری شش تراکنش را برای معاملات بسیار بزرگ توصیه میکنند. در شبکه بیت کوین تقریباً هر 10 دقیقه یکبار برای هر بلاک تأیید میشود. برخی از شبکههای بلاکچین زمان تأیید بلاک بسیار کوتاهتری دارند که از ثانیه تا چند دقیقه متغیر است.
حملات دو بار خرج کردن در بلاکچین مورد مطالعات و بحث گسترده قرار گرفته است. تا زمانی که تراکنشهای تأیید نشده را نمیپذیرید، میتوانید پرداختهای بیت کوین را با اطمینان از احتمال حمله دوبار خرج کردن را بسیار ناچیز بدانید.
جمعبندی
یک Double Spending به کاربر اجازه میدهد تا با یک سیستم نقدی الکترونیکی برای سود مالی بازی کند و از همان وجوه بیش از یک بار استفاده کند. به طور سنتی، فقدان راه حل های کافی برای این مشکل مانع پیشرفت در این منطقه شده است.
خوشبختانه، با این حال، استفاده از امضای کور راه حل جالبی را برای طرح های مالی متمرکز پیشنهاد کرد.بعدها، ایجاد مکانیسم های اثبات کار و فناوری بلاکچین، بیت کوین را به عنوان شکل قدرتمندی از پول غیرمتمرکز به وجود آورد – که به نوبه خود الهام بخش هزاران پروژه ارز دیجیتال دیگر بود.
نظرات کاربران