ایران چارت بلاک چین دوبار خرج کردن (Double Spending) در بلاک چین

دوبار خرج کردن (Double Spending) در بلاک چین

تخمین زمان مطالعه

۸ دقیقه
شنبه 25 اردیبهشت 1400
دوبار خرج کردن (Double Spending) در بلاک چین

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

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


مفهوم دوبار خرج کردن

در سیستم‌های پولی دیجیتال، «دوبار خرج کردن» (Double Spending) زمانی به وجود می‌آید که یک مقدار ثابت از دارایی‌ها را به‌طور همزمان برای دو گیرنده ارسال کنیم و شبکه نتواند تشخیص دهد که این دو مبلغ ارسال‌شده در حقیقت یکی هستند و هر کدام را به عنوان یک تراکنش معتبر بشناسد. در چنین حالتی کاربران هم مجبورند پولی که دریافت کرده‌اند را تأیید کنند، درحالی‌که واقعیت این است که دقیقاً آن پول در جای دیگری هم خرج شده است.

در طراحی سیستم‌های پولی دیجیتال باید این اطمینان وجود داشته باشد که هیچ کدام از اعضای شبکه تحت هیچ شرایطی نتوانند واحدهای پولی خود را کپی کنند. اگر یک کاربر بتواند موجودی خود را با چند بار کپی کردن سکه‌هایش، مثلاً از ۱۰ سکه به ۱۰۰ سکه برساند، تمام شبکه به خطر خواهد افتاد. به طور مشابه، هیچکس هم نباید بتواند تمام موجودی‌اش را که مثلاً ۱۰ سکه است، یکبار برای گیرنده‌ی اول و بار دیگر برای گیرنده‌ی دوم ارسال کند. پس تمام سیستم‌های پولی دیجیتال باید مکانیزمی داشته باشند که از بروز چنین مسائلی جلوگیری کند.

مشکل دوبار خرج کردن در بلاک چین


راه های جلوگیری از دوبار خرج کردن

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


جلوگیری از مشکل دوباره خرج کردن در شبکه متمرکز

همان‌طور که گفتیم، یکی از راه‌های جلوگیری از مشکل دوبار خرج کردن، استفاده از راه حل متمرکز است. پیاده‌سازی سیستم‌های متمرکز آسان‌تر است و ایده‌ی کلی این است که یک واحد مرکزی تعیین می‌شود تا مدیریت و کنترل تمام اتفاقاتی که در شبکه می‌افتد را به عهده بگیرد. یکی از نمونه‌های بارز چنین طرحی،‌ سیستم پول الکترونیک «eCash» است که توسط David Chaum ساخته شده است. در این سیستم پولی، کاربران می‌توانند تراکنش‌های ناشناس و غیر قابل ردیابی را ارسال کنند.

سیستم eCash برای اینکه بتواند یک دارایی دیجیتال که دقیقاً معادل یک پول فیات است را در اختیار کاربران قرار دهد، به طوری که آن‌ها قادر باشند آن را مثل پول واقعی خرج کنند یا به یکدیگر ارسال کنند، از نوعی امضای الکترونیکی که به «Blind Signatures» معروف است استفاده می‌کند. در چنین سیستمی، اگر یک کاربر بخواهد ۱۰۰ دلار برای شخص دیگری ارسال کند، ابتدا آن را به‌طور مثال به ۵ بخش تقسیم می‌کند و به هر کدام یک یا چند عدد تصادفی اختصاص می‌دهد. برای اینکه حتی خود سیستم یا بانک هم نتواند این انتقال را ردیابی کند،‌ کاربر به هر کدام از این بخش‌ها یک فاکتور دیگر اضافه می‌کند که به آن «Blinding Factor» می‌گویند.

در حقیقت یک درخواست از کاربر به بانک ارسال می‌شود که در آن اعلام شده هر کدام از این ۵ بخش نشان‌دهنده‌ی درصدی از آن ۱۰۰ دلار هستند. او حالا می‌تواند موجودی خود را خرج کند. فرض می‌کنیم این کاربر به یک رستوران می‌رود و می‌خواهد ۴۰ دلار هزینه‌ی غذایش را بپردازد. قسمت جالب ماجرا اینجاست؛ کاربر برای اینکه بتواند ۴۰ دلار را بپردازد، می‌تواند Blinding factor (که در اینجا چیزی مثل رمز یا کلید خصوصی است) مربوط به بخش‌هایی از موجودی خود که ۴۰ دلار ارزش دارد را به فروشنده بدهد تا او بتواند به ۴۰ دلار از موجودی کاربر دسترسی پیدا کند و از بانک درخواست نماید آن را به حساب رستوران منتقل کند. بانک برای این کار امضاها را تطبیق می‌دهد و در صورت برقراری تمامی شرایط، ۴۰ دلار را به حساب رستوران واریز می‌کند. نکته‌ی مهم اینجاست که بانک در این مرحله امضاهای مربوط به آن ۴۰ دلار را از حساب کاربر می‌سوزاند و او دیگر به آن ۴۰ دلار دسترسی نخواهد داشت و حتی رستوران هم اگر بخواهد آن ۴۰ دلار را خرج کند، باید امضاهای جدید بسازد.

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

Double Spending چیست


جلوگیری از مشکل دوبار خرج کردن در شبکه غیرمتمرکز

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

بزرگ‌ترین دستاورد شبکه‌ای مثل بیت کوین این بود که توانست در وایت پیپر (White Paper) خود راه‌حلی عملی برای مشکل دوبار خرج کردن ارائه دهد. در حقیقت خالق بیت کوین از ساختار داده‌ای خاصی برای پیاده‌سازی شبکه‌ی بیت کوین استفاده کرد که ما آن را با نام بلاک چین  (Blockchain) می‌شناسیم.

بلاک چین پایگاه داده‌ی خاصی است که به همه اعضا یا «نود»ها (Nodes) اجازه می‌دهد یک نسخه از این پایگاه داده یا «دفترکل» (Ledger) را داشته باشند. نودها با استفاده از نرم‌افزار شبکه همیشه دفترکل خود را آپدیت نگه می‌دارند. به کمک چنین ساختاری، همه‌ی اعضا می‌توانند تاریخچه‌ی تمام تراکنش‌های شبکه از روز اول تا حالا را مشاهده کنند. از این طریق می‌توان جلوی هرگونه اقدام غیرقانونی مثل دوبار خرج کردن را گرفت.

بیایید نگاهی به اتفاقاتی که در یک شبکه‌ی بلاک چین (مثل بیت کوین) می‌افتد بیندازیم تا ببینیم یک تراکنش چگونه به شکلی امن انجام شود. وقتی کاربر یک تراکنش ارسال می‌کند،‌ شبکه آن را بلافاصله تأیید نمی‌کند. ابتدا باید آن تراکنش بررسی شود و در صورت داشتن اعتبار و موجودی کافی، به همراه تعداد دیگری از تراکنش‌ها در یک بلاک قرار بگیرد و به زنجیره‌ی اصلی متصل شود. بعد از این مراحل می‌توان یک تراکنش را تأییدشده در نظر گرفت و مطمئن بود که این مقدار پول، همزمان در جای دیگری خرج نشده‌ است.

زمانی که یک تراکنش تأیید می‌شود، مالکیت سکه‌ها یا پولِ جابه‌جاشده به گیرنده واگذار می‌شود و تمام اعضا این مسئله را مشاهده و تأیید می‌کنند. البته پیشنهاد می‌شود که بهتر است بعد از تأیید شدن بلاک، منتظر تشکیل چند بلاک دیگر نیز بمانیم. هر بلاکی که بعد از بلاک مورد نظر ما به زنجیره اضافه شود، در حقیقت یک مهر تأیید قوی‌تر است و احتمال خرابکاری یا دستکاری بلاک ما را کمتر می‌کند.

مثال رستوران را به خاطر بیاورید. فرض کنید کاربر مورد نظر این بار می‌خواهد همان ۴۰ دلار را به‌صورت بیت کوین (BTC) بپردازند. کاربر برای مثال مقدار ۰.۰۰۵ بیت کوین را به آدرس کیف پول رستوران ارسال می‌کند. این تراکنش امضای کاربر را به همراه دارد و ثابت می‌کند که این مقدار موجودی در کیف پول او است و همچنین اجازه‌ی خرج کردن آن‌ها را هم دارد. رستوران زمانی می‌تواند تراکنش را انجام‌شده در نظر بگیرد که بلاکِ حاوی این تراکنش به بلاک چین اضافه شده باشد. البته در مورد بیت کوین پیشنهاد می‌شود که تا ۶ بلاک بعدی منتظر تأیید بمانید که نهایتاً ۱ ساعت طول خواهد کشید.

دوبار خرج کردن در بیت کوین


مشکل دوبار خرج کردن در بیت کوین

در طراحی شبکه‌ی بیت کوین توجه زیادی به مسئله‌ی دوبار خرج کردن شده است، به همین خاطر توصیه می‌شود که تا زمانی که بلاکِ حاوی تراکنش به زنجیره‌ی اصلی اضافه نشده، آن را انجام‌شده در نظر نگیرید. اما وقتی بلاک مربوطه تشکیل و به بلاک چین اضافه شود، دستکاری و برگرداندن آن کار بسیار سختی خواهد بود.

برای اجرای عملیات دوبار خرج کردن در یک شبکه‌ی بلاک چین مثل بیت کوین، راه‌های مختلفی وجود دارد. در ادامه ۳ مورد از آن‌ها را بررسی می‌کنیم.

  • حمله ۵۱ درصدی (51% attack): اگر یک نود یا سازمان مجزا بتواند بیش از نیمی از توان پردازشی شبکه را در اختیار خودش بگیرد، می‌تواند وضعیت تراکنش‌های بلاک‌ها را به‌صورت دلخواه تغییر دهد. پیاده‌سازی چنین حمله‌ای به شبکه‌ی بیت کوین بسیار بعید است، ولی برخی بلاک چین‌ها این حمله را تجربه کرده‌اند.
  • حمله مسابقه (Race attack): این حمله زمانی می‌تواند رخ دهد که گیرنده، بدون اینکه منتظر تأیید شبکه بماند، تراکنش را انجام‌شده در نظر بگیرد. در این نوع حمله، هکر ۲ تراکنش متناقض را به‌طور همزمان به شبکه ارسال می‌کند که یکی برای گیرنده‌ی اصلی و دیگری برای آدرس دیگری است که متعلق به هکر است. او منتظر می‌ماند تا شبکه تراکنشی را تأیید کند که درنتیجه‌ی آن پول به حساب خودش منتقل شود.
  • حمله فینی (Finney attack): در حمله فینی، هکر ابتدا یک تراکنش خاص را به‌صورت ماین‌شده در یک بلاک قرار می‌دهد و قبل از اینکه آن را به شبکه ارسال کند، همان تراکنش را به‌صورت واقعی انجام می‌دهد و پول مورد نظر را یک بار خرج می‌کند. سپس بلاکی که از قبل ماین‌شده را به شبکه می‌فرستد که باعث می‌شود تراکنش قبلی او غیرمعتبر شود. این نوع حمله نیاز به رعایت ترتیب بسیار خاصی در ارسال اطلاعات دارد و مثل حمله مسابقه،‌ زمانی می‌تواند رخ دهد که گیرنده منتظر تأیید بلاک نماند و تراکنش خود را انجام‌شده در نظر بگیرد.

همان‌طور که دیدید، اگر گیرنده‌ی تراکنش مقداری صبر داشته باشد و تأیید چند بلاک بعدی هم اتفاق بیفتد، بعید است از مشکل دوبار خرج کردن آسیبی ببیند.

دوبار خرج کردن در ارز دیجیتال


سخن پایانی

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

به مرور راه‌حل‌هایی برای جلوگیری از این مسئله به ‌کار گرفته شد که «Blind signatures» در سیستم‌های متمرکز یکی از آن‌ها است. در نهایت با استفاده از فناوری بلاک چین و الگوریتم‌های اجماع مثل گواه اثبات کار و ساخته شدن شبکه‌ی بیت کوین، سیستم پولی غیرمتمرکز متولد شد که تا حد زیادی می‌تواند جلوی مشکل دوبار خرج کردن را بگیرد.

تگ ها:

درباره نویسنده

قاسم میلاجردی

مهندسی نرم‌افزار خوندم و عاشق مسائل فنی دنیای کامپیوترهام. بیت کوین همون سالی متولد شد که من وارد دانشگاه شدم و حتی یه مقاله هم راجع‌بهش خوندم. اون موقع‌ها قیمتش ۱۰ دلار بود! دیگه نمیشه به گذشته برگشت و ارزدیجیتال خرید ولی میشه توی این زمینه مطالعه کرد و آینده بهتری رو ساخت؛ به همین خاطر تولید محتوای تخصصی کریپتوها رو به عنوان شغل اصلی انتخاب کردم و ازین بابت واقعا خوشحالم.

نظر شما

نظرات کاربران