از آنجایی که کارمزد تراکنش ها نکته مثبتی در انجام تراکنش ها میباشد، این سوال پیش میآید که کیف پول ها چگونه باید کارمزد تراکنش ها را مدیریت کنند؟ در این مقاله به توضیح دقیق تر این موضوع میپردازیم.
قوانین اصلی
برای پاسخ به این سوال ابتدا باید چند قانون اصلی وضع کنیم که اصلا به دنبال حل چه موضوعی هستیم. ما در این مقاله فقط بر روی حل مشکل کیف پول های مشتریان متمرکز خواهیم بود و از ریزکانال ها (مایکرو چنل ها) که تعداد تراکنش ها را به طور چشمگیری کاهش میدهند اما وجود چند مورد از آنها در بلاک چین ضروری است چشم پوشی میکنیم.
کارمزد تراکنش ها چگونه باید باشند؟
قبل از آنکه به نحوه محاسبه کارمزد تراکنش ها توسط کیف پول ها بپردازیم، باید بدانیم که کارمزد تراکنش ها چگونه باید باشند. راهکاری کاملا ساده و مشخص برای این پرسش وجود دارد و اینگونه است که کارمزد تراکنش ها باید توسط عرضه و تقاضا تعیین شود. قیمت در نقطه ای مشخص میشود که منحنی های عرضه و تقاضا به یکدیگر میرسند. اما اگرچه منحنی های عرضه و تقاضا اکثر اوقات دقیق میباشند اما مدلی ساده برای استفاده در موارد مختلف میباشند، زیرا زمان را مد نظر قرار نمیدهند. در شرایط واقعی، فضای موجود برای تراکنش ها به شدت آشفته است زیرا هر بار که بلاکی استخراج میشود، این فضا بیشتر در دسترس قرار میگیرد، و استخراج بلاک نیز فرآیندی تصادفی است و باید اشاره کرد که تصادفی بودن برای اجماع بسیار ضروری است. تقاضا تصادفی و دوره ای است. تصادفی است زیرا هر تراکنش به صورت جداگانه تولید میشود بنابراین مجموع تراکنش ها وضعیتی شلوغ ایجاد میکند و دارای دوره های روزانه و هفتگی است به طوری که طی روز تراکنش های بیشتری نسبت به شب انجام میشود.
تمام موارد گفته شده منجر به این میشود که برای صبور بودن باید پاداشی وجود داشته باشد. اگر میخواهید تراکنش شما سریعتر انجام شود باید هزینه بیشتری نسبت به میانگین کارمزد تراکنش ها بپردازید و اگر مایل هستید که بیشتر صبر کنید، هزینه کمتری نسبت به میانگین کارمزد تراکنش ها پرداخت خواهید کرد. این موضوع باعث میشود که تراکنش ها از مدت زمان میانگین بیشتر طول بکشد اما دیگر نیازی به حضور همه نیست. کسانی که میخواهند کارمزدهای بیشتری پرداخت کنند تا سریعتر به بلاک بعدی برسند میتوانند این کار را انجام دهند، اما اگر همه این کار را انجام دهند باعث فروپاشی سیستم خواهد شد.
رابط کاربری کیف پول چگونه باید باشد؟
کارمزد تراکنش ها باید طوری مدیریت شوند که اصلا تغییری در رابط کاربری کیف پول نیازی نباشد. متاسفانه این امر غیرممکن است. اکثر اوقات باید حداکثر میزانی که کاربر میخواهد برای کارمزد بپردازد تا تراکنش انجام شود را مشخص کنید. این امر بدان معنا است که بعضی از تراکنش ها انجام نمیشود زیرا کاربران تمایل به پرداخت کارمزد زیاد آن تراکنش را ندارند.
از آنجایی که کارمزد تراکنش ها برای افرادی که میخواهند بیشتر صبر کنند باید کمتر باشد، پارامتر صبر نیز وجود دارد. ساده ترین شکل این پارامتر، میزان زمانی است که کیف پول صرف میکند تا تراکنش انجام شود. این موضوع باعث میشود تراکنش های در حال انتظار یا تراکنش های انجام نشده قابل درک باشند که قابل پیش بینی نیز میباشند.
تراکنش هایی که به جای ورود به برزخ دائمی به وضعیت انجام نشده منجر میشوند، بخش مهمی از تجربه کاربری کارمزد کیف پول میباشند. متاسفانه در حال حاضر تنها روشی که میتوان مطمئن شد تراکنش به طور دائم انجام نمیشود، خرج کردن ورودی آن در تراکنش دیگر است، اما این امر نیز نیازمند هزینه کردن کارمزد تراکنش لغو شده میباشد که قطعا برابر با همان مقدار کارمزدی میشود که از اول هم نمیخواستید پرداخت کنید.
موردی که در این خصوص نیاز است، افزونه پروتکل میباشد تا هنگامی که اندازه بلاک تا مقدار مشخصی نرسد، انجام تراکنش غیرممکن باشد. نبود چنین افزونه ای در حال حاضر تا حدودی عمدی میباشد زیرا مشکلات بالقوه ای در این خصوص وجود دارد که ممکن است تراکنش خوب پیش نرود زیرا سازماندهی مجدد بلاک رخ میدهد و بعضی از تراکنش های پذیرفته شده پیشین دوباره انجام میشوند. برای مقابله با چنین شرایطی، هنگامی که تراکنشی با حداکثر اندازه بلاک نزدیک آستانه حجم بلاک انجام میشود، ضروری است که بیشتر از تعداد بلاک های معمول دیگر صبر کند تا از ایمن بودن آن اطمینان حاصل شود. این صبر کردن اذیت کننده میباشد اما باید فقط در موارد تراکنش های انجام نشده اعمال گردد و پیاده سازی آنها ساده باشد. مشکل اصلی این است که با در نظر گرفتن نحوه عملکرد فعلی بیت کوین، اجرای چنین افزونه ای بسیار سخت است. اگر هر تغییری در بیت کوین انجام شود که از افزونه های قبلی پشتیبانی نکند، بهتر است که از فرصت های موجود برای بهبود مکانیزم افزونه های بیت کوین مخصوصا این افزونه استفاده شود.
از چه اطلاعاتی استفاده میشود؟
مشخص ترین اطلاعاتی که برای تنظیم کارمزد تراکنش ها مورد استفاده قرار میگیرد، کارمزد تراکنش های چند بلاک قبلی است. این امر چند مشکل نیز به همراه دارد. اگر نرخ کارمزدها افزایش یابد، اوضاع به همین شکل باقی میماند و مدتی طول میکشد تا این نرخ کاهش یابد. نشانه ای از این موضوع، بلاک هایی با کارمزد زیاد میباشند که کامل هم نیستند اما برای ماینرهایی که این بلاک ها را با تراکنش های خود کامل میکنند از اهمیت ویژه ای برخوردار است. تا حدودی میتوان گفت که این یکه تازی در قیمت گذاری وجود دارد، اما معمولا باید اکثر ماینرها به دنبال چنین فریبکاری باشند تا این امر انجام شود، زیرا در این صورت هر ماینر با پذیرفتن تمام تراکنش ها به جای اعمال محدودیت در تراکنش های موجود، در کوتاه مدت پول بیشتری کسب میکند. اگر کارمزد تراکنش ها در محدوده ثابتی حفظ شود، اقلیت ماینرها حتی در کوتاه مدت نیز با افزایش مصنوعی کارمزدهای در بلاک خود میتوانند پول بیشتری به دست آورند، زیرا احتمالا برای بلاک بعدی آنها نیز کارمزد تراکنش ها زیاد میباشد.
کارمزد تراکنش های قبلی برای کلاینت های SPV نیز مشکل ایجاد میکند. این کلاینت ها باید به نودهای کاملی که متصل اند در خصوص گزارش دقیق کارمزد تراکنش های قبلی اعتماد کنند. این شرایط را با ایجاد افزونه ای برای فرمت بلاک ها میتوان کاهش داد، برای مثال گزارش حداقل کارمزد پرداخت شده در این بلاک. هرچند دقیقا مشخص نیست که این افزونه چه کاری انجام میدهد. شاید بخواهید حداقل، میانگین یا ۲۵ درصد مقدار کارمزد تراکنش ها را بدانید. هم چنین احتمال دارد که ماینرها با ایجاد چندین نود کامل که فقط بلاک های قبل از اعمال کارمزدهای اخیر را گزارش میدهند، سیستم را به بازی بگیرند. مشوق هایی نیز برای این اقدامات نامناسب نیز وجود دارد و یکی از راه های کاهش چنین مواردی این است که کلاینت های SPV بیش از میزان اخیر به نودهای کامل بیشتری متصل شوند و حداکثر تلاش خود را انجام دهند. اما کلاینت های SPV در حال حاضر این کار را به درستی انجام نمیدهند و متاسفانه مشوق های بیشتری برای اقدامات نامناسب ایجاد میکند. در حال حاضر یکی دیگر از منابع بالقوه اطلاعات برای کارمزد تراکنش ها، تراکنش های در انتظار یا درخواست شده در شبکه میباشد. این روش نیز مشکلات بسیار زیادی دارد به طوری که به شدت سردرگم کننده است، حتی بیشتر از کارمزد تراکنش ها زیرا:
۱- گاهی اوقات اگر برای مدتی بلاکی ایجاد نشود با انباشته شدن تراکنش ها مواجه میشویم.
۲- گاهی اوقات اگر مجموعه ای از بلاک ها سریعا ایجاد شوند، تراکنش های زیادی وجود نخواهد داشت
۳- در آینده، نودهای کامل باید سیاست ارسال صرفا تراکنش هایی را داشته باشند که نسبت به سایر تراکنش های داخل استخر از احتمال پذیرفته شدن بیشتری برخوردار باشند.
ممپول (Mempool یا اتاق انتظار برای تراکنش های تایید نشده بیت کوین) را نیز دقیقا همانند چند بلاک قبلی و حتی بدتر میتوان بازی داد، زیرا ماینری که میخواهد کارمزد تراکنش ها را افزایش دهد میتواند نودهای کامل بسیار زیادی اجرا کند و کارمزد بیشتری نسبت به کارمزدهای واقعی گزارش دهد. برخلاف کارمزدی که در بلاک ها گزارش میشود، کلاینت های SPV حتی با وجود افزونه پروتکل نیز به هیچ وجه نمیتوانند این مورد را به طور صحیح حسابرسی کنند و نودهای کامل میتوانند به طور دقیق تر و هدفمندتری، واقعیت را به گونه دیگر بیان کنند. ایجاد چنین انگیزه قوی برای حملات مخرب به نظر ایده بدی میرسد.
هنگام تعیین کارمزد تراکنش ها، بهترین اطلاعات کیف پول، مواردی هستند که مطلقا به صورت داخلی تایید شوند بدین گونه که مقدار کارمزد باید در گذشته پرداخت شده باشد چه مقدار و تا چه زمانی قرار است پرداخته شود. تمام این موارد دارای معانی مشخص و مقادیر ریاضیاتی دقیق میباشند و هیچکس نمیتواند آنها را به بازی بگیرد. کیف پول میتواند با حداقل مقدار شروع کند و هر زمانی که بلاک جدیدی ایجاد شود که تراکنش های کیف پول را نپذیرد، کارمزد را مقداری افزایش میدهد تا در آخر به حداکثر مقدار تعیین شده برسد. سپس نودهای کامل از اقدامات ذخیره سازی و ارسال ارز تراکنش های بلاک پیروی میکنند و تراکنش هایی که کارمزد کمتر از تراکنش ذخیره شده پرداخت میکنند را نمیپذیرد. این سیاست به شدت در برابر حمله های DDoS و به حداقل رساندن آسیب های zeroconf موثر است.
فرمول اصلی
در ادامه به بررسی فرمول مورد استفاده میپردازیم.
- برای اولین تراکنش، کمترین مقدار کارمزد یا نصف آخرین کارمزد پرداخت شده را انتخاب کنید.
- در این صورت B برابر است با حداکثر تعداد بلاک ها از زمان شروع ، S برابر است با کارمزد اولیه، M برابر است با حداکثر کارمزد
- برای هر بلاک جدید با اندازه بلاک H، کارمزد تراکنش جدید تعیین کنید:
e^(lg(S) + (lg(M) — lg(S)) * H/B)
- برای جلوگیری از اشتباه هنگام استفاده کیف پول از اعداد مشابه، V را قدر مطلق بازه صفر تا یک در نظر میگیریم. پس S برابر میشود با:
e^(lg(S) + (lg(M) — lg(S)) * (V/(V+B)))
اولین باری که کوین ارسال کنید منطقی است که زمان بیشتری نسبت به انجام تراکنش طول بکشد زیرا کارمزد تراکنش از مقدار بسیار کمی شروع میشود و نمیخواهید که ناگهان این مقدار را افزایش دهید. اما اگر از حداقل کارمزد استاندارد در بیت کوین شروع کنید و حداکثر زمان را بر روی چندین ساعت قرار دهید، کارمزد تراکنش کمتر از ۱۰ درصد به ازای هر بلاک اضافه میشود، پس میتوان گفت که افزایش تصاعدی کارمزد دست خودتان است.
برای مثال ممکن است این مورد نیز منطقی باشد که کارمزد از مقداری شروع شود که تخفیفی برای حداقل مقدار پرداخت شده در بلاک قبلی است، اما در صورتی که این مقدار کمتر از مقدار شروع شما باشد و افزونه پروتکلی وجود داشته باشد که این اطلاعات را به هدر بلاک ها اضافه کند. چنین مواردی باید به صورت جداگانه مورد مطالعه قرار گیرد اما در صورتی که صرفا میخواهید تراکنش انجام شود و مقدار کارمزد نیز محتاطانه و قابل اتکا باشد، فرمول فوق جوابگو است.
گزینه های جانبی: مدیریت خروجی های خرج نشده تراکنش ها
هرگاه کیف پول پرداختی انجام میدهد، باید تصمیم بگیرد که ورودی ها و خروجی های تراکنش جدید را چگونه ساماندهی کند. معمولا خروجی تراکنش شامل دو خروجی خرج نشده میباشد که یکی از آنها به دریافت کننده و دیگری به کیف پول اولیه ارسال میشود. معمولا تلاش هایی برای بهبود و ارتقای ناشناس بودن یا حداقل ارائه کمترین حد اطلاعات انجام میشود.
هنگامی که کارمزد تراکنش های واقعی وجود داشته باشد باید بهبود ترکیب خروجی ها خرج نشده تراکنش با کارمزدها نیز در نظر گرفته شود. استراتژی مورد استفاده در بلند مدت برای کارمزدها اهمیت کمی دارد. برای هر خروجی خرج نشده تراکنش در کیف پول، بالاخره باید کارمزد پرداخت شود تا با مورد دیگری ترکیب شود و صرف نظر از اینکه در تراکنش فعلی کارمزد را پرداخت میکنید یا تراکنش بعدی، مقدار افزایش کارمزد یکسان خواهد بود. اگرچه این مورد نیز منطقی است که در پرداخت های اولیه، ورودی های بیشتری وجود داشته باشد، زیرا کارمزد آنها کمتر است و با افزایش کارمزدها، ورودی ها کاهش مییابد. هم چنین انجام تراکنش های تثبیتی کاملا جداگانه بدون هیچگونه خروجی در زمان های خارج از اوج انجام تراکنش ها منطقی است. این امر بایت های بیشتری را به بلاک چین اضافه میکند زیرا مقدار واسطه غیرضروری تولید میکند. بنابراین باید تفاوت قابل ملاحظه ای بین کارمزدها در زمان اوج تراکنش و سایر مواقع وجود داشته باشد.
هم چنین ترفندهایی در خصوص امضا تراکنش ها وجود دارد که میتواند باعث شود فضای قابل توجهی در بلاک چین صرفه جویی شود و بدین ترتیب کارمزدها کاهش یابد. بهترین ترفند، ایجاد افزونه جدید است تا هنگامی که چندین ورودی در تراکنش وجود دارند که همگی از امضاهای شنور استفاده میکنند، امضای مورد نظر برای تراکنش به جای چند امضای متفاوت، یک امضای ترکیبی باشد. این روش نقطه ضعف بسیار کمی دارد و انجام آن به شدت توصیه میشود.
ترفند ساده تر که فضای بیشتری در بلاک چین حفظ میکند، تعیین چندین ورودی برای یک تراکنشی است که از کلید مشابه استفاده میکند تا منجر به ایجاد یک امضا شود. این ترفند باعث کاهش حفظ حریم خصوصی میشود زیرا ارتباط و یکپارچگی بین خروجی های خرج نشده تراکنش را از بین میبرد، اما اگر به طور صحیح مورد استفاده قرار بگیرد، حریم خصوصی به مقدار کمی متضرر میشود. خطر موجود در این ترفند، استفاده نامناسب و استفاده همیشگی از یک کلید توسط کیف پول است تا فضای بیشتری صرفه جویی کند اما منجر به فاجعه ای در زمینه حریم خصوصی میشود.
ترفند دیگری که کاملا ایده بدی است اما فضای بیشتری صرفه جویی میکند، به حساب نیاوردن فضایی است که توسط اسکریپت های p2sh اشغال شده باشد به طوری که قبلا از این اسکریپت استفاده شده باشد. این ترفند مشخصا ترفند بدی است زیرا مستقیما اقدامات مخالف با حریم خصوصی را تشویق میکند و هم چنین به دلیل آنکه مستلزم ارائه ساختار اطلاعات اسکریپت های p2sh که قبل از تایید انجام شده اند میباشد.