توضیح‌نامه‌ی ۰۲

اثبات دانش‌صفر چیست؟

نسخه‌ی روزمره

یک اثبات دانش‌صفر (ZK proof) راهی است برای متقاعد کردن کسی به این‌که یک گزاره درست است، بی‌آن‌که دلیلش را فاش کنید.

چند قیاس از دنیای واقعی:

یک اثبات ZK نسخه‌ی رمزنگارانه‌ی آن پاکت است: یک قطعه‌ی کوچک ریاضی، معمولن چند صد بایت، که یک راستی‌آزما می‌تواند در میلی‌ثانیه آن را بررسی کند و تنها صحت ادعا را آشکار می‌کند، نه چیزی بیش‌تر.

جمهور از اثبات‌های ZK برای چه بهره می‌برد

ما از اثبات‌های ZK بهره می‌بریم تا یک کاربر بتواند سه ادعا را همزمان، روی زنجیره، بدون افشای هویت اثبات کند:

  1. «من یک گذرنامه یا کارت ملی ایرانی اصیل در اختیار دارم.» در برابر امضای رمزنگاری‌شده‌ی سند و درخت گواهی‌نامه‌های رسمی ICAO اثبات می‌شود.
  2. «من قبلن برای این رویداد ثبت‌نام نکرده‌ام یا رای نداده‌ام.» از راه یک مقدار یکتای جبری به نام nullifier اثبات می‌شود — که از سند و رویداد مشتق می‌شود، اما به هویت قابل اتصال نیست.
  3. «سند من منقضی نشده و معیارهای سن / تابعیت را برآورده می‌کنم.» در برابر فیلدهای تاریخ تولد و انقضا درون سند اثبات می‌شود، بدون افشای مقادیر واقعی.

رکورد روی زنجیره فقط این است: یک شهروند معتبر ایرانی، واجد شرایط این رای، روی پیشنهاد ۴۲ «بله» داده است. نه هیچ چیز بیش‌تر.

سه ویژگی‌ای که هر اثبات ZK باید داشته باشد

وقتی رمزنگاران درباره‌ی اثبات‌های ZK حرف می‌زنند، همیشه منظورشان یک سیستم با سه ویژگی است. آنچه مهم است معنای کاربری هر کدام است:

ویژگیبه زبان سادهچرا برای جمهور مهم است
کامل‌بودناگر گزاره درست است، یک کاربر صادق همیشه می‌تواند یک اثبات معتبر تولید کند.یک دارنده‌ی واقعی گذرنامه‌ی ایرانی هرگز به‌اشتباه از سوی قرارداد هوشمند رد نمی‌شود.
درستیاگر گزاره نادرست است، یک متقلب نمی‌تواند اثبات معتبر تولید کند — مگر با احتمالی به‌قدری ناچیز که (معمولن ۱ به ۲۱۲۸).یک مهاجم نمی‌تواند با حدس‌زدن یا با محاسبه‌ی یک اثبات «خوش‌شانس»، هویت جعلی ثبت کند.
دانش‌صفراثبات هیچ چیزی فراتر از صحت گزاره را آشکار نمی‌کند — نه ورودی‌ها، نه مقادیر میانی، نه هیچ اطلاعات جانبی.زنجیره هرگز شماره‌ی گذرنامه، نام، تاریخ تولد، یا این‌که هر رای متعلق به چه کسی است را یاد نمی‌گیرد.

این سه با هم همان چیزی هستند که اثبات‌های ZK را از یک امضا، یک هش یا یک گواهی متمایز می‌کنند. امضا ثابت می‌کند «من کلید را دارم»؛ یک اثبات ZK ثابت می‌کند «من ورودی‌هایی می‌دانم که یک محاسبه‌ی مشخص را برآورده می‌کنند» — و تنها همین.

«درستی» در کار چگونه کار می‌کند

عدد ۱ به ۲۱۲۸ یک حدس نیست. از روش ساخت اثبات می‌آید:

  1. محاسبه‌ای که می‌خواهیم راستی‌آزمایی کنیم (مثلن «امضای گذرنامه معتبر است و nullifier درست مشتق شده و سند منقضی نشده») به یک مدار حسابی غول‌پیکر کامپایل می‌شود — میلیون‌ها جمع و ضرب روی یک میدان اول.
  2. اثبات‌کننده به هر مقدار میانی آن محاسبه با استفاده از نقاط منحنی بیضوی تعهد می‌سپارد.
  3. راستی‌آزما یک چالش تصادفی صادر می‌کند که قطعی از روی آن تعهدات مشتق می‌شود.
  4. اثبات‌کننده باید با مقادیری پاسخ دهد که یک هویت جبری منفرد را برآورده کنند — هویتی که تعهدات و چالش را به هم گره می‌زند.

یک متقلب باید مقادیری را به‌شانس جعل کند که آن هویت را برآورده کنند. آن هویت در میدانی با حدود ۲۲۵۴ عضو زندگی می‌کند، بنابراین احتمال تقلب حتی برای قوی‌ترین حملات شناخته‌شده به حدود ۱ به ۲۱۲۸ فرو می‌رود. برای مقیاس: ۲۱۲۸ از تعداد اتم‌های یک میلیارد بدن انسان بیش‌تر است. هر استاندارد رمزنگاری بانکی و دولتی این را «ناممکن» تلقی می‌کند.

«دانش‌صفر» در کار چه معنایی دارد

دانش‌صفر به این معنا نیست که «داده در جایی روی زنجیره رمزگذاری شده است». به این معناست که داده از همان ابتدا وارد اثبات نشده است.

مقایسه کنید:

برای جمهور، این به این معناست:

تنها راهی که یک مهاجم شماره‌ی گذرنامه‌ی شما را به دست می‌آورد، گرفتن آن از دستگاه فیزیکی شما است — همان سطح تهدید عکس‌ها یا پیام‌های واتس‌اپ شما، و بی‌ارتباط با هر چیزی که ما روی زنجیره منتشر می‌کنیم.

«شکل مدار» — معنای این عبارت

در سراسر این توضیح‌نامه‌ها چیزهایی مثل «شکل مدار تعیین می‌کند چه چیزی قابل اثبات هست و چه چیزی نیست» می‌گوییم. به‌طور مشخص، مدار یک برنامه‌ی ثابت است که می‌گوید:

با ورودی‌های خصوصی مثل بایت‌های گذرنامه، امضا و اسرار، و ورودی‌های عمومی مثل شناسه‌ی رویداد، تاریخ کنونی و ریشه‌ی ICAO:

  1. گروه‌های داده مثل DG1 و DG2 را هش کن و امضای SOD راستی‌آزمایی کن.
  2. گواهی Document Signer را در برابر ریشه‌ی Merkle ICAO راستی‌آزمایی کن.
  3. مقدار nullifier را از poseidon(secret, event_id) مشتق کن.
  4. بررسی کن که current_date دست‌کم ۱۸ سال بعد از birth_date باشد.
  5. خروجی‌ها: nullifier، تابعیت، تاریخ کنونی و ریشه‌ی ICAO.

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

کلاس‌های مختلف سند (گذرنامه‌ی ایرانی RSA-2048-SHA256، گذرنامه‌ی ایرانی RSA-3072-SHA1، کارت هوشمند ملی RSA-2048، گذرنامه‌های ECDSA آینده) از مدارهای متفاوت بهره می‌برند، چون ریاضی امضا فرق دارد. به همین دلیل سرویس SSO ما یک رجیستری مدار نگه می‌دارد، نه یک راستی‌آزمای ثابت در کد.

اثبات‌های ZK چه کار نمی‌کنند

به همان اندازه مهم است که صادق باشیم درباره‌ی این‌که این فناوری چه چیزی را نمی‌تواند حل کند.

ZK ثابت می‌کندZK ثابت نمی‌کند
«من سندی در اختیار دارم که سازمان ثبت احوال ایران آن را امضا کرده.»«سازمان ثبت احوال ایران فقط برای آدم‌های واقعی امضا می‌کند.»
«یک ورودی معتبر این مدار را برآورده می‌کند.»«ورودی از یک انسان زنده و راضی آمده است.»
«من قبلن روی رویداد X رای نداده‌ام.»«من در دو رویداد همان انسان هستم.» (nullifier متفاوت در هر رویداد، عمدی است.)
«تاریخ تولد من پیش از ۲۰۰۸ است.»«من درباره‌ی نظراتم دروغ نمی‌گویم.»

بزرگ‌ترین محدودیت صادقانه: یک اثبات ZK اعتماد هر کسی را که سند را امضا کرده، به ارث می‌برد. اگر کلید امضای صادرکننده به‌خطر بیفتد — از سوی یک بازیگر دولتی یا غیر آن — اسناد جعلی‌اما‌معتبر می‌توانند ضرب شوند و از سیستم اثبات کاملن عبور خواهند کرد. این درباره‌ی هر سیستم passport-ZK در جهان، از جمله ما، صادق است. زنجیره‌ی اعتماد گذرنامه برای سطح حمله‌ی کامل و راه‌کارهای کاهش‌ ما را ببینید.

چرا این هنوز ارزش انجام دارد

حتی با آن محدودیت صادقانه، هویت ZK در طیف قابل‌استقرار از هر گزینه‌ی دیگری بهتر است:

رویکردهویت را افشا می‌کند؟در برابر سیبیل مقاوم است؟مقاوم در برابر سانسور؟هزینه‌ی هر بررسی
ورود دولتی (مثل ثنا / شاهکار)بله — همه‌چیزبلهنه — سرور می‌تواند هر کاربر را مسدود کندهزینه‌ی سرور
نام کاربری + رمز عبورنه، اما تضمین هویتی هم نیستنهبه میزبان بستگی داردهزینه‌ی سرور
امضای دیجیتال ساده با گذرنامهبله — کل سندبلهبه میزبان بستگی داردهزینه‌ی سرور
اثبات ZK از گذرنامه / INIDنهبله (از راه nullifier)بله (روی زنجیره)~۰٫۰۰۱ دلار

ترکیب عدم افشای هویت، اجرای یک نفر-یک رای، و نبود سرور مرکزی توانا به حذف کاربران همان چیزی است که اثبات‌های ZK را به‌مثابه‌ی عنصر اولیه‌ی درست برای زیرساخت دموکراتیک در مقیاس مدنی، تحت شرایط خصمانه می‌سازد.

واژه‌نامه

اصطلاحمعنا
مدار (Circuit)برنامه‌ی حسابی ثابت که تعیین می‌کند چه چیزی اثبات می‌شود.
Witnessکل مجموعه‌ی مقادیر میانی که اثبات‌کننده هنگام اجرای مدار روی ورودی‌هایش محاسبه می‌کند. روی دستگاه می‌ماند.
Proofشیء رمزنگاری ۲۵۶ بایتی (Groth16) که آپلود می‌شود.
Public signalsمجموعه‌ی کوچک خروجی‌های مدار (nullifier، ریشه، تاریخ و غیره) که راستی‌آزما می‌بیند. هرگز داده‌ی خام سند را شامل نمی‌شود.
Nullifierیک مقدار قطعی و مبهم‌کننده‌ی هویت برای جلوگیری از رای مضاعف. همان شخص + همان رویداد = همان nullifier؛ همان شخص + رویداد متفاوت = nullifier متفاوت.
Verification keyیک فایل کوچک که قرارداد هوشمند نگه می‌دارد و برای بررسی اثبات‌های یک مدار خاص به‌کاربرده می‌شود. یکی به ازای هر مدار.
خطای درستیاحتمال ریاضی موفقیت یک متقلب (~ ۲−۱۲۸ در تنظیمات ما — در کار صفر تلقی می‌شود).

بعدی

در ادامه: زنجیره‌ی اعتماد گذرنامه — این‌که چگونه به این فرض می‌رسیم که «سندی که کاربر اسکن می‌کند واقعی است»، و دقیقن کجا این فرض دیگر صادق نیست.