Мы продолжаем серию статей о блокчейне Monero, и сегодняшняя статья будет посвящена протоколу RingCT (Ring Confidential Transactions), который вводит конфиденциальные транзакции и новые кольцевые подписи.
К сожалению, в Интернете мало информации о том, как это работает, и мы постарались восполнить этот пробел.
Мы поговорим о том, как сеть скрывает суммы переводов по этому протоколу, почему отказались от классических кольцевых подписей криптонот и как эта технология будет развиваться дальше.
Поскольку этот протокол является одной из самых сложных технологий в Monero, читателю потребуются базовые знания о конструкции этого блокчейна и поверхностные знания криптографии на эллиптических кривых (чтобы освежить эти знания, вы можете прочитать первые главы нашего руководства).
предыдущая статья о мультиподписи ).
Протокол RingCT
Одной из возможных атак на криптовалюты-криптовалюты является анализ блокчейна, основанный на знании суммы и времени отправленной транзакции.Это позволяет существенно сузить область поиска интересующих злоумышленника выходов.
Чтобы защититься от такого анализа, Monero внедрила протокол анонимных транзакций, который полностью скрывает суммы переводов в сети.
Стоит отметить, что идея сокрытия сумм не нова.
Разработчик Bitcoin Core Грег Максвелл был одним из первых, кто описал это в своей книге.
статья Конфиденциальные сделки .
Текущая реализация RingCT представляет собой его модификацию с возможностью использования кольцевых подписей (как и без них), отсюда и название — Ring Confidential Transactions. Помимо прочего, протокол помогает избавиться от проблем со смешиванием выходов пыли — выходов небольшой суммы (обычно получаемых в виде сдачи от транзакций), которые создавали больше проблем, чем они того стоили.
В январе 2017 года состоялся хард-форк сети Monero, позволяющий опционально использовать конфиденциальные транзакции.
А уже в сентябре того же года, с хардфорком версии 6, подобные транзакции стали единственными разрешенными в сети.
RingCT использует сразу несколько механизмов: многослойные связанные спонтанные анонимные групповые подписи (Multilayered Linkable Spontainous Anonymous Group Signature, далее MLSAG), схему обязательств (Pedersen Commitments) и rangeproofs (данный термин не имеет устоявшегося перевода на русский язык).
.
Протокол RingCT представляет два типа анонимных транзакций: простые и полные.
Кошелек генерирует первый, когда транзакция использует более одного входа, второй — в противоположной ситуации.
Они отличаются проверкой сумм транзакций и данных, подписанных подписью MLSAG (подробнее об этом поговорим ниже).
Причём транзакции типа full могут генерироваться с любым количеством входов, принципиальной разницы нет. В книге «Ноль в Монеро» В связи с этим говорят, что решение ограничить полные транзакции одним входом было принято в спешке и может измениться в будущем.
подпись MLSAG
Давайте вспомним, что такое подписанные входные транзакции.Каждая транзакция тратит и генерирует некоторое количество средств.
Генерация средств происходит путем создания выходов транзакции (прямая аналогия — купюры), а выход, который тратит транзакция (ведь в реальной жизни мы тратим банкноты), становится входом (будьте осторожны, очень легко запутаться здесь).
Вход ссылается на несколько выходов, но тратит только один, создавая таким образом «дымовую завесу», затрудняющую анализ истории переводов.
Если транзакция имеет более одного входа, то такую структуру можно представить в виде матрицы, где строки — это входы, а столбцы — смешанные выходы.
Чтобы доказать сети, что транзакция тратит именно свои выходы (знает их секретные ключи), входы подписываются кольцевой подписью.
Такая подпись гарантирует, что подписавшему известны секретные ключи для всех элементов любого из столбцов.
Конфиденциальные транзакции больше не используют классические криптонота кольцевые подписи, их заменила MLSAG — версия аналогичных однослойных кольцевых подписей, адаптированная для множественных входов, LSAG .
Многослойными они называются потому, что подписывают сразу несколько входов, каждый из которых смешивается с несколькими другими, т.е.
подписывается матрица, а не одна строка.
Как мы увидим позже, это помогает сэкономить на размере подписи.
Давайте рассмотрим, как формируется кольцевая подпись, на примере транзакции, которая тратит 2 реальных выхода и использует для смешивания m — 1 случайных выходов из блокчейна.
Обозначим открытые ключи выходов, которые мы тратим, как
, и ключевые изображения для них соответственно:
Таким образом, мы получаем матрицу размера 2 х м .
Во-первых, нам нужно рассчитать так называемые задачи для каждой пары выходов:
Начинаем вычисления с выводов, которые проводим, используя их открытые ключи:
и случайные числа
В результате мы получаем следующие значения:
, который мы используем для расчета задачи
следующая пара выходов (чтобы было проще понять, что и куда подставляем, мы выделили эти значения разными цветами).
Все последующие значения рассчитываются по кругу по формулам, приведенным на первой иллюстрации.
Последнее, что нужно рассчитать, — это задача для пары реальных выходов.
Как мы видим, во всех столбцах, кроме столбца, содержащего реальные выходные данные, используются случайно сгенерированные числа.
.
Для π - столбец, они нам тоже понадобятся.
Давайте трансформируем
в с:
Сама подпись представляет собой кортеж всех этих значений:
Эти данные затем записываются в транзакцию.
Как мы видим, MLSAG содержит только одну задачу.
с 0 , что позволяет сэкономить на размере подписи (которая и так требует много места).
Далее любой инспектор, используя данные
, восстанавливает значения c 1 ,…, с м и проверяет это
.
Таким образом, наше кольцо замкнуто и подпись проверена.
Для транзакций RingCT полного типа в матрицу добавляется еще одна строка со смешанными выходами, но об этом мы поговорим ниже.
Обязательства Педерсена
Схемы обязательств (чаще используется английский термин «обязательства») используются для того, чтобы одна сторона могла доказать, что она знает определенный секрет (номер), не раскрывая его фактически.Например, вы бросаете определенное число на кубике, учитываете обязательство и передаете его проверяющей стороне.
Таким образом, в момент раскрытия секретного номера проверяющий самостоятельно рассчитывает обязательство, тем самым убеждаясь, что вы его не обманули.
Обязательства Monero используются для сокрытия сумм переводов и использования наиболее распространенного варианта — обязательств Педерсена.
Кстати, интересный факт - сначала разработчики предлагали скрывать суммы обычным смешиванием, то есть добавлением выходов для произвольных сумм, чтобы внести неопределенность, но потом перешли к обязательствам (не факт, что сэкономили на размер транзакции, как мы увидим ниже).
В целом обязательство выглядит следующим образом:
Где С — смысл самого обязательства, а - скрытая сумма, ЧАС — неподвижная точка на эллиптической кривой (дополнительная образующая), а Икс — какая-то произвольная маска, скрывающий фактор, генерируемый случайным образом.
Маска здесь нужна для того, чтобы третья сторона не могла просто угадать ценность обязательства.
Когда генерируется новый вывод, кошелек рассчитывает для него обязательство, а при расходовании принимает либо значение, рассчитанное при генерации, либо пересчитывает его, в зависимости от типа транзакции.
RingCT простой
В случае простых транзакций RingCT, чтобы гарантировать, что транзакция создавала выходы в сумме, равной сумме входов (не производила деньги из воздуха), необходимо, чтобы сумма обязательств первого и второго они одинаковы, то есть:Комиссии по обязательствам рассматривают это несколько иначе – без маски:
, Где а — размер комиссии, он общедоступен.
Такой подход позволяет нам доказать проверяющей стороне, что мы используем те же суммы, не раскрывая их.
Чтобы было понятнее, давайте рассмотрим пример.
Допустим, транзакция тратит два выхода (то есть они становятся входами) по 10 и 5 XMR и генерирует три выхода на сумму 12 XMR: 3, 4 и 5 XMR. При этом он платит комиссию в размере 3 XMR. Таким образом, сумма потраченных денег плюс сгенерированная сумма и комиссия равна 15 XMR. Попробуем посчитать обязательства и посмотрим на разницу их сумм (помним математику):
Здесь мы видим, что для того, чтобы уравнение сходилось, нам нужно, чтобы суммы входной и выходной масок были одинаковыми.
Для этого кошелек генерирует случайным образом Икс 1 , да 1 , да 2 и й 3 , а остальные Икс 2 рассчитывается так:
Используя эти маски, мы можем доказать любому проверяющему, что мы не генерируем больше средств, чем тратим, не раскрывая при этом сумму.
Оригинально, да?
RingCT полный
В полных транзакциях RingCT проверка сумм перевода немного сложнее.В этих транзакциях кошелек не пересчитывает обязательства по входным данным, а использует те, которые были рассчитаны при их создании.
В этом случае надо предположить, что мы получим уже не разность сумм, равную нулю, а вместо этого:
Здесь я — разница между масками ввода и вывода.
Если мы рассмотрим зГ в качестве открытого ключа (которым он является де-факто), то я это закрытый ключ.
Таким образом, мы знаем публичный и соответствующий ему приватный ключи.
Имея эти данные, мы можем использовать их в кольцевой подписи MLSAG вместе с открытыми ключами смешиваемых выходов:
Таким образом, действительная кольцевая подпись гарантирует, что мы знаем все закрытые ключи одного из столбцов, и мы сможем узнать закрытый ключ в последней строке только в том случае, если транзакция не генерирует больше средств, чем тратит. Кстати, вот и ответ на вопрос "почему разница в суммах обязательств не приводит к нулю" - если zG = 0 , то мы расширим столбец с реальными выходами.
Как получатель средств узнает, какая сумма денег ему была отправлена? Здесь все просто — отправитель транзакции и получатель обмениваются ключами по протоколу Диффи-Хеллмана, используя ключ транзакции и ключ просмотра получателя и вычисляют общий секрет. Отправитель записывает данные о суммах вывода, зашифрованные этим общим ключом, в специальные поля транзакции.
Доказательства диапазона
Что произойдет, если вы используете отрицательное число в качестве суммы обязательств? Это может привести к генерации дополнительных монет! Такой исход неприемлем, поэтому нам нужно гарантировать, что суммы, которые мы используем, не являются отрицательными (конечно, не раскрывая эти суммы, иначе столько работы и все напрасно).Другими словами, мы должны доказать, что сумма находится в интервале [0, 2 н — 1] .
Для этого сумма каждого выхода разбивается на двоичные цифры и обязательство рассчитывается для каждой цифры отдельно.
Лучше посмотреть, как это происходит, на примере.
Предположим, что наши суммы небольшие и укладываются в 4 бита (на практике это 64 бита), и мы создаём выход стоимостью 5 XMR. Рассчитаем обязательства по каждой категории и общую сумму обязательств на всю сумму:
Далее каждое обязательство смешивается с суррогатным (С я -2 я ЧАС) и подписывается в паре с кольцевой подписью Борромео (еще одна кольцевая подпись), предложенной Грегом Максвеллом в 2015 году (подробнее о ней можно прочитать здесь).
Здесь ):
В совокупности это называется «доказательством диапазона» и позволяет гарантировать, что в обязательствах используются суммы в указанном диапазоне.
[0, 2 н — 1] .
Что дальше?
В текущей реализации доказательства диапазона занимают много места — 6176 байт на вывод. Это приводит к более крупным транзакциям и, следовательно, к более высоким комиссиям.Чтобы уменьшить размер транзакции Monero, разработчики вводят пуленепробиваемые подписи вместо подписей Borromeo — механизм проверки диапазона без побитовых обязательств.
По некоторым оценкам , они способны уменьшить размер доказательства дальности до 94%.
Кстати, в середине июля технология прошла аудит от Kudelski Security, которая не выявила каких-либо существенных недостатков ни в самой технологии, ни в ее реализации.
Технология уже используется в тестовой сети, а с новым хард-форком она, вероятно, сможет перейти в основную сеть.
Задавайте свои вопросы, предлагайте темы для новых статей о технологиях в сфере криптовалют, а также подписывайтесь на нашу группу в Фейсбук чтобы быть в курсе наших событий и публикаций.
Теги: #блокчейн #криптовалюта #Децентрализованные сети #Криптовалюты #Криптография #monero
-
Союзы
19 Oct, 24 -
Rustdesk — Автономный Аналог Teamviewer.
19 Oct, 24 -
Как Моя Задача Переросла В Командную Задачу
19 Oct, 24 -
Sudo И Графические Приложения.
19 Oct, 24 -
Конвертирование Видео Для Ipod Из Linux
19 Oct, 24 -
Другой Способ Борьбы С Png В Ie6
19 Oct, 24