سیگما-بی مجموعه ای از پروتکل ها و ابزار های رمزنگاری است که ارائه «اثبات خصوصی اندوخته» و یا «Private Proof of Reserves» را برای صرافی های متمرکز رمزارز ممکن میکند. «خصوصی» بودن سیگما-بی از درز پیدا کردن آدرس های صرافی و کاربران صرافی و داده های مالی مربوط به صرافی (نظیر مقدار کل بدهی) جلوگیری میکند. این سند به فلسفه پشت پروتکل سیگما-بی و جزئیات فنی آن میپردازد.
اثبات اندوخته، صرافی های متمرکز (امانی) را قادر میسازد که به کاربران خود اثبات کنند که به اندازه بدهی خود به کاربران، اندوخته دارند. در پروتکل های اثبات اندوخته فعلی، دو چیز اثبات میشود:
- صرافی به اندازه
$n$ واحد پولی اندوخته دارد. - مجموع بدهی های صرافی به کاربران از
$n$ کوچکتر است.
برای اثبات قسمت اول، صرافی ها چاره ای ندارند جز اینکه آدرس کیف پول های خود را بطور عمومی افشا کنند. کاربران میتوانند با بررسی موجودی داخل این آدرس ها و جمع زدن آنها، مقدار
برای اثبات قسمت دوم، فرض کنید نوبیتکس لیستی در اختیار دارد که هر سطر آن حاوی شناسه کاربر و موجودی کیف پول امانی او میشود. این لیست را «لیست بدهی» مینامیم. نوبیتکس میتواند این لیست را به طور عمومی منتشر کند. کاربران میتوانند لیست را مشاهده کرده، و از حضور خود در این لیست مطمئن شوند. پس از اطمینان حاصل کردن از حضور خود در لیست، کاربران میتوانند مجموع دارایی های همه کاربران در لیست (بدهی کل) را محاسبه کرده و مطمئن شوند که این مقدار، از اندوخته صرافی (مقدار
- اگر مقدار بدهی ها از مقدار اندوخته ها بزرگتر باشد نوبیتکس واضحا در اثبات اندوخته خود شکست خورده است.
- اگر نام شما در لیست موجود نباشد، بدین معنی است که نوبیتکس بدهی شما را در نظر نگرفته و این احتمال وجود دارد که نوبیتکس به اندازه بدهی خود به کاربران اندوخته نداشته باشد.
(نکته: کاربران همچنین باید مطمئن شوند که لیست بدهی اعلامی نوبیتکس در یک تاریخ معین، همواره ثابت است و نوبیتکس در هر بار استعلام تغییری در آن ایجاد نمیکند. در غیر این صورت نوبیتکس میتواند یکبار لیست حاوی نام شما را منتشر کند و بعد از متقاعد کردن شما، نام شما را از لیست حذف کند و نام شخص دیگری را به جای شما گذاشته و او را نیز متقاعد کند)
واضحا انتشار عمومی لیست بدهی ها غیرقابل انجام است چرا که به حریم خصوصی کاربران نوبیتکس آسیب جدی وارد میکند. در صورت عمومی شدن لیست بدهی، همه کاربران میتوانند موجودی رمزارزی همه کاربران را ببینند.
تابع درهمسازی، یک تابع ریاضیاتی است که یک ورودی با اندازه دلخواه میگیرد و همواره یک خروجی با اندازه ثابت تحویل میدهد. این تابع همچنین ویژگی های زیر را دارد:
- کوچکترین تغییر در ورودی باعث تغییر شگرف در خروجی میشود.
- پیدا کردن ورودی از روی خروجی بسیار سخت و ناممکن است.
فرض کنید آتوسا و بابک میخواهند پشت تلفن «سنگ-کاغذ-قیچی» بازی کنند. متاسفانه همواره این امکان وجود دارد که بابک، در حین اینکه آتوسا انتخاب خود را فریاد میزند، سریعا انتخاب او را شنیده و انتخاب خود را با توجه به انتخاب آتوسا اعلام کند و همواره برنده شود. بابک میتواند تاخیر در اعلام انتخاب خود را گردن تاخیر صدا در تلفن بیاندازد.
با توجه به یکطرفه بودن توابع درهمسازی امن، آتوسا و بابک میتوانند بدون اینکه داده ای را افشا کند، به آن داده متعهد شوند. مثال:
آتوسا و بابک میتوانند به جای اینکه انتخاب خود را فریاد بزنند، از انتخاب های خود Hash بگیرند و با اعلام این مقدار به یکدیگر، به انتخاب های خود متعهد شوند. پس از رد و بدل کردن تعهد ها، آتوسا و بابک میتوانند انتخاب اصلی خود را با آرامش کامل اعلام کرده و برنده مشخص میشود. همچنین، آتوسا و بابک پس از شنیدن انتخاب های اصلی، میتوانند با Hash گرفتن از آنها و مقایسه نتیجه با تعهد های قبلی، از پایبند بودن یکدیگر به تعهد های خود مطمئن شوند. در صورتی که هرکس از تعهد خود سرپیچی کند، بازنده اعلام میشود.
فرض کنید که
فرض کنید که بجای انتشار عمومی لیست بدهی، از آن Hash میگیریم و آن را انتشار میدهیم. با اینکار به لیست بدهی متعهد میشویم. حال فرض کنید که تابع
این تابع لیست بدهی (
-
$h(L)$ هش لیست بدهی است. -
$\sum_{k}{L[k]_{balance}}$ مجموع همه بدهی های موجود در لیست است. -
$L[i]_{id}$ شناسه$i$ -امین کاربر موجود در لیست بدهی است. -
$L[i]_{balance}$ موجودی$i$ -امین کاربر موجود در لیست بدهی است.
حال فرض کنید که نوبیتکس ابتدا لیست بدهی
- اولا: مجموع موجودی های کاربران برابر
$T$ است. - دوما: شخصی داخل لیست وجود دارد که شناسه او برابر
$K$ است. - سوما: موجودی همان شخص داخل لیست برابر
$V$ است.
آتوسا با دریافت این اثبات و بررسی برابر بودن
آتوسا میتواند مقدار
همانطور که پیش از این گفته شد، نقطه قوت سیگما-بی نسبت به سایر پروتکل ها، قابلیت آن در اثبات اندوخته (قسمت اول) بدون فاش کردن آدرس های صرافی است.
بیتکوین، به عنوان اولین رمزارزی که تکنولوژی بلاکچین را معرفی کرد، از معماری UTXO پیروی میکند. در این معماری، اشخاص، صاحب «حساب» های بیتکوینی نیستند. بلکه صاحبه «سکه» هایی هستند که میتوانند به سکه های کوجکتر و با صاحب های متفاوت شکسته شوند. در این مدل، یک نفر میتواند با شکستن سکه خود به دو سکه کوچکتر، پرداخت بیتکوینی انجام دهد. یکی از این دو سکه باید به نام شخص دریافتکننده سکه، و دیگری باقیمانده پرداخت و به نام شخص پرداختکننده خواهد بود.
پس از بیتکوین، بلاکچین های دیگری معرفی شدند که از معماری دیگری استفاده میکردند: به جای اینکه اشخاص صاحب سکه های با ارزش های متفاوت باشند، هر شخص داخل پروتکل صاحب حسابی است که مقدار موجودی آن با دریافت و پرداخت هایی که انجام میدهد تغییر میکند. هر حساب نیز به یک کلید عمومی متصل است.
برخی از بلاکچین های Account-based (مثل اتریوم)، در بلوک های خود، هش کل اکانت های موجود نیز اعلام میکنند. این مقدار تحت عنوان stateRoot منتشر میشود. میتوان این مقدار را تعهدی بر لیست موجودی های همه اکانت های اتریومی در نظر گرفت.
تابع
این تابع لیست کلیدعمومی و موجودی کل اکانت های اتریومی (
-
$h(A)$ هش لیست موجودی کل اکانت های اتریومی . -
$A[i]_{balance}$ موجودی$i$ -امین اکانت -
$verifySig(A[i]_{pubkey}, \text{"I am Nobitex!"}, sig)$ یک مقدار بولینی نشاندهنده اینکه آیا اکانت$i$ -ام به درستی پیام$\text{"I am Nobitex!"}$ را امضا کرده است یا نه (با نوجه به$sig$ )
اثبات موفق دانایی ورودی های مناسب برای تابع
- امضایی را میدانیم که نشان میدهد صاحب یکی از اکانت های داخل اتریوم هستیم، و مقدار موجودی این اکانت برابر
$B$ است.
البته همچنین باید اطمینان حاصل کنیم که مقدار
حال نوبیتکس میتواند چند اثبات تولید کند و هر اثبات نشان دهد که نوبیتکس صاحب
پروتکل توصیف شده در حال حاضر یک مشکل جدی دارد. نوبیتکس میتواند برای یکی از اکانت های خود اثبات های متعدد تولید کند و ادعا کند که موجودی ها مربوط به اکانت های مختلف هستند. از آنجایی که آدرس اکانت ها مخفی است، راهی برای تشخیص تکراری نبودن اکانت ها وجود ندارد. یک راهحل مبتکرانه برای حل این مشکل وجود دارد. فرض کنید که تابع
به ورودی های تابع یک مقدار
با توجه به ویژگی های توابع درهمسازی، نمیتوان از روی
اگر دقت کرده باشید، در این پروتکل با اینکه آدرس های صرافی را مخفی کرده ایم، همچنان مقدار کل دارایی نوبیتکس لو میرود. دلایل متعددی میتواند وجود داشته باشد که نوبیتکس نخواهد مقدار کل دارایی خود را فاش کند. دقیقا همانطور که در قسمت قبلی کلیدعمومی را به صورت رمزی شده فاش کردیم، میتوانیم موجودی را نیز به صورت رمز شده فاش کنیم. کافی است در خروجی دوم، بجای
در صورت انجام این کار، کاربری که اثبات ها را صحتسنجی میکند دیگر نمیتواند مجموع موجودی ها را بدست آورد، چرا که آنها مقادیر رمزیشده هستند. میتوانیم یک تابع سوم
با استفاده از اثبات های متعدد روی
حال فرض کنید که در لیست بدهی نیز بجای فاش کردن مقدار کل بدهی بصورت مستقیم، با همین رویکرد، مقدار رمزیشده کل بدهی را برگردانیم، با یک تابع چهارمی، از بزرگتر بودن مقدار رمزیشده دارایی از مقدار رمزیشده بدهی مطمئن شویم. در این صورت نوبیتکس میتواند ثابت کند که به اندازه بدهی های خود اندوخته دارد، بدون آنکه مقدار اندوخته و یا مقدار بدهی خود را فاش کند.
متاسفانه قبل از اینکه بتوان از پروتکل های دانش-صفر zkSNARKs برای تولید اثبات استفاده کرد، میبایست یکسری «پارامتر های اولیه» طی فرایندی که از آن با عنوان Trusted-Setup یاد میشود تولید شوند. این فرایند باید حتما توسط چند شخص مستقل انجام شود. اگر پارامتر های اولیه تنها توسط یک نفر تولید شوند، امکان تولید اثبات های تقلبی توسط آن شخص وجود دارد.
در طی فرایند مشارکت در تولید پارامتر های اولیه، داده هایی تولید میشوند که حتما باید پس از مشارکت از بین بروند. برای اینکه پروتکل امن باشد، تنها کافی است که یکی از شرکتکننده ها زباله های سمی خود را از بین ببرد. اثبات های تقلبی تنها درصورتی قابل تولید هستند که همهی شرکت کننده ها به عمد زباله های سمی خود را نگه دارند و با مشارکت همدیگر اثبات ها را بسازند. احتمال چنین موقعیتی بسیار ناچیز است، مگر اینکه تعداد شرکتکننده ها کم باشد. شرکت کننده های این فرایند میتوانند برای اطمینان بیشتر از لو نرفتن زباله های سمی، تولید پارامتر ها را در یک کامپیوتر ایزوله (و حتی داخل یک قفسه فارادی) انجام دهند!
لیست افرادی که در فرایند راهاندازی امن سیگما-بی شرکت کرده اند:
- کیوان کامبخش @keyvank
دور ریختن زباله ها سمی حتی توسط یکی از این افراد باعث میشود اطمینان حاصل کنیم که تولید اثبات های جعلی امکانپذیر نیست.