آیا در دنیای واقعی میتوانید اسکناسی را که یک مرتبه آن را خرج کردهاید، دوباره خرج کنید؟ پاسخ این سوال منفی است. اما در بستر ارز دیجیتال چطور؟ آیا میتوان یک رمزارز را بیش از یک بار خرج کرد؟ هرچند این اتفاق نباید بیفتد، اما بله این امکان وجود دارد. این یک ایراد اساسی در پروتکلها و شبکههای بلاکچینی است که با نام دوبار خرج کردن یا Double Spending شناخته میشود. برای اینکه دانستههای خود را در مورد این موضوع تکمیل کنید و کاملا متوجه شوید که منظور از دوبار خرج کردن چیست، این مقاله میهن بلاکچین را مطالعه کنید.
نکات کلیدی مطلب
🔸دوبار خرج کردن به شرایطی میگویند که تراکنشی کپی شود و دارایی خرجشده دوباره مورد استفاده قرار بگیرد.
🔸دوبار خرج کردن اتفاقی نیست که به سادگی رخ دهد و یکی از ضعفهای شبکههاست.
🔸وجود چندین مکانیزم اجماع مختلف و بازبینی کدهای قرارداد هوشمند مانع از بروز چنین حملاتی میشود.
🔸بیت کوین و برخی بلاکچینهای دیگر به کمک برچسب زمانی و دفتر کل توزیع شده (DLT)، از حمله Duble Spending جلوگیری میکنند.
🔸دوبار خرج کردن میتواند در انواع مختلفی مثل حمله ۵۱ درصد، حمله فینی و حمله سرعتی رخ دهد.
دوبار خرج کردن چیست؟
دوبار خرج کردن زمانی رخ میدهد که یک رمزارز، بیشتر از یک بار خرج میشود. یعنی یک واحد رمزارزی یکسان برای چندین پرداخت مورد استفاده قرار میگیرد. به این صورت که یک تراکنش کپی و آن مقدار پول دیجیتال دوباره خرج میشود. برای توضیح بهتر مفهوم Double Spending میشود به سراغ مثالی در دنیای واقعی رفت. فرض کنید برای صرف صبحانه، به کافهای رفتهاید. هنگام خروج صورتحساب خود را به شکل نقدی پرداخت میکنید. صندوقدار مبلغ را از شما دریافت میکند و به این ترتیب معامله انجام میشود. شما یک مرتبه این مبلغ را خرج کردهاید؛ پس دیگر امکان دوباره خرج کردن آن وجود ندارد (البته به شرطی که به صندوق کافه دستبرد نزنید و پولتان را ندزدید!)
مسئله از همینجا شروع میشود؛ همین تفاوت بین پول دیجیتال و پول فیزیکی. بیت کوین یا سایر رمزارزها ماهیت فیزیکی ندارند و همین مسئله باعث میشود که امکان Double Spending در آن وجود داشته باشد. در مثالی که بیان کردیم، شما پول را مستقیما به صندوقدار میدهید و او در همان حال پرداخت شما را تایید میکند. اما در بستر رمزارزها، میشود پول را کپی و دوباره از آن استفاده کرد. البته این کار تخلف است و یک عیب اساسی در کریپتو به شمار میرود.
زمانی که پرداخت رمزارزی انجام میدهید، در صورتی که تراکنشتان در حال تایید پرداخت باشد، هرکسی میتواند آن پول دیجیتال را کپی کرده و پرداخت خود را انجام دهد. البته این کار سادهای نیست؛ ولی به هر طریق امکان انجام آن وجود دارد و بلاکچینهای مختلف برای مقابله با این مشکل، راهکارهایی ارائه میکنند. اطلاعات تراکنشها در بلاکچین موجود است و تحت شرایطی میتوان آنها را تغییر داد و در مواقعی خاص استفاده کرد.
حمله دوبار خرج کردن چطور اتفاق میافتد؟
همزمان با ساخت بلاک در بلاکچین، یک هش به آن اختصاص داده میشود که اطلاعاتی شامل برچسب زمانی و اطلاعاتی از بلاک قبلی را به همراه دادههای تراکنش در خود دارد. این اطلاعات به کمک الگوریتمهای مختلف رمزگذاری، رمزنگاری میشوند. ماینرها اطلاعات بلاک را میبینند و آنها را تایید میکنند. با این کار بلاکها تایید میشوند و یک بلاک جدید با برچسب زمانی، اطلاعات تراکنش و هش بلاک قبلی ایجاد میشود.
وقتی کسی بخواهد رمزارزی را دوبار خرج کند، لازم است که یک بلاک مخفی را قبل از ایجاد بلاکچین واقعی ماین کند. سپس این بلاک باید به زنجیره معرفی شود. در این صورت، شبکه آن را به عنوان آخرین مجموعه بلاکها در نظر میگیرد و به زنجیره اضافه میکند. فردی که چنین کاری انجام میدهد، میتواند رمزارزهای خرجشده را پس بگیرد و آنها را دوباره خرج کند.
دوبار خرج کردن ممکن است در شرایطی رخ دهد که یک بلاک غیرنهایی شده، توسط شبکه نهایی تلقی شود؛ یعنی زمانی که تراکنشها انجام شدهاند، اما هنوز روی شبکه قطعی نشدهاند و حتی با احتمال بسیار کم هم امکان تغییر و برگشت آنها وجود دارد. گاهی هم ممکن است نقصی در منطق قرارداد هوشمند وجود داشته باشد که منجر به Double Spending میشود.
چطور میتوان مانع از دوبار خرج کردن شد؟
شبکههای مختلف راهکارهای متفاوتی برای مقابله با مشکل Double Spending دارند. احتمال اینکه کسی بتواند یک بلاک مخفی را به بلاکچین اضافه کند، بسیار ضعیف است؛ چرا که ماینرها باید آن را تایید کنند تا بلوک به زنجیره اضافه شود.
وجود یک مکانیزم اجماع بیعیبونقص میتواند به میزان زیادی به جلوگیری از این قبیل حملات کمک کند. همچنین وجود عنصری به نام نانس نیز مانع از انجام این حمله میشود. نانس یک مقدار رمزگذاریشده است که ارزش آن تنها یک بار قابل استفاده است. به جز این، برچسب زمانی نیز فاکتور دیگری است که مانع از حملات Double Spending میشود. برچسب زمانی ثابت میکند که یک بلاک مشخص در زمانی معلوم و معین به زنجیره اضافه شده است. آدیت قرارداد هوشمند و پروتکلهای بلاکچینی نیز همیشه باعث افزایش امنیت و جلوگیری از خطراتی مانند دوبار خرج کردن میشوند.
همچنین شبکهای مثل اتریوم برای مقابله با این مسئله بار اپراتورهای نود خود را افزایش داده است؛ به این معنا که نودها باید ۳۲ اتر استیک کنند تا به ولیدیتور تبدیل شوند. این مسئله باعث میشود برای ترتیب دادن چیزی مثل حمله Double Spending هزینه زیادی لازم باشد.
راهکار بیت کوین برای جلوگیری از Double Spending
حالا میخواهیم به صورت مشخص شبکه بیت کوین را بررسی کنیم و ببینیم راهکار این بلاکچین برای مقابله با این معضل چیست. بیت کوین به کمک دو عامل از وقوع Double Spendig جلوگیری میکند. این عناصر به شرح زیر هستند:
- دفتر کل توزیعشده (DLT): وجود یک DLT باعث میشود که همه بتوانند تراکنشها را ببینید. هر نود تاریخچه تراکنشها را به طور کامل ذخیره میکند. به همین خاطر میتواند تایید کند که هیچ کوینی دوبار خرج نمیشود.
- برچسب زمانی (Time Stamp): بلاکها به کمک برچسب زمانی مهر زده میشوند. وقتی دو تراکنش بخواهند بیت کوین یکسانی را دوباره خرج کنند، این طراحی به تمام نودها اجازه میدهد که متوجه شوند کدامیک از دو تراکنش معتبر و کدام نامعتبر هستند.
فرض کنید یک بیت کوین دارید و قصد دارید آن را دو بار خرج کنید. شما یک تراکنش انجام دادهاید و میخواهید طی تراکنشی دیگر، همان بیت کوین را به شخص دیگری ارسال کنید. هر دو تراکنش وارد مجموعه تراکنشهای تاییدنشده میشوند؛ اما فقط اولین تراکنش تایید میشود و در بلوک بعدی قرار میگیرد. تراکنش دوم به دلیل عدم تایید ماینرها رد میشود و از شبکه بیرون کشیده خواهد شد. همچنین اگر دو ماینر همزمان دو تراکنش را تایید کنند، تراکنشی که بیشترین تاییدیهها را از ماینرها گرفته باشد در بلوک جا میگیرد.
انواع حمله Double Spending
دوبار خرج کردن میتواند به اشکال گوناگونی اتفاق بیفتد. در ادامه به چند مورد از آنها اشاره میکنیم.
- حمله فینی (Finney Attack): حمله فینی زمانی رخ میدهد که شخص یک تراکنش تاییدنشده را روی شبکه بپذیرد. در این روش، ماینر همان حملهکننده است. او تراکنشی را در یک بلاک قرار میدهد و بخشی از کوینهای خود را بدون انتشار تراکنش روی شبکه، به خودش ارسال میکند. وقتی ماینر یک بلوک از پیش ماینشده پیدا کند، همان کوینها را در تراکنشی دیگر به آن بلوک ارسال میکند. احتمال دارد تراکنش دوم توسط سایر ماینرها رد شود؛ اما این امر ممکن است کمی زمان ببرد. برای جلوگیری از این حمله توصیه میشود که دریافتکننده، شش بلوک منتظر بماند و پس از تایید این شش بلوک و اطمینان از نهایی شدن تراکنش، از دریافت وجه مطمئن شود.
- حمله سرعتی (Race Attack): در این حمله، شخص حملهکننده دو تراکنش را به صورت متوالی و سریع روی شبکه ارسال میکند. حملهکننده یک تراکنش تاییدنشده را برای قربانی ارسال میکند. در همین حال یک تراکنش دیگر روی شبکه منتشر میکند. از آنجایی که قربانی تراکنش خود را زودتر دیده است، گمان میکند که پرداخت صورت گرفته است؛ اما در سمت دیگر، سایر شبکه تراکنش دوم (یعنی همان Double Spend) را در ابتدا دیدهاند. از این رو تراکنش قربانی تایید نمیشود و او پولی دریافت نمیکند.
- حمله ۵۱ درصد (51% Attack): حمله ۵۱ درصد زمانی اتفاق میافتد که حملهکننده کنترل ۵۱ درصد از نودهای شبکه را در اختیار داشته باشد. در نتیجه قادر به تغییر بلاکچین و تایید این تغییرات خواهد بود. این کار باعث میشود حملهکننده بتواند رمزارزها را دو بار یا بیشتر خرج کند. البته باید توجه کرد وقوع چنین حملهای در واقعیت دور از دسترس است؛ چرا که نیازمند هزینه بسیار بالایی است.
- حملات تراکنشهای تاییدنشده (Unconfirmed Transaction Attacks): این حملات افرادی را نشانه میگیرد که تراکنشهای تاییدنشده را میپذیرند؛ یعنی هنوز تراکنش نهایی نشده ولی آنها تراکنش را قطعی قملداد میکنند. چنین حملاتی نیازمند زمانبندی دقیق هستند و باید طوری برنامهریزی کنند که سلسله وقایع مختلف با ترتیب خاصی انجام شوند.
سوالات متداول (FAQ)
- دوبار خرج کردن چیست؟
شرایطی است که طی آن فرد میتواند یک دارایی را خرج کند و بار دوم نیز از آن برای پرداختی دیگر استفاده کند. - چطور میشود از دوبار خرج کردن جلوگیری کرد؟
شبکههای بلاکچینی مختلف راهکارهای متفاوتی برای مقابله با Double Spending دارند. وجود قراردادهای هوشمند دقیق و مکانیزمهای اجماع مطمئن، در کنار فناوریهایی مانند برچسب زمانی و دفتر کل توزیعشده، عواملی هستند که مانع از بروز حمله دوبار خرج کردن میشوند.
جمعبندی
فناوری بلاکچین همچنان در حال پیشرفت و توسعه است و هنوز مشکلات و باگهای مختلفی دارد. یکی از ایراداتی که به برخی از شبکهها وارد است، امکان دوبار خرج کردن یک دارایی است؛ اتفاقی که میتواند امنیت این بستر را زیر سوال ببرد. البته وجود فناوریهای مانند دفتر کل توزیعشده، قرارداد هوشمند، مکانیزم اجماع و برچسب زمانی، به میزان زیادی مانع از انجام این حمله میشود و به طور کلی، به راحتی نمیتوان Double Spending را انجام داد. حالا که فهمیدید دوبار خرج کردن چیست و چطور انجام میشود، به نظرتان کدام شبکه در برابر چنین حملهای به خوبی ایستادگی میکند؟ آیا خودتان تاکنون قربانی چنین حملاتی شدهاید؟ در قسمت نظرات، دیدگاه خود را برای ما بنویسید.