آنچه درباره تراکنش بدون گس باید بدانید
پیش از هر چیز، بیایید کمی در خصوص گس صحبت کنیم. شبکه اتریوم (و همه شبکههای دیگری که با الهام از اتریوم ایجاد شدند) یک ماشین حالت (State Machine) جهانی است. در واقع اتریوم یک کامپیوتر جهانی است که علاوه بر نگهداری یک نسخه قابل وثوق از دفتر کل (Ledger)، به کاربران اجازه میدهد تا محاسبات خود را به نوبت در این ماشین پشتهای انجام دهند و نتیجه قابل تایید و تکرارپذیر آن را ذخیره کنند. دستور آغاز این کار و پارامترهای ورودی توسط تراکنشها صادر میشود. با توجه به بار محاسباتی و برای جلوگیری از دستورات اسپم یا دستوراتی که شبکه را وارد حالت بدون توقف کند، مفهومی به اسم گس (gas) در این شبکه گنجانده شده است که واحد آن، ارز دیجیتال بومی شبکه – اتر ETH – است. هر تراکنش با توجه به منابعی که مصرف میکند، مقدار مشخصی گس لازم دارد و قیمت هر واحد از این گس، طی حراجی تعیین میشود. بنابراین قیمت تمام شده هر تراکنش برای کاربر، بسته به عملیات مورد نظر و تقاضای دیگر کاربران، برای گنجاندن تراکنش خود در هر بلوک دارد. بدین ترتیب گس را میتوان سوخت این کامپیوتر نامید.
تراکنش بدون گس چیست؟
با توجه به اینکه گس مفهومی بنیادین در شبکه است، نمیتوان آن را حذف کرد اما میتوان موارد استفاده جدید و راهکارهایی برای بهبود پروتکل ارائه کرد. برای انجام تراکنش بدون گس، باید بتوان به نحوی ثابت کرد که کاربر – با وجود عدم پرداخت گس – به راستی آغازکننده تراکنش است. باید بتوان به نحوی امن، بدون به خطر افتادن کلید خصوصی وی، ثابت کرد که کاربر امضا کننده تراکنش است. برای این منظور میبایست تغییرات و تمهیداتی در سطح پروتکل صورت میگرفت چرا که هر تراکنش در شبکه اتریوم باید توسط حسابی با مالکیت خارجی (EOA) آغاز شود و تابع approve استاندارد ERC-20، میبایست از طرف msg.sender صادر شود.
نیاز به داشتن ETH در حساب، از کیفیت تجربه کاربری میکاهد. حتی اگر میلیونها دلار از توکنهای مختلف در حساب خود داشته باشید، بدون اتر قادر به انجام هیچ کاری نیستید. برای رفع این مساله، چندین طرح بهبود اتریوم (EIP) در طول سالیان پیشنهاد شده است که هر یک سعی در رفع برخی از موانع داشتهاند. در ادامه سه EIP را بررسی میکنیم:
EIP 712
در این پروپوزال که برای نخستین بار در سال ۲۰۱۷ ایجاد شد، استانداردی برای استفاده از امضای دیجیتال یک پیغام خارج از زنجیره برای استفاده در زنجیره ایجاد شد. در واقع پس از این EIP، مجموعه پیغامهای قابل امضا علاوه بر تراکنشها و bytestringها، شامل دادههای ساختاریافته (Structured Data) نیز شد. این پیشنهاد، قدم اول در زمینه کسب تایید خرج کردن توکنها (token approval) بود.
EIP 2612
توکنهای ERC 20 دو تابع اصلی به نام approve و transferFrom دارند. یک مشکل اساسی در طراحی این توکنها، تابع approve است که منجر به انتزاعسازی (abstraction) msg.sender شده است؛ بدین معنی که فرستنده این فراخوان عملا باید یک حساب با مالکیت خارجی (EOA) باشد؛ بنابراین اگر کاربر بخواهد با قرارداد هوشمندی کار کند، احتیاج به دو تراکنش دارد. حال این پروپوزال با پیشنهاد تابعی به نام permit، با تغییر نگاشت اجازه (allowance) به وسیله یک پیغام امضا شده (به جای msg.sender)، امکانات بیشتری به ارمغان میآورد. برای مثال، این دو تابع را در قرارداد هوشمند توکن دای (DAI) که با استفاده از EIP 2612 ایجاد شده، بررسی میکنیم:
function approve(address usr, uint wad) external returns (bool)
function permit(address holder, address spender, uint256 nonce, uint256 expiry, bool allowed, uint8 v, bytes32 r, bytes32 s) external
در تابع نخست (approve)، شما به خرجکننده (spender) اجازه میدهید تا سقف wad از توکنهای شما را خرج کند. اما در تابع دوم، شما میتوانید به فردی ثالث امضای دیجیتال معتبری از خود را دهید (به کمک EIP 712 و به شکل off-chain) و آن فرد میتواند با فراخوانی permit، اجازه خرج کردن توکنهای شما را پیدا کند. این چنین از دید کاربر اصلی، تراکنش میتواند بدون گس باشد.
EIP 2771
پروپوزال EIP 2771 تغییرات لازم در قرارداد هوشمند پذیرای تراکنشهای متا (meta transaction) را مشخص میکند. با انجام این تغییرات، قرارداد هوشمند میتواند تراکنشهای امضا شده توسط کاربر را از جانب یک واسطه (Forwarder) پذیرا شود. تغییرات پیشنهاد شده در این طرح، در سطح EVM نیست. انگیزه طرح چنین پیشنهادی، مهیا کردن پذیرش تراکنشها توسط قراردادهای هوشمند از جانب حسابهای EOAای است که اتر برای پرداخت گس ندارند.
به واسطه مفهومی به اسم تراکنش متا، تراکنش به وسیله امضاکننده (Transaction Signer) آغاز میشود که حسابی با مالکیت خارجی است. سپس هزینه این تراکنش توسط طرف ثالثی به نام رلهکننده گس (Gas Relay) پرداخت میشود. عواملی که در این ساختار تعریف میشوند و نقش دارند به شرح زیر است:
امضاکننده تراکنش: فردی که تراکنش را امضا کرده و درخواست خود را به رلهکننده گس میفرستد.
رله گس: درخواستی off-chain از طرف امضاکننده تراکنش دریافت میکند و با پرداخت هزینه گس، آن را به تراکنشی معتبر تبدیل کرده و به حامل قابل اعتماد (trusted Forwarder) میفرستد.
حامل قابل اعتماد: قراردادی است که مورد وثوق قرارداد هوشمند پذیرنده است تا به درستی صحت امضا و نانس (nonce) را بررسی کرده و سپس آن را منتقل کند.
پذیرنده: قرارداد هوشمندی است که منطبق با این استاندارد طراحی شده و میتواند تراکنشهای متا را از حامل قابل اعتماد بپذیرد.
دیدگاهتان را بنویسید