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

دوبار خرج کردن چگونه رخ میدهد؟
در بیتکوین، هر تراکنش برای خرج کردن دارایی به خروجیهای خرجنشده تراکنشهای قبلی ارجاع میدهد. اگر دو تراکنش به یک خروجی یکسان متکی باشند، هر دو نمیتوانند در تاریخچه معتبر شبکه باقی بمانند. فرستنده ممکن است آنها را با فاصله کوتاه برای بخشهای متفاوت شبکه بفرستد. در این فاصله، دو گیرنده میتوانند اعلانهایی ببینند که ظاهراً پرداخت به هر کدام را نشان میدهد.
گرههای شبکه تراکنشها و بلوکها را با قواعد مشترک بررسی میکنند. وقتی یکی از دو تراکنش ناسازگار در تاریخچه پذیرفته شود، دیگری به دلیل مصرف شدن همان دارایی اعتبار ندارد. در بیتکوین، بلاک چین تاریخچه عمومی تراکنشها را ثبت میکند و سازوکار اثبات کار به شبکه کمک میکند بر سر تاریخچه معتبر به توافق برسد. جزئیات این فرایند در شبکههای دیگر، از جمله شبکههایی که از اثبات سهام استفاده میکنند، یکسان نیست؛ هدف مشترک این است که شبکه یک سابقه معتبر از مصرف دارایی داشته باشد.
یک مثال ساده
فرض کنید سارا فقط یک واحد دارایی قابل خرج در کیف پول خود دارد. او تراکنشی میسازد که آن واحد را برای فروشنده یک کتاب میفرستد. سپس تراکنش ناسازگار دیگری میسازد که همان دارایی را به نشانی دیگری میفرستد. اگر فروشنده بلافاصله پس از دیدن اعلان تراکنش اول کتاب را تحویل دهد، هنوز ممکن است پرداخت مورد نظر او در تاریخچه معتبر شبکه ثبت نشود.
در این مثال، نتیجه به آن بستگی دارد که شبکه کدام تراکنش را میپذیرد و آیا تاریخچه پس از ثبت اولیه تغییر میکند یا نه. ثبت یکی از پرداختها به معنای ایجاد دارایی تازه نیست؛ مسئله، رقابت دو درخواست برای خرج کردن همان دارایی است. نمونه فرضی نشان میدهد چرا وضعیت «ارسال شده» یا «در انتظار» برای تصمیمی مانند تحویل کالا کافی نیست.
چرا تأیید تراکنش مهم است؟
گیرنده میتواند پیش از تحویل کالا یا ارائه خدمت، وضعیت پرداخت را بررسی کند. در بیتکوین، قرار گرفتن تراکنش در یک بلوک نخستین تأیید آن است و اضافه شدن بلوکهای بعدی، تغییر تاریخچه مربوط به آن را دشوارتر میکند. تعداد تأیید مناسب به ارزش پرداخت و میزان ریسکی که گیرنده میپذیرد بستگی دارد؛ یک عدد ثابت برای همه موقعیتها وجود ندارد.
این موضوع برای فروشگاهی که میخواهد پس از دریافت رمزارز سفارش را تحویل دهد، کاربرد مستقیم دارد. همچنین به کاربر کمک میکند تفاوت میان اعلان کیف پول، ثبت تراکنش در بلوک و پایداری بیشتر آن پس از تأییدهای بعدی را بفهمد. در شبکههای مبتنی بر اثبات سهام نیز مفهوم نهایی شدن تراکنش اهمیت دارد، هرچند قواعد و زمانبندی آن باید بر اساس همان شبکه بررسی شود.
محدودیتها و نکتههای عملی
تأییدها خطر دوبار خرج کردن را کاهش میدهند، اما هر اعلان اولیه پرداخت تضمین وصول آن نیست. تراکنش تأییدنشده ممکن است هرگز در تاریخچه معتبر قرار نگیرد. حتی پس از ثبت در یک بلوک نیز امکان تغییر بلوکهای تازه وجود دارد؛ هرچه تراکنش در تاریخچه تثبیت بیشتری پیدا کند، جایگزین کردن آن دشوارتر میشود. میزان این خطر به طراحی شبکه و شرایط حمله وابسته است.
نباید قواعد بیتکوین را بدون بررسی به همه رمزارزها تعمیم داد. مکانیزم اجماع، شیوه انتخاب تاریخچه معتبر و معنای نهایی شدن تراکنش در شبکههای مختلف فرق میکند. برای تصمیم عملی، گیرنده باید وضعیت تراکنش را در شبکه درست بررسی کند و سیاست پذیرش پرداخت را با نوع خدمت و ریسک آن هماهنگ سازد. دوبار خرج کردن نام یک مشکل و تلاش برای سوءاستفاده از آن است؛ صرف دیدن دو تراکنش ناسازگار ثابت نمیکند که هر دو پرداخت انجام شدهاند.

