دوبار خرج کردن یکی از مشکلات بالقوه در سیستم پولی است؛ به این صورت که یک وجه همزمان برای دو گیرنده ارسال می شود. پروتکلی که این مشکل را حل نکند، بدون انجام اقدامات مقابله ای کافی تضعیف خواهد شد، کاربران به هیچ طریقی نمی توانند مطمئن باشند که وجهی که دریافت می کنند، پیشتر به فرد دیگری پرداخت نشده باشد.
در زمینه پول دیجیتال، کسب اطمینان از کپی نشدن واحدهای خاص بسیار مهم است.اگر آلیس بتواند 10 واحد دریافت کرده، آن را 10 بار کپی و پیست کند و صاحب 100 واحد شود، کل سیستم تضعیف خواهد شد. همچنین اگر آلیس بتواند همان 10 واحد را به صورت همزمان هم برای باب و هم برای کارول ارسال کند، سیستم مشکل پیدا خواهد کرد. بنابراین، برای اینکه عملکرد مناسب پول های دیجیتالی، باید مکانیزم هایی وجود داشته باشد که از این چنین اقدامات جلوگیری نماید.
چطور می توان از دوبار خرج کردن جلوگیری کرد؟
رویکرد متمرکز
به کارگیری روش های متمرکز بسیار آسان تر از کار با جایگزین های آن است. این رویکرد شامل یک ناظر است که سیستم را مدیریت کند و بر صدور و توزیع واحدها کنترل داشته باشد. eCash ساخته دیوید چام می تواند یک مثال خوب در جهت راهکار متمرکز برای مشکل دوبار خرج کردن باشد.
برای اینکه دارایی های دیجیتال مانند پول دیجیتال (با قابلیت تبادل ناشناس و همتا به همتا) در اختیار کاربران قرار بگیرد، بانک می تواند از امضای کور استفاده کند. رمزنگار دیوید چام در مقاله خود در سال 1982، به معرفی امضای کور برای پرداخت های غیرقابل ردیابی پرداخت.
در این صورت، اگر یک کاربر (مثلاً با نام دن) بخواهد مبلغ 100$ را به پول دیجیتالی تبدیل کند، باید اول بانک را مطلع سازد. به فرض اینکه این مبلغ در حسابش موجود باشد، اکنون باید یک عدد تصادفی (یا چند عدد برای مبلغ بیشتر) ایجاد کند. فرض کنیم که دن پنج عدد تصادفی ساخته و به هر یک ارزش 20$ اختصاص می یابد. برای جلوگیری از ردیابی توسط بانک، دن باید یک عامل کور را به هر یک از این اعداد افزوده و آن ها را مبهم بسازد.
سپس، دن این داده ها را به بانک تحویل می دهد و 100 دلار از حساب اون برداشت می شود و پیغام هایی را امضا می کند که بر اساس آن ها هر یک از 5 اطلاعات با 20 دلار قابل بازخرید است. اکنون دن می تواند مبلغی که توسط بانک صادر شده است را خرج نماید. به رستوران ارین می رود و غذایی می خرد که 40 دلار قیمت دارد.
دن می تواند با حذف عامل کور، شماره تصادفی مرتبط با «قبض» پول دیجیتال را نمایان کند؛ این شماره به عنوان یک شناسه منحصر به فرد برای هر واحد عمل می کند (همچون شماره سریال). دن دو شماره را در اختیار ارین قرار می دهد و ارین نیز باید به سرعت آن ها را از بانک بازخرید کند، تا دن نتواند آن ها را در اختیار فروشنده دیگری قرار دهد. پس از بررسی اعتبار امضاها، اگر همه چیز صحیح باشد، بانک 40 دلار به حساب ارین منتقل می کند.
قبوض استفاده شده بلا استفاده می شوند و اگر ارین نیز بخواهد موجودی خود را به همین شیوه خرج کند، باید قبض جدید صادر شود. eCash چام برای نقل و انتقالات خصوصی ارزشمند است. اما در زمینه انعطاف پذیری با شکست مواجه می شود، چرا که بانک نقطه اصلی شکست است. یک قبض به خودی خود هیچ ارزشی ندارد، چرا که ارزش آن تنها از خواست بانک برای تعویض آن با دلار شکل می گیرد. مشتریان تحت سلطه بانک قرار دارند و برای دریافت پول باید بر بانک تکیه کنند. ارزهای رمزپایه به دنبال یافتن راه چاره برای همین مشکل هستند.
رویکرد غیرمتمرکز
بدون وجود ناظر، کسب اطمینان از دوبار خرج نشدن پول در یک اکوسیستم می تواند چالش برانگیزتر باشد. شرکت کنندگان باید قدرت برابر داشته باشند و از قوانینی پیروی کنند که مانع از کلاهبرداری شده و تمامی کاربران را به رفتار صادقانه تشویق کند.
بزرگ ترین نوآوری که در وایت پیپر بیت کوین ارائه شد، راهکاری برای مشکل دوبار خرج کردن بود. ساتوشی ناکاموتو ساختاری از اطلاعات را ارائه داد که هم اکنون همه آن را با نام بلاکچین می شناسند.
بلاکچین در واقع یک پایگاه داده با خصوصیاتی منحصر به فرد است. مشارکت کنندگان در این شبکه (که با نام نود خطاب می شوند) یک نرم افزار تخصصی را اجرا می کنند که امکان همگام سازی نسخه ای از پایگاه داده با دیگر همتایان را برایشان فراهم می کند. در نتیجه این امر، تمامی شبکه می توانند تاریخچه تراکنش ها از اولین بلاک را مورد بررسی قرار دهند. قابل بررسی بودن بلاکچین به صورت عمومی، شناسایی و جلوگیری از فعالیت های کلاهبردارانه ای همچون دوبار خرج کردن را آسان می سازد.
هنگامی که یک کاربر تراکنشی را منتشر کند، بلافاصله به بلاکچین اضافه نمی شود، بلکه در ابتدا باید از طریق استخراج در یک بلاک قرار بگیرد. در این صورت، گیرنده باید بداند که تنها در صورتی تراکنش تایید می شود که بلاک آن به بلاکچین اضافه شده باشد. در غیر این صورت، ممکن است مشخص شود که فرستنده همان کوین را برای دیگری ارسال کرده و گیرنده این کوین ها را از دست خواهد داد.
به محض تایید شدن تراکنش، امکان دوبار خرج کردن کوین وجود ندارد، چرا که مالکیت آن به کاربر جدیدی واگذار شده است و تمام شبکه می توانند این مسئله را تایید کنند. به همین دلیل بسیاری پیشنهاد می کنند که پیش از پذیرش تاییدیه یک تراکنش، منتظر چندین تاییدیه دیگر باشید. با ایجاد هر بلاک جدید، اصلاح یا بازنویسی زنجیره (در حملات 51 درصد) سخت تر می شود.
برگردیم به سناریو رستوران. دن به این رستوران باز گشته و متوجه علامت «امکان پرداخت با بیت کوین وجود دارد» می شود. از غذای قبلی لذت برده است، بنابراین دوباره همان را سفارش می دهد. قیمت این غذا 0.005 BTC می شود.
ارین یک آدرس عمومی در اختیار دن می گذارد، تا بیت کوین ها را به آن منتقل کند. دن تراکنش را منتشر می کند؛ تراکنش درواقع یک پیغام امضا شده با این مضمون است که 0.005 BTC که در مالکیت دن بوده، هم اکنون در مالکیت ارین قرار دارد. هرکسی که تراکنش امضا شده دن را ببیند، می تواند تایید که مالکیت کوین ها با او بوده و بنابراین حق ارسال آن ها را داشته است.
همانطور که گفتیم، تراکنش در حالتی دارای اعتبار است که در بلاکی قرار گرفته و تایید شود. پذیرش تراکنش تایید نشده، مثل این است که در مثال قبلی 40$ eCash پذیرفته شود اما بلافاصله در بانک نقد نگردد. این کار به فرستنده اجازه می دهد که آن را به دیگران نیز بفرستد. بنابراین پیشنهاد می شود که ارین پیش از پذیرش پرداخت دن، حداقل تا زمان تایید 6 بلاک (تقریباً یک ساعت) صبر نماید.
دوبار خرج کردن در بیتکوین
بیتکوین به صورتی طراحی شده است که حداقل در زمانی که پروتکل مطابق انتظار استفاده می شود، از حملات دوبار خرج کردن جلوگیری کند. به این معنی که اگر افراد منتظر تایید تراکنش ها در بلاک بمانند، فرستنده نمی تواند به راحتی آن را برگشت بزند. برای انجام اینکار باید بلاکچین را «معکوس» کند که نیازمند قدرت هش کردن بسیار بسیار زیادی است.
گرچه حملات دوبار خرج کردن زیادی وجود دارند که هدفشان افرادی هستند که تراکنش های تایید نشده را می پذیرند. برای مثال، در خرید و فروش هایی با قیمت پایین، ممکن است فروشنده تمایلی به صبر کردن برای قرار گرفتن تراکنش در بلاک نداشته باشد. یک رستوران فست فودی شلوغ نمی تواند منتظر بماند تا شبکه هر خرید را مورد پردازش قرار دهد. بنابراین، اگر یک کسب و کار پرداخت «آنی» را از مشتریانش قبول کند، در معرض خطر این حملات قرار می گیرد. ممکن است یک مشتری همبرگر سفارش دهد، هزینه آن را پرداخت کند، سپس بلافاصله همان وجه را به آدرس خودش ارسال کند. با کارمزد بیشتر، این تراکنش زودتر تایید شده و بنابراین تراکنش پیشین را از اعتبار ساقط می سازد.
سه روش مشهور برای دوبار خرج کردن وجود دارد:
- حملات 51 درصدی: زمانی رخ می دهد که یک ماهیت یا سازمان، کنترل بیش از 50% نرخ هش را در اختیار داشته باشد؛ این امر امکان خارج کردن یا اصلاح سفارش معاملات را برای آن ها ایجاد می کند. این حمله در بیتکوین بسیار غیرمحتمل است، اما در دیگر شبکه ها رخ داده است.
- حملات رقابتی: دو تراکنش متناقض که از یک وجه استفاده کرده اند، به ترتیب منتشر می شوند، اما تنها یک تراکنش تایید می شود. هدف مهاجم بی اعتبار کردن پرداخت توسط اعتبار بخشیدن به تراکنشی است که به سود اوست (مثل ارسال همان وجه به آدرسی که خود کنترل می کند). حملات رقابتی نیازمند این است که گیرنده تراکنش تایید نشده را بپذیرد.
- حملات فینی: مهاجم یک تراکنش را از قبل در بلاک ماین می کند، در حالی که آن را به صورت آنی منتشر نمی نماید. در عوض، همان کوین ها را در تراکنش دیگری مصرف نموده سپس بلاکی که پیشتر ماین کرده بود را منتشر می کند و این امر می تواند پرداخت را از اعتبار ساقط کند. حملات فینی نیاز به توالی خاصی از وقایع دارد و همچنین مشروط به پذیر تراکنش تایید شده از سوی دریافت کننده می باشد.
همانطور که می بینید فروشنده ای که منتظر تایید بلاک بماند می تواند ریسک حملات دوبار خرج کردن را به میزان چشمگیری کاهش دهد.
سخن آخر
دوبار خرج کردن به کاربر اجازه می دهد که سیستم پولی الکترونیکی را برای منافع مالی خود به بازی بگیرد و از یک وجه بیشتر از یک بار استفاده نماید. کمبود راهکارهای کافی برای این مشکل، سد راه پیشرفت در این زمینه بوده است.
گرچه خوشبختانه استفاده از امضای کور، راهکار خوبی برای طرح های مالی متمرکز بوده است. پس از آن، ایجاد مکانیزم های اثبات کار و فناوری بلاکچین منجر به تولد بیتکوین، به عنوان شکل قدرتمندی از پول غیرمتمرکز شد. همین امر به نوبه خود توانست الهام بخش هزاران پروژه دیگر در زمینه ارزهای رمزپایه باشد.