تراکنش های محرمانه در مونرو، یا نحوه انتقال چیزهای ناشناخته به مقاصد ناشناخته

ما سری خود را در مورد بلاک چین Monero ادامه می‌دهیم و مقاله امروز روی پروتکل RingCT (تراکنش‌های محرمانه حلقه) تمرکز می‌کند که معاملات محرمانه و امضاهای حلقه جدید را معرفی می‌کند. متأسفانه اطلاعات کمی در اینترنت در مورد نحوه عملکرد آن وجود دارد و ما سعی کردیم این شکاف را پر کنیم.

تراکنش های محرمانه در مونرو، یا نحوه انتقال چیزهای ناشناخته به مقاصد ناشناخته

ما در مورد اینکه چگونه شبکه با استفاده از این پروتکل مبالغ انتقال را پنهان می کند، چرا آنها امضاهای حلقه کریپتونوت کلاسیک را کنار گذاشتند و چگونه این فناوری بیشتر توسعه خواهد یافت، صحبت خواهیم کرد.

از آنجایی که این پروتکل یکی از پیچیده ترین فن آوری های Monero است، خواننده به دانش اولیه در مورد طراحی این بلاک چین و دانش گذرا از رمزنگاری منحنی بیضوی نیاز دارد (برای درک این دانش، می توانید فصل های اول ما را بخوانید. مقاله قبلی در مورد چند امضایی).

پروتکل RingCT

یکی از حملات احتمالی به ارزهای کریپتونوت، تجزیه و تحلیل بلاک چین بر اساس آگاهی از میزان و زمان تراکنش ارسالی است. این اجازه می دهد به طور قابل توجهی منطقه جستجو را برای خروجی های مورد علاقه مهاجم محدود کنید. برای محافظت در برابر چنین تحلیلی، مونرو یک پروتکل تراکنش ناشناس را پیاده سازی کرده است که به طور کامل مقادیر نقل و انتقالات را در شبکه پنهان می کند.

شایان ذکر است که ایده پنهان کردن مبالغ جدید نیست. گرگ ماکسول، توسعه‌دهنده بیت‌کوین کور، یکی از اولین کسانی بود که آن را در کتاب خود توصیف کرد مقاله معاملات محرمانه. پیاده سازی فعلی RingCT اصلاح آن با امکان استفاده از امضاهای حلقه (چه بدون آنها) است و به این ترتیب نام آن - Ring Confidential Transactions - گرفته شده است.

از جمله موارد دیگر، این پروتکل به خلاص شدن از شر مشکلات مربوط به مخلوط کردن خروجی های گرد و غبار - خروجی هایی با مقدار کمی (معمولاً به شکل تغییر از تراکنش ها دریافت می شود) کمک می کند که مشکلاتی بیش از ارزش آنها ایجاد می کند.

در ژانویه 2017، هارد فورک شبکه Monero رخ داد که امکان استفاده اختیاری از تراکنش های محرمانه را فراهم کرد. و قبلاً در سپتامبر همان سال ، با نسخه 6 هارد فورک ، چنین تراکنش هایی به تنها موارد مجاز در شبکه تبدیل شدند.

RingCT از چندین مکانیسم به طور همزمان استفاده می کند: امضاهای گروهی ناشناس خودانگیخته و چندلایه (امضای گروه ناشناس خودبه خودی قابل پیوند چندلایه، که از این پس به عنوان MLSAG نامیده می شود)، یک طرح تعهد (تعهدات Pedersen) و اثبات دامنه (این اصطلاح ترجمه معتبری به روسی ندارد) .

پروتکل RingCT دو نوع تراکنش ناشناس را معرفی می کند: ساده و کامل. کیف پول اولین مورد را زمانی ایجاد می کند که یک تراکنش از بیش از یک ورودی استفاده می کند، دومی - در موقعیت مخالف. آنها در اعتبارسنجی مبالغ تراکنش و داده های امضا شده با امضای MLSAG متفاوت هستند (در ادامه در مورد این موضوع بیشتر صحبت خواهیم کرد). علاوه بر این، تراکنش های نوع full را می توان با هر تعداد ورودی ایجاد کرد، هیچ تفاوت اساسی وجود ندارد. در کتاب "صفر تا مونرو" در این رابطه گفته می شود که تصمیم برای محدود کردن تراکنش های کامل به یک ورودی عجولانه گرفته شده و ممکن است در آینده تغییر کند.

امضای MLSAG

بیایید به یاد بیاوریم که ورودی های تراکنش امضا شده چیست. هر تراکنش مقداری وجوه را خرج و تولید می کند. تولید وجوه با ایجاد خروجی‌های تراکنش اتفاق می‌افتد (قیاس مستقیم صورت‌حساب است)، و خروجی‌ای که تراکنش خرج می‌کند (به هر حال، در زندگی واقعی ما اسکناس‌ها را خرج می‌کنیم) به ورودی تبدیل می‌شود (مراقب باشید، گیج شدن بسیار آسان است. اینجا).

یک ورودی به چندین خروجی ارجاع می دهد، اما تنها یک مورد را صرف می کند، بنابراین یک "صفحه دودی" ایجاد می کند تا تجزیه و تحلیل تاریخچه ترجمه را دشوار کند. اگر یک تراکنش بیش از یک ورودی داشته باشد، چنین ساختاری را می توان به عنوان یک ماتریس نشان داد که در آن ردیف ها ورودی و ستون ها خروجی های مخلوط هستند. برای اینکه به شبکه ثابت شود که تراکنش دقیقاً خروجی‌های خود را خرج می‌کند (کلیدهای مخفی آنها را می‌داند)، ورودی‌ها با امضای حلقه امضا می‌شوند. چنین امضایی تضمین می کند که امضاکننده کلیدهای مخفی همه عناصر هر یک از ستون ها را می دانست.

تراکنش های محرمانه دیگر از تراکنش های کلاسیک استفاده نمی کنند رمزنگاری امضاهای حلقه، آنها با MLSAG جایگزین شدند - نسخه ای از امضاهای حلقه تک لایه مشابه که برای ورودی های متعدد اقتباس شده است. LSAG.

آنها چند لایه نامیده می شوند زیرا چندین ورودی را به طور همزمان امضا می کنند که هر کدام با چندین ورودی دیگر مخلوط می شوند، یعنی یک ماتریس امضا شده است و نه یک ردیف. همانطور که بعدا خواهیم دید، این به صرفه جویی در اندازه امضا کمک می کند.

بیایید با استفاده از مثال تراکنشی که 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 ضد گلوله‌ها را معرفی می‌کنند - مکانیزمی برای اثبات برد بدون تعهدات بیتی. طبق برخی برآوردها، آنها قادر به کاهش اندازه محدوده اثبات تا 94٪ هستند. به هر حال، در اواسط جولای این فناوری گذشت حسابرسی از Kudelski Security، که هیچ کاستی قابل توجهی را چه در خود فناوری و چه در اجرای آن نشان نداد. این فناوری در حال حاضر در شبکه آزمایشی استفاده می شود و با هارد فورک جدید احتمالا می تواند به شبکه اصلی منتقل شود.

سوالات خود را بپرسید، موضوعاتی را برای مقالات جدید در مورد فناوری های حوزه ارزهای دیجیتال پیشنهاد دهید و همچنین در گروه ما عضو شوید. فیس بوکبرای به روز بودن از رویدادها و نشریات ما.

منبع: www.habr.com

اضافه کردن نظر