وقتی صحبت از اثبات و فرمول میشه، یاد مسائل دوران دبیرستان میافتم. بعضیهاش مثل "مجموع زوایای داخلی مثلث برابر است با ۱۸۰ درجه" آسون بودن، راحت میشد اثباتش کرد. بعضیهاش هم مثل "شتاب گرانش زمین برابر است با ۹.۸۰۶۶۵ متر بر مجزور ثانیه" یا "e = mc^2" صرفاً قبول کردهبودیم که صحیح هستن، بالاخره افراد بنامی عمرشون رو پای این موارد گذاشته بودن و ما دیگه صرفاً ازشون استفاده میکردیم، بدون اینکه بدونیم دانشمندان فیزیک و ریاضی دقیقاً چطور به چنین فرمولهایی رسیده بودن.
اما از بعضی از این فرمولها نمیشد گذشت! مثل فرضیهی ریمن (فرمولی که تمامی اعداد اول بین عدد n تا m رو میتونه پیدا کنه) که آنچنان صحیح ولی اثبات ناشدنی باقی مونده که برای اثبات کردنش جاییزهی یک میلیون دلاری گذاشتن (حتی برای شما دوست عزیز 🏆🤑).
همونطور که در اون دوران یادگرفتیم یک "اثبات ریاضی" زمانی معتبره که در طی یک استدلال استنتاجی نشون بده که یک گزارهی ریاضی در تمامی شرایط و بدون هیچ استثنائی، همواره صحیحه. مثلاً درمورد مسئله "مجموع زوایای داخلی هر مثلثی برابر است با ۱۸۰ درجه" همین کار رو میکردیم تا صحت این گزاره رو اثبات کنیم.
چرا لزوماً باید اثبات میکردیم که چنین گزارهای درسته؟ خب چون میخوایم خشت اول رو صاف بذاریم تا دستمون به ثریا برسه! یا به عبارتی دیگه، چون برای پیشرفتهای بعدی نیاز داریم روی بستر قابل اطمینانی قدم برداریم.
و سؤال اصلی این مقاله اینه:
بنظرت ممکنه صحت یک گزاره رو اثبات کرد، بدون اینکه از "چرایی و چگونگی" اون گزاره حرفی زدهباشیم؟ 🤔
پاسخ این سؤال، زادگاه مفهوم Zero-knowledge Proof هستش. 🎉
مفهوم Zero-Knowledge Proof یا به اختصار ZKP یکی از شاخصتر مفاهیم دنیای رمزنگاری و بلاکچینه. این مفهوم دو بازیکن اصلی داره (اثباتکننده: Prover و تأییدکننده: Verifier) و بستری امن برای این دو فراهم میکنه که در اون، Prover به Verifier اثبات میکنه که همیشه میتونه کاری رو به درستی انجام بده، بدون اینکه حرفی از چگونگی عملکردش به Verifier بزنه.
به عبارتی دیگه ZKP بستری رو برام فراهم میکنه که بدون اینکه لازم باشه به شما ثابت کنم "چرا ادعای من همیشه صحیح هست"، بتونم شما رو متقاعد کنم که "چیزی که من میدونم یا دارم انجام میدم، همیشه صحیح خواهدبود"
اما واقعاً چطور میشه صحت یک گزاره رو به کسی اثبات کرد، بدون اینکه بهش بگی چطور به این اثبات دستپیدا کردی؟ یا طبق چه فرمول و الگوریتمی همیشه داره صحیح کار میکنه؟ 🤔
خوشبختانه برای درک عمیق این مفهوم، نیاز ندارین چیزی درمورد رمزنگاری و بلاکچین بدونید، بلکه فقط با همین سؤال همراه من بیاید تا با چند مثال سخت و آسون، Zero-Knowledge Proof رو بهتون یاد بدم. 🤓
کمتر کسی هست که چیزی درمورد فیلم ماتریکس نشنیده باشه! انصافاً به دردسرش میارزید که قرص قرمز رو برداره؟ 🙄
بیاید فرض کنیم اگر Neo از ویژگی "کوررنگی" برخوردار بود، حتماً برای چنین انتخاب حساسی به کمک نیاز داشت چون رنگی آبی و قرمز در نگاهش کاملاً یکسان دیده میشدن.
اینجا من به عنوان Prover میام به نئو میگم "میخوای قرمزو برداری؟ بسپارش به من! من میدونم قرمزه کدومه"
نئو برای اینکه مطمئن بشه، در نقش Verifier ازم درخواست میکنه که بهش اثبات کنم که واقعاً میدونم قرص قرمز کدوم یکیه!
بنظر شما، من چطور میتونم به نئو ثابت کنم که "خبر دارم کدوم قرص قرمزه" بدون اینکه جای قرص قرمز رو برای نئو فاش کنم؟! 🤔
به نئو میگم "برای اثبات این ادعام، ازت میخوام قرصها رو بگیری توو مشت خودت، ببری پشتت، به انتخاب خودت قرصها رو یا جابجاش کنی یا نکنی، و قرصها رو دوباره بیاری جلو و نشونم بدی. تو نمیدونی کدوم قرمزه، اما فقط خودت خبر داری که آیا قرصها رو جابجا کردی یا نه. من هم خبر ندارم تو قرصها رو اون پشت جابجا کردی یا نه، اما چون ادعا کردم که رنگها رو تشخیص میدم، اگر قرصها رو جابجا کردهباشی، جابجا شدن رنگها رو میتونم تشخیص بدم، و متعاقباً قادرم قرص قرمز رو بدرستی شناسایی کنم."
درنتیجه من اینجا تونستم متعهد به اصول ZKP صحت ادعام رو به نئو ثابت کنم. یعنی بدون اینکه اطلاعاتی از جای قرص قرمز به نئو دادهباشم (Zero-knowledge)، بهش ثابت کردم (Proof) که قادرم همیشه بدرستی تشخیص بدم قرص قرمز توی کدوم دستشه، چون میتونم بدرستی تشخیص بدم که هربار قرصها جابجا شدن یا نشدن.
احتمال زیاد برای یکبار هم که شده با این بازی روبرو شدید؛ که داخل یک تصویر خیلی شلوغ، باید دنبال یک چیز بخصوص بگردید. تصویر بالا یکی از صفحات کتاب "Where’s Wally" هستش، و مقصود این بازی اینه که Wally رو پیدا کنید.
در پاسخ به نیازی که الان برای شما ایجاد شده، من به عنوان Prover میام به شما میگم "من دقیقاً میدونم Wally کجاست" و چون در بستر ZKP هستیم، صحت اطلاعاتی که دارم رو به سمع و نظر شما میرسونم، بدون اینکه جای دقیق Wally رو برملا کردهباشم.
من اینجا دارم متعهد به اصول ZKP قدم برمیدارم، چرا که بدون به خطر انداختن امنیت Wally به شما نشون میدم که Wally رو پیدا کردم، اما نمیگم کجا و چطور؟
اگر ابعاد این عکس رو A در B فرض کنیم، من میام یک پاکت مهر و موم شده در ابعاد 100A در 100B روبروت میذارم و به حفرهای که بطور کاملاً تصادفی روی پاکت ایجاد شده اشاره میکنم، و بهت میگم "اوناهاش، Wally اونجاست". شما میری جلو و از داخل اون حفره، Wally رو میبینی.
کاری که "پاکت" داره انجام میده، تمثیلی از رمزنگاری هستش. چرا که شما هرگز اطلاع نداری که من Wally رو کجای اون تصویر پیدا کردم؟ و حتی خود اون تصویر رو کجا پاکت قرار دادم؟! چرا که با مکانیزم بخصوصی، اطلاعات اضافه از دید شما پنهان شده و فقط همون چیزی که نیاز داری رو بهت تحویل دادم.
پس در این مثال هم من شما رو متقاعد کردم که "من میدونم Wally کجاست"، بدون اینکه اطلاعات بیشتری از Wally دستگیرتون شدهباشه.
یکی از جاهایی که ZKP میتونه پیادهسازی بشه، راهکاری امنتر برای شناسایی کاربران در applicationهاست. راهکاری که بتونه به طریقی اثبات کنه که شما واقعاً "شما" هستی، بدون اینکه لازم داشتهباشید اطلاعات بیشتری برای اثبات این موضوع ارائه کنید، مثل رمز عبور و ... در این صورت حتی اگر یک هکر بتونه به دستگاه شما نفوذ کنه، هرگز نمیتونه رمز عبور شما رو پیدا کنه چرا که اصلاً رمز عبوری وجود نداشته!
تئوری چهاررنگ میگه: "در نقشهای از شهرهای یک کشور، حداکثر با چهار رنگ میتوان شهرهای آن کشور را طوری رنگآمیزی کرد که هیچ دو شهری با رنگ یکسان، هم-مرز نباشند"
تئوری گروتج، نسخهی خاصتری از تئوری چهاررنگ هست که میگه تحت یک شرط خاص اما ساده، حداکثر با 3 رنگ میشه همون نقشه رو طوری رنگآمیزی کرد که هیچ دو شهری با رنگ یکسان، هم-مرز نباشن.
حالا اگر من به عنوان Prover بخوام صحت عملکرد این تئوری رو در عالم ZKP به نمایش بگذارم، میام به شما یک نقشه بی رنگ نشون میدم، که رنگهای هر شهر، داخل پاکت مخصوص به خودش پنهان شده (رمزنگاری شده).
و میام ادعا میکنم که "من بلدم این نقشه رو حداکثر با چهاررنگ، طوری رنگآمیزی کنم که هرگز دو شهرِ هم مرز، همرنگ نباشن".
شما میگی "از کجا معلوم؟" من میگم "هر چندباری که دلت میخواد دوتا شهر هم مرز رو انتخاب کن تا بهت نشون بدم"
بعد از اولین آزمون یک حس زیرکانهای قلقلکت میده که "خب من اگه همه شهرها رو چک کنم، میتونم رنگ کل نقشه رو داشته باشم تا ببینم واقعاً چطور تونسته کارش رو درست انجام بده" (تهدید محرمانگی اطلاعات)
میای دوتا شهر دیگه انتخاب میکنی:
حیرت زده بهم میگی "چرا همچین شد؟"
بهت میگم: "من کارم همینه! فقط و فقط صحت عملکردم رو بهت ثابت میکنم، بدون اینکه امنیت اطلاعات رو به خطر بندازم. من با الگوریتم دیگهای که دارم، بعد از هر درخواستی که بهم میدی، میرم نقشه رو recolor میکنم."
و در نهایت اینجا هم بعد از تعداد دلخواهی درخواست، شما رو متقاعد خواهم کرد که این نقشه مطابق با تئوری چهاررنگ رنگآمیزی شده بدون اینکه اطلاعات بیشتری بهت داده باشم.
برنارد ریمن در این فرضیه میگه "من یه فرمولی بلدم (معادلهی Zetaی ریمن) که میتونم باهاش تمامی اعداد اول بین n و m رو به ترتیب بهت تحویل بدم". نکته اینجاست که تا همین لحظه که چشماتون داره بین این واژهها دوان دوان جلو میره، هنوز هیچ کس نتونسته بفهمه چرا این فرمول داره کار میکنه! همینم شده که برای داننده 1 میلیون دلار پول گذاشتن کنار...
درواقع صورت این سؤال یک میلیون دلاری اینطوری مطرح میشه:
"به اعضای چه متغییرهایی، حاصل تابع Zeta(x) برابر با صفر خواهد شد؟"
جالبه بدونید برنارد ریمن در مقالهی ۸۹۷ صفحهای خودش، با وارد کردن اعداد مختلط به تابع Zetaی لئونارد اویلر و بست دادنش به متغیرهای بیشتر، نشون داد که معادلهی جدیدی که ساخته قادر به پیشبینی اعداد اول هستش، ادعایی که تا همین امروز ثبات نشده! سالها بعد این معادله توسط اولین کامپیوترها -که عنوان "اولین معادله محاسباتی با کامپیوتر" رو به خودش نسبت داد- مورد تست و محاسبه قرار گرفت و نشون داد که معادلهی Zetaی ریمن با موفقیت تونست ۱۰ تریلیون عدد اول رو بدون حتی یک خطا شناسایی کنه! اما چطور؟!
"چگونگی" این مسئله دست برندهی یک میلیون دلاری رو میبوسه، اما شباهت بسیار زیاد این موضوع به تعریف ZKP باعث شده که در دانشگاهها و مقالات مربوط به ZKP، به فرضیهی ریمن هم اشاره بشه. به این نکته که فرضیهی ریمن، بدون اینکه کسی دقیقاً اطلاعی از چگونگی عملکردش داشتهباشه، به درستی داره کار میکنه. این فرضیه بدون هیچ دانشی (Zero-Knowledge) از چرایی و چگونگی عملکردش، به همه اثبات کرده (Proof) که همیشه داره درست عمل میکنه. به عبارتی دیگه، فرضیهی ریمن در نقش Prover تونسته Verifierهاش رو متقاعد کنه که "من میتونم جای اعداد اول رو به درستی پیشبینی و شناسایی کنم، بدون اینکه اطلاعات بیشتری از نحوهی عملکردم برملا کردهباشم".
با توجه به مثالهایی که با هم مرور کردیم، الان درک بهتری از معنی لغوی و نحوه پیادهسازی Zero-Knowledge Proof داریم. اگر کمی بیشتر بخوایم عبارت Zero-Knowledge رو باز کنیم، این عبارت به این معنی هستش که Verifier در تعامل با Prover، هرگز و ابداً به اسرار و چگونگی عملکرد Prover دسترسی نخواهد داشت. تنها چیزی که Verifier در این تعامل مشاهده میکنه اینه که میبینه Prover دانشی محرمانه داره که بدرستی داره ازش استفاده میکنه و کارهاش رو به درستی انجام میده، بدون اینکه بشه سر از دانش محرمانهش در آورد.
مرور تعریف انگلیسی این مفهوم هم خالی از لطف نیست:
Zero-Knowledge Proof (ZKP) is a cryptographic concept that allows one party (the prover) to prove to another party (the verifier) that they know a certain piece of information or have completed a task without revealing any details about the information or task itself. Essentially, it's a way to demonstrate knowledge or compliance without disclosing the actual content.
تنها نکتهی حائز اهمیت در ZKP اینه که فرض بر صداقت طرفین هست. یعنی فرض بر این است که هر دو طرف (Prover و Verifier) کاملاً صادق هستند.
من اولین بار این اصطلاح رو در دنیای Blockchain شنیدم، اما بطور وسیعتر در دنیای تکنولوژی، ZKP میتونه امنیت مسائلی مثل جابجایی اطلاعات، تعاملات مالی، احراز هویت، و رأی گیریهای محرمانه رو تضمین کنه.
ما حتی در زندگی روزمرهمون هم میتونیم مثالهایی از ZKP پیدا کنیم.
حالا 👋🏻
شما ZKP رو با چه مثال دیگهای میتونید برام تعریف کنید؟ 🤓 توی کامنتها برام بنویسید...