ما سری خود را در مورد بلاک چین Monero ادامه میدهیم و مقاله امروز روی پروتکل RingCT (تراکنشهای محرمانه حلقه) تمرکز میکند که معاملات محرمانه و امضاهای حلقه جدید را معرفی میکند. متأسفانه اطلاعات کمی در اینترنت در مورد نحوه عملکرد آن وجود دارد و ما سعی کردیم این شکاف را پر کنیم.
ما در مورد اینکه چگونه شبکه با استفاده از این پروتکل مبالغ انتقال را پنهان می کند، چرا آنها امضاهای حلقه کریپتونوت کلاسیک را کنار گذاشتند و چگونه این فناوری بیشتر توسعه خواهد یافت، صحبت خواهیم کرد.
از آنجایی که این پروتکل یکی از پیچیده ترین فن آوری های Monero است، خواننده به دانش اولیه در مورد طراحی این بلاک چین و دانش گذرا از رمزنگاری منحنی بیضوی نیاز دارد (برای درک این دانش، می توانید فصل های اول ما را بخوانید. مقاله قبلی در مورد
پروتکل RingCT
یکی از حملات احتمالی به ارزهای کریپتونوت، تجزیه و تحلیل بلاک چین بر اساس آگاهی از میزان و زمان تراکنش ارسالی است. این اجازه می دهد
شایان ذکر است که ایده پنهان کردن مبالغ جدید نیست. گرگ ماکسول، توسعهدهنده بیتکوین کور، یکی از اولین کسانی بود که آن را در کتاب خود توصیف کرد
از جمله موارد دیگر، این پروتکل به خلاص شدن از شر مشکلات مربوط به مخلوط کردن خروجی های گرد و غبار - خروجی هایی با مقدار کمی (معمولاً به شکل تغییر از تراکنش ها دریافت می شود) کمک می کند که مشکلاتی بیش از ارزش آنها ایجاد می کند.
در ژانویه 2017، هارد فورک شبکه Monero رخ داد که امکان استفاده اختیاری از تراکنش های محرمانه را فراهم کرد. و قبلاً در سپتامبر همان سال ، با نسخه 6 هارد فورک ، چنین تراکنش هایی به تنها موارد مجاز در شبکه تبدیل شدند.
RingCT از چندین مکانیسم به طور همزمان استفاده می کند: امضاهای گروهی ناشناس خودانگیخته و چندلایه (امضای گروه ناشناس خودبه خودی قابل پیوند چندلایه، که از این پس به عنوان MLSAG نامیده می شود)، یک طرح تعهد (تعهدات Pedersen) و اثبات دامنه (این اصطلاح ترجمه معتبری به روسی ندارد) .
پروتکل RingCT دو نوع تراکنش ناشناس را معرفی می کند: ساده و کامل. کیف پول اولین مورد را زمانی ایجاد می کند که یک تراکنش از بیش از یک ورودی استفاده می کند، دومی - در موقعیت مخالف. آنها در اعتبارسنجی مبالغ تراکنش و داده های امضا شده با امضای MLSAG متفاوت هستند (در ادامه در مورد این موضوع بیشتر صحبت خواهیم کرد). علاوه بر این، تراکنش های نوع full را می توان با هر تعداد ورودی ایجاد کرد، هیچ تفاوت اساسی وجود ندارد. در کتاب
امضای MLSAG
بیایید به یاد بیاوریم که ورودی های تراکنش امضا شده چیست. هر تراکنش مقداری وجوه را خرج و تولید می کند. تولید وجوه با ایجاد خروجیهای تراکنش اتفاق میافتد (قیاس مستقیم صورتحساب است)، و خروجیای که تراکنش خرج میکند (به هر حال، در زندگی واقعی ما اسکناسها را خرج میکنیم) به ورودی تبدیل میشود (مراقب باشید، گیج شدن بسیار آسان است. اینجا).
یک ورودی به چندین خروجی ارجاع می دهد، اما تنها یک مورد را صرف می کند، بنابراین یک "صفحه دودی" ایجاد می کند تا تجزیه و تحلیل تاریخچه ترجمه را دشوار کند. اگر یک تراکنش بیش از یک ورودی داشته باشد، چنین ساختاری را می توان به عنوان یک ماتریس نشان داد که در آن ردیف ها ورودی و ستون ها خروجی های مخلوط هستند. برای اینکه به شبکه ثابت شود که تراکنش دقیقاً خروجیهای خود را خرج میکند (کلیدهای مخفی آنها را میداند)، ورودیها با امضای حلقه امضا میشوند. چنین امضایی تضمین می کند که امضاکننده کلیدهای مخفی همه عناصر هر یک از ستون ها را می دانست.
تراکنش های محرمانه دیگر از تراکنش های کلاسیک استفاده نمی کنند
آنها چند لایه نامیده می شوند زیرا چندین ورودی را به طور همزمان امضا می کنند که هر کدام با چندین ورودی دیگر مخلوط می شوند، یعنی یک ماتریس امضا شده است و نه یک ردیف. همانطور که بعدا خواهیم دید، این به صرفه جویی در اندازه امضا کمک می کند.
بیایید با استفاده از مثال تراکنشی که 2 خروجی واقعی را صرف می کند و از m - 1 خروجی تصادفی از زنجیره بلوکی برای مخلوط کردن استفاده می کند، چگونه یک امضای حلقه تشکیل می شود. اجازه دهید کلیدهای عمومی خروجی هایی را که به عنوان خرج می کنیم را مشخص کنیم
و تصاویر کلیدی برای آنها بر این اساس: بنابراین، ما یک ماتریس از اندازه دریافت می کنیم 2 x متر. ابتدا باید به اصطلاح چالش ها را برای هر جفت خروجی محاسبه کنیم:
ما محاسبات را با خروجی ها شروع می کنیم که با استفاده از کلیدهای عمومی آنها را خرج می کنیم:و اعداد تصادفیدر نتیجه، مقادیر زیر را دریافت می کنیم:
، که برای محاسبه چالش استفاده می کنیم
جفت خروجی بعدی (برای اینکه راحت تر بفهمیم چه چیزی را در کجا جایگزین می کنیم، این مقادیر را در رنگ های مختلف برجسته کرده ایم). تمام مقادیر زیر با استفاده از فرمول های ارائه شده در تصویر اول به صورت دایره ای محاسبه می شوند. آخرین چیزی که باید محاسبه شود چالش برای یک جفت خروجی واقعی است.
همانطور که می بینیم، همه ستون ها به جز ستونی که حاوی خروجی های واقعی است، از اعداد تصادفی تولید شده استفاده می کننداست. برای π- ستون ما نیز به آنها نیاز خواهیم داشت. بیایید متحول شویمدر s:
خود امضا چند تایی از این مقادیر است:
سپس این داده ها در یک تراکنش نوشته می شوند.
همانطور که می بینیم، MLSAG تنها شامل یک چالش است c0، که به شما امکان می دهد در اندازه امضا (که قبلاً به فضای زیادی نیاز دارد) صرفه جویی کنید. علاوه بر این، هر بازرس، با استفاده از داده ها، مقادیر c1,…, cm را بازیابی می کند و آن را بررسی می کند. بنابراین حلقه ما بسته شده و امضا تایید شده است.
برای تراکنشهای RingCT از نوع کامل، یک خط دیگر با خروجیهای مختلط به ماتریس اضافه میشود، اما در زیر در مورد آن صحبت خواهیم کرد.
تعهدات پدرسن
تعهدات مونرو برای پنهان کردن مبالغ نقل و انتقالات و استفاده از رایج ترین گزینه - تعهدات پدرسن استفاده می شود. به هر حال، یک واقعیت جالب - در ابتدا توسعه دهندگان پیشنهاد کردند مقادیر را با اختلاط معمولی پنهان کنند، یعنی خروجی هایی را برای مقادیر دلخواه به منظور ایجاد عدم قطعیت اضافه کنند، اما سپس آنها به تعهدات روی آوردند (این یک واقعیت نیست که آنها صرفه جویی کردند. اندازه تراکنش، همانطور که در زیر خواهیم دید).
به طور کلی، تعهد به شکل زیر است:
Где C - معنای خود تعهد، a - مقدار پنهان، H یک نقطه ثابت روی منحنی بیضوی (مولد اضافی) است و x - نوعی ماسک دلخواه، یک عامل مخفی که به طور تصادفی ایجاد می شود. ماسک در اینجا مورد نیاز است تا شخص ثالث نتواند به سادگی ارزش تعهد را حدس بزند.
هنگامی که یک خروجی جدید تولید میشود، کیف پول تعهد را برای آن محاسبه میکند و زمانی که هزینه میشود، بسته به نوع تراکنش، یا مقدار محاسبهشده در طول تولید را میگیرد یا دوباره محاسبه میکند.
RingCT ساده
در مورد تراکنشهای ساده RingCT، برای اطمینان از اینکه تراکنش خروجیهایی را به میزانی برابر با ورودیها ایجاد میکند (پول از هوا تولید نمیکند)، لازم است که مجموع تعهدات اول و دوم باشد. یکی باشند، یعنی:
کمیسیون های تعهد آن را کمی متفاوت در نظر می گیرند - بدون ماسک:
جایی که a - مقدار کمیسیون، در دسترس عموم است.
این رویکرد به ما این امکان را میدهد تا به طرف متکیکننده ثابت کنیم که از همان مقادیر استفاده میکنیم بدون اینکه آنها را فاش کنیم.
برای روشن شدن موضوع، اجازه دهید به یک مثال نگاه کنیم. فرض کنید یک تراکنش دو خروجی 10 و 5 XMR را خرج می کند (به این معنی که تبدیل به ورودی می شوند) و سه خروجی به ارزش 12 XMR تولید می کند: 3، 4 و 5 XMR. در ضمن 3 XMR پورسانت می پردازد. بنابراین، مقدار پول صرف شده به اضافه مقدار تولید شده و کمیسیون برابر با 15 XMR است. بیایید سعی کنیم تعهدات را محاسبه کنیم و به تفاوت مقادیر آنها نگاه کنیم (ریاضی را به خاطر بسپاریم):
در اینجا می بینیم که برای همگرا شدن معادله، باید مجموع ماسک های ورودی و خروجی یکسان باشند. برای انجام این کار، کیف پول به صورت تصادفی تولید می کند x1، y1، y2 و y3، و بقیه x2 به این صورت محاسبه می کند:
با استفاده از این ماسکها، میتوانیم بدون افشای مبلغ، به هر تأییدکننده ثابت کنیم که بیش از هزینهای که میکنیم، سرمایه تولید نمیکنیم. اصل، درسته؟
RingCT پر است
در تراکنشهای کامل RingCT، بررسی مبالغ انتقال کمی پیچیدهتر است. در این تراکنشها، کیف پول تعهدات را برای ورودیها دوباره محاسبه نمیکند، بلکه از آنهایی استفاده میکند که در زمان ایجاد آنها محاسبه شدهاند. در این صورت، باید فرض کنیم که دیگر تفاوت در مجموع برابر با صفر را نخواهیم گرفت، بلکه در عوض:
اینجا z - تفاوت بین ماسک های ورودی و خروجی. اگر در نظر بگیریم zG به عنوان یک کلید عمومی (که عملاً همینطور است). z کلید خصوصی است. بنابراین، ما کلیدهای عمومی و خصوصی مربوطه را می دانیم. با در دست داشتن این داده ها، می توانیم از آن در امضای حلقه MLSAG به همراه کلیدهای عمومی خروجی های مخلوط شده استفاده کنیم:
بنابراین، یک امضای حلقه معتبر تضمین میکند که ما همه کلیدهای خصوصی یکی از ستونها را میدانیم، و تنها در صورتی میتوانیم کلید خصوصی در ردیف آخر را بشناسیم که تراکنش بیش از هزینهای که میکند، پول ایجاد نکند. به هر حال، در اینجا پاسخ به این سوال است که "چرا تفاوت در مقادیر تعهدات به صفر نمی رسد" - اگر zG = 0، سپس ستون را با خروجی های واقعی گسترش می دهیم.
گیرنده وجوه از کجا می داند چه مقدار پول برای او ارسال شده است؟ همه چیز در اینجا ساده است - فرستنده تراکنش و گیرنده کلیدها را با استفاده از پروتکل Diffie-Hellman، با استفاده از کلید تراکنش و کلید مشاهده گیرنده مبادله می کنند و راز مشترک را محاسبه می کنند. فرستنده اطلاعات مربوط به مقادیر خروجی را که با این کلید مشترک رمزگذاری شده است، در فیلدهای ویژه تراکنش می نویسد.
مدارک برد
اگر از عدد منفی به عنوان مبلغ در تعهدات استفاده کنید چه اتفاقی می افتد؟ این ممکن است منجر به تولید سکه های اضافی شود! این نتیجه غیرقابل قبول است، بنابراین باید تضمین کنیم که مقادیری که استفاده میکنیم منفی نیستند (البته بدون افشای این مقادیر، در غیر این صورت کار زیاد و بیهوده است). به عبارت دیگر، باید ثابت کنیم که جمع در فاصله است [0، 2n - 1].
برای انجام این کار، مجموع هر خروجی به ارقام باینری تقسیم می شود و تعهد برای هر رقم به طور جداگانه محاسبه می شود. بهتر است با یک مثال ببینید که چگونه این اتفاق می افتد.
بیایید فرض کنیم که مقادیر ما کوچک است و در 4 بیت قرار می گیرد (در عمل این 64 بیت است)، و ما یک خروجی به ارزش 5 XMR ایجاد می کنیم. ما تعهدات را برای هر دسته و کل تعهد را برای کل مبلغ محاسبه می کنیم:
بعد، هر تعهد با یک جانشین مخلوط می شود (Ci-2iH) و به صورت جفت با امضای حلقه Borromeo (امضای حلقه دیگری) که توسط گرگ ماکسول در سال 2015 پیشنهاد شد امضا شده است (شما می توانید در مورد آن بیشتر بخوانید
در مجموع، این اثبات محدوده نامیده می شود و به شما امکان می دهد اطمینان حاصل کنید که تعهدات از مقادیری در محدوده استفاده می کنند [0، 2n - 1].
گام بعدی چیست؟
در پیادهسازی کنونی، پروفهای برد فضای زیادی را اشغال میکنند - 6176 بایت در هر خروجی. این منجر به معاملات بزرگتر و در نتیجه کارمزدهای بالاتر می شود. برای کاهش اندازه تراکنش Monero، توسعهدهندگان به جای امضاهای Borromeo ضد گلولهها را معرفی میکنند - مکانیزمی برای اثبات برد بدون تعهدات بیتی.
سوالات خود را بپرسید، موضوعاتی را برای مقالات جدید در مورد فناوری های حوزه ارزهای دیجیتال پیشنهاد دهید و همچنین در گروه ما عضو شوید.
منبع: www.habr.com