آزمایش privacy pool روی frame transaction؛ برداشت عملی شد، پرداخت از طرف کاربر هنوز نه

چرا مهم است

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

قبل از خواندن، این‌ها را بدان۵ مفهوم
Nonce

مقداری برای کنترل ترتیب یا یکتایی transaction که به جلوگیری از پذیرش دوباره آن کمک می‌کند.

در حال نگارش

nullifier

شناسه‌ای در طرح‌های پرداخت خصوصی که مصرف‌شدن یک note را مشخص می‌کند تا همان note دوباره خرج نشود.

در حال نگارش

mempool

مجموعه transaction‌های در انتظار نزد یک node که هنوز وارد block نشده‌اند.

در حال نگارش

zero-knowledge proof

روشی برای اثبات درستی یک ادعا بدون آشکارکردن اطلاعات محرمانه‌ای که پشت آن ادعا قرار دارد.

در حال نگارش

Merkle root

hash نهایی یک Merkle tree که نماینده مجموعه داده‌های آن است و برای بررسی تعلق داده به آن مجموعه به کار می‌رود.

در حال نگارش

Daniil Ankushin از Nethermind نتیجه آزمایش یک shielded pool واقعی مبتنی بر BN254 Groth16 را روی frame transaction منتشر کرده است. در این الگو، خود pool فرستنده transaction است و gas برداشت را می‌پردازد؛ بنابراین کاربر به حساب دارای موجودی یا relayer نیاز ندارد و در transaction ظاهر نمی‌شود. آزمایش با minimal-shielded-pool متعلق به soispoke انجام شده است.

هنگام برداشت، بخش VERIFY در pool،؜ zero-knowledge proof را بررسی و اجرا و پرداخت را تأیید می‌کند. پیش‌نویس EIP-8250 اجازه می‌دهد nullifier‌های هر برداشت به‌عنوان کلیدهای Nonce استفاده شوند؛ در نتیجه برداشت‌های متعدد از یک آدرس pool بر سر یک Nonce رقابت نمی‌کنند. استفاده دوباره از همان کلید نیز پیش از اجرای کد pool رد می‌شود. EIP-8272 هم Merkle root را پیش از اجرای pool با contract مربوط به root‌های اخیر تطبیق می‌دهد؛ به این ترتیب node در mempool نیازی به خواندن storage خود pool ندارد.

اندازه‌گیری روی یک node از Nethermind master انجام شده و هزینه کل برداشت ۶۷۹٬۳۲۲ gas بوده است. از این مقدار، ۳۷۹٬۴۴۰ به state gas مربوط می‌شود؛ شامل ۱۹۵٬۸۴۰ برای دو کلید nullifier. بااین‌حال، بخش validation با مصرف ۲۱۵٬۶۵۴ execution gas از سقف MAX_VERIFY_GAS در EIP-8141 عبور می‌کند. بودجه پیش‌فرض ۳۰۰٬۰۰۰ در Nethermind پذیرش این برداشت را ممکن کرد، اما node با بودجه کف آن را نمی‌پذیرد. تغییر پیشنهادی برای تبدیل این سقف به کف مشترک mempool هنوز باز است.

محدودیت دیگر زمانی ظاهر می‌شود که کاربر بخواهد فراخوانی از آدرس خودش انجام شود، ولی pool هزینه را بدهد. کلیدهای EIP-8250 زیر آدرس فرستنده نگه‌داری می‌شوند؛ پس یک nullifier مشترک از دو آدرس، دو کلید متفاوت محسوب می‌شود. قواعد public mempool نیز اجازه خواندن storage خود pool را در این حالت نمی‌دهند و برای چنین پرداخت‌کننده‌ای فقط یک transaction در انتظار را در هر node مجاز می‌دانند.

پیشنهاد تغییر دامنه کلیدها به حساب پرداخت‌کننده پس از مخالفت یکی از نویسندگان EIP-8250 بسته شد. جمع‌بندی نویسنده این است: فعلاً یا pool باید فرستنده باشد، یا کاربر ابتدا برداشت کند و سپس با transaction جداگانه هزینه فراخوانی خود را بدهد. پرداخت pool برای فراخوانی از آدرس کاربر در یک transaction از مسیر public mempool همچنان حل نشده و عدد gas برای آن وجود ندارد.

نکته کلیدی

پذیرش در یک node را با سازگاری با سقف پیش‌نویس یکی نگیر؛ این برداشت با بودجه پیش‌فرض Nethermind پذیرفته شد، نه با بودجه کف. هنگام طراحی هم حالت «pool فرستنده است» را از «pool فقط پرداخت می‌کند» جدا کن.

خواندن مقاله اصلی (در زبانه‌ی جدید باز می‌شود)
برچسب‌ها (۱)