متوسط کریپتو پدیا

چگونه از خود در برابر حملات مجدد (Replay Attacks) محافظت کرد؟

Jeff Garzik اخیرا گزینه محافظت در برابر حملات مجدد (Replay Attacks) را که به طور پیش فرض در btc1 GitHub فعال بود، غیر فعال کرده است و این موضوع باعث ناراحتی شده است زیرا عده زیادی بر این باورند که فقدان محافظت در برابر این حملات منجر به وقوع چیز های وحشتناکی در شبکه خواهد شد.

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

UTXO ها

حملات مجدد

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

UTXO کوتاه شده عبارت unspent transaction output (خروجی تراکنش خرج نشده) می باشدو می توان آنها را مانند چک هایی بانکی تصور کرد که فردی برای شما فرستاده است. شما تنها می توانید آنچه را که دارید خرج کنیدو این چک ها به موجودی کیف پول شما اضافه خواهند شد.

وقتی که مقداری از بیت کوین ها را خرج می کنید، آنچه که کیف پول شما انجام می دهد این است که یک یا تعداد بیشتری از این چک ها را که به شما فرستاده شده است مورد استفاده قرار می دهد و آنها را به عنوان ورودی خرج می کند. پس اگر آلیس برای شما ۵ بیت کوین فرستاده باشد و باب نیز برای شما ۳ بیت کوین فرستاده باشدو شما هم در حال ارسال ۸ بیت کوین برای چارلی باشید، کیف پول شما از هر دو چک ۵ بیت کوینی و ۳ بیت کوینی به عنوان ورودی استفاده می کند. شما ۸ بیت کوین را برای چارلی می فرستید و حالا او یک چک ۸ بیت کوینی دارد (توجه داشته باشید که در این مثال از کارمزد ها چشم پوشی شده است).

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

پس اگر شما تنها یک چک خاص ۱۰۰ بیت کوینی داشته باشید و تنها بخواهید ۰.۰۰۱ بیت کوین را برای فردی بفرستید، چکار باید بکنید؟ در اینجاست که شما از این حقیقت استفاده می کنید که می توان بیت کوین ها را به افراد مختلف در یک تراکنش خاص فرستاد. شما می توانید ۰.۰۰۱ بیت کوین را برای فردی ارسال کنید و ۹۹.۹۹۸۵ بیت کوین را هم برای خود ارسال کنید و ۰.۰۰۰۵ بیت کوین را هم به عنوان کارمزد به ماینر بدهید. موجودی شما حالا متشکل از یک چک جدید ۹۹.۹۹۸۵ بیت کوینی است.

به این شیوه، زمانی که یک UTXO خرج شد، می توان آن را نادیده گرفت. این UTXO یا خرج شده است یا خرج نشده و حالتی فی مابین برای آن وجود ندارد که این کد را بسیار ساده تر می سازد.

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

حملات مجدد (Replay Attacks)

 در شروع یک هارد فورک، UTXO های مشابه بر روی هر دو زنجیره هستند. برای این که یک حمله مجدد کار کند، کل تراکنش باید در هر دو زنجیره تایید شود. با نداشتن محافظت قوی در برابر این نوع حملات، همه تراکنش هایی که از UTXO ها استفاده می کنند در هر دو زنجیره معتبر خواهند بود و در برابر حملات مجدد آسیب پذیر خواهند بود.

اما از آنجا که دو زنجیره در ترکیب تراکنش واگرا می شوند، مجموعه های UTXO شروع به تمایز می کنند. به عنوان مثال تراکنش های coinbase (تراکنش های پاداش ماینر که یکبار در هر بلاک روی می دهد، منظور شرکت Coinbase نیست) بر روی هر دو زنجیره یقینا متفاوت خواهند بود. تراکنش های coinbase بعد از هارد فورک قابل انجام دوباره نخواهند بود. به همین خاطر یک تراکنش coinbase در 2x قابل انجام مجدد در 1x نخواهد بود و همچنین یک تراکنش coinbase در 1x قابل انجام مجدد بر روی 2x نخواهد بود.

البته تراکنش های coinbase که ما آنها را تراکنش های سطح ۰ می نامیم، دارای خروجی هایی هستند و آنها بخشی از مجموعه UTXO خواهند بود. هر تراکنشی که از UTXO های سطح ۰  (که ما آنها را تراکنش های سطح ۱ می نامیم) به عنوان ورودی استفاده کند نیز قابل انجام مجدد بر روی زنجیره دیگر نخواهد بود. به علاوه، هر تراکنشی که از خروجی های تراکنش های سطح ۱ استفاده کند (که ما آنها را تراکنش های سطح ۲ می نامیم) قابل انجام مجدد بر روی زنجیره دیگر نخواهند بود. این روند در مورد تراکنش های سطح ۳ و دیگر سطح ها نیز ادامه پیدا می کند.

توجه داشته باشید که حتی اگر یک تراکنش سطح N خاص ورودی یک تراکنش باشد، این تراکنش قابل انجام مجدد بر روی زنجیره دیگر نخواهد بود. بنابراین یک تراکنش سطح N در 2x قابل انجام مجدد بر روی 1x نیست و تراکنش سطح N بر روی 1x قابل انجام مجدد بر روی 2x نخواهد بود. ما همه خروجی های خرج نشده تراکنش های سطح N را UTXO های محافظت شده در برابر حمله مجدد می نامیم.

این روش خاص قدری دشوار است زیرا تراکنش های coinbase قانون خاصی دارند که آنها را برای ۱۰۰ بلاک غیر قابل خرج می کند. این در حالت عادی حدود ۱۷ ساعت طول می کشد اما بسته به قدرت هشینگ می تواند بسیار بیشتر به طول بیانجامد.

ارائه همزمان

روش دیگری که با آن می توانید بدون نیاز به یک تراکنش coinbase یا یکی از دودمان آن به ایجاد UTXO های محافظت شده در برابر حمله مجدد بپردازید، ایجاد دو تراکنش مختلف است که بسته به همان UTXO هر دو برای خودتان ارسال شده باشند. چنین فرآیندی به صورت زیر کار می کند:

فرض کنیم شما یک UTXO بنام u دارید.

u را در دو تراکنش مختلف خرج می کنید، اولین تراکنش به آدرس ۱ می رود و دومین تراکنش نیز به آدرس ۲ می رود.

تراکنش ۱ را به زنجیره ۱ و تراکنش ۲ را به زنجیره ۲ به طور همزمان و با کارمزد کافی تحویل دهید.

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

از آنجا که حمله مجدد فورا اتفاق نمی افتد و کارمزد ها در هر دو تراکنش به اندازه کافی بالا هستند، باید بر روی هر زنجیره یک خروجی داشته باشید که شما می توانید به عنوان UTXO محافظت شده در برابر حمله مجدد مورد استفاده قرار دهید.

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

استفاده از Locktime

تراکنش های بیت کوین با سگویت

روش نهایی برای ایجاد یک UTXO محافظت شده در برابر حمله مجدد (replay-protected UTXO)، استفاده از چیزی بنام لاک تایم (Locktime) می باشد. این ویژگی را در تعداد زیادی از کیف پول ها نمی توان پیدا کرد اما شما می توانید یک تراکنش را برای داخل شدن در بلاک چین بیت کوین تا شماره بلاک معینی غیر قانونی کنید. فرضا اگر شماره بلاک ۵۰۰۰۰۰ را تعیین کنید، هر بلاکی قبل از آن شماره بلاک که شامل چنین تراکنشی باشد توسط شبکه رد خواهد شد.

کلید کار کردن این فرآیند این است که یک زنجیره به مقدار قابل توجه ای طویل تر از زنجیره دیگر باشد (حداقل ۶ اما بهتر این که بین ۲۰ تا ۳۰ باشد). فرض کنیم زنجیره ۱ در بلاک ۵۰۰۰۱۰ و زنجیره ۲ در بلاک ۵۰۰۰۰۰ است.

در این حالت می گوییم که شما یک UTXO بنام u دارید.

u را در زنجیره ۱ با لاک تایم ۵۰۰۰۱۱ در تراکنش اول خرج می کنید.

به محض اینکه تراکنش اول در بلاک داخل شد (خوشبختانه قبل از بلاک ۵۰۰۰۱۱ بر روی زنجیره ۲)، تراکنش دیگری ایجاد کنید که u را بر روی زنجیره دوم به آدرس مختلفی خرج کند.

اگر تراکنش ۲ قبل از بلاک ۵۰۰۰۱۱ بر روی زنجیره ۲ تایید شد، حالا ما UTXO های محافظت شده در برابر حمله مجدد را بر روی هر دو زنجیره داریم.

محافظت طبیعی در برابر حمله مجدد

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

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

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

این برای شما به چه معنی است؟

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

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

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

ممکن است کیف پول هایی نیز موجود باشند که به شما اجازه دهند که برای ایجاد UTXO های محافظت شده در برابر حمله مجدد تلاش کنید. این باعث می شود که کیف پول ها یا لاک تایم را تعیین کنند و یا لاک تایم را در آخرین بلاک قرار دهند که کیف پول Bitcoin Core چنین کرده است. به عبارت دیگر، شما مجبورید در انتظار ویژگی هایی از جانب کیف پول مورد علاقه خود باشید که با استفاده از آنها این مشکل تسکین داده شود.

نتیجه گیری

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

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

منبع
bitcointechtalk

نوشته های مشابه

اشتراک
اطلاع از
0 دیدگاه
Inline Feedbacks
View all comments
دکمه بازگشت به بالا