Мультиподпись В Сети Monero

Мы открываем серию публикаций об устройстве различных блокчейнов и начнем исследования с Monero. Это довольно известная криптовалюта; он реализует ряд интересных алгоритмических и криптографических решений.

Несколько месяцев назад в Monero Core добавили поддержку мультиподписи, и в сегодняшней статье мы подробнее рассмотрим эту технологию.



Мультиподпись в сети Monero

Multisig — это механизм создания и использования публичных кошельков.

Сама концепция не нова; он уже реализован в некоторых криптовалютах, таких как Биткойн, Эфириум и другие.

Его суть заключается в совместном владении и распоряжении средствами кошелька.

На распоряжение средствами накладываются некоторые ограничения: для проведения транзакции необходимо набрать определенное количество голосов, которое задается при создании кошелька и зависит от количества его владельцев.

Эти параметры характеризуют так называемую «схему» кошелька, например, 3/3 — кошелек на трех владельцев с необходимыми тремя подписями для отправки транзакции, или 2/3 — кошелек на трех владельцев с необходимыми двумя подписи любого из его владельцев.

Следует отметить, что в мультиподписных кошельках нет понятия «ваша доля» и «моя доля»; все средства принадлежат всем участникам одновременно.



Криптография в Monero

Криптография в Monero (как и в большинстве других криптовалют) построена на эллиптических кривых.

Вы можете прочитать о них в Википедии .

Короче говоря, преимуществами этой системы шифрования являются более высокая криптостойкость по сравнению с классическими криптографическими системами, малые размеры ключей и более высокая скорость криптографических операций.

Каждый кошелек в сети Monero имеет две пары ключей (приватный и публичный) — просмотра и траты.

Пара открытых ключей для просмотра и расходов называется адресом кошелька.

Вы можете использовать его как адрес для получения средств.

Если вы хотите предоставить информацию о количестве и сумме поступлений на ваш кошелек третьим лицам, вы можете помимо адреса предоставить приватный ключ просмотра.

Пара закрытого ключа просмотра и публичного ключа расходов называется ключом отслеживания.

С его помощью вы можете видеть поступления средств в свой кошелек (но не расходы) и это абсолютно безопасно – владелец такой пары ключей не сможет потратить ваши средства.

Возможно, самый секретный ключ — это личные расходы — им нельзя поделиться с кем-либо, потому что… Имея его и секретный ключ просмотра, вы можете управлять средствами в своем кошельке.

Далее в статье мы будем обозначать публичные ключи заглавными буквами (например, B — публичный ключ траты), а приватные ключи — строчными буквами (b — приватный ключ траты).

Чтобы понять некоторые расчеты, ниже в статье мы покажем, как публичный ключ наследуется от закрытого:

Мультиподпись в сети Monero

, Где г – фиксированная точка, при умножении на нее закрытого ключа (скаляра) получается открытый ключ, который также является точкой на эллиптической кривой.



Мультиподпись в сети Monero

Идея технологии проста: каждый участник кошелька хранит только часть закрытого расходного ключа, а при формировании и подписании транзакций все эти части суммируются и образуют единый ключ.

Конечно, ни в какой момент времени ни один из участников не сможет собрать весь ключ.

Публичный ключ траты полностью хранится у каждого участника.

Также каждый из участников хранит полную версию закрытого и публичного ключа просмотра, что вместе с публичными тратами позволяет видеть входящие поступления на общий адрес.



Создание мультиподписного кошелька в Monero

Текущая версия Monero поддерживает только схемы N/N и N – 1/N. Процесс создания происходит в 1 или 2 этапа для схем N/N и N – 1/N соответственно.

На первом этапе участники процесса обмениваются между собой ключами приватного просмотра и публичных трат и подсчитывают суммы этих ключей — всех просмотров и всех трат. Таким образом, приватный ключ просмотра кошелька становится суммой ключей просмотра для всех схем, а публичный ключ траты для схемы N/N — это сумма публичных ключей трат всех участников.

На этом генерация кошелька N/N завершена.

Для кошельков N — 1/N появляется другой набор ключей.

Этот набор представляет собой массив закрытых ключей, рассчитанный как произведение текущего закрытого ключа расходов и открытых ключей расходов каждого из других участников, то есть (для простоты игнорируем хеш-функцию):

Мультиподпись в сети Monero

И аналогично для каждого из участников.

Закрытый ключ траты каждого участника будет представлять собой сумму его мультиподписных ключей, то есть:

Мультиподпись в сети Monero

Эту операцию выполняет каждый участник.

Следует отметить одно важное свойство таких произведений, например:

Мультиподпись в сети Monero

Из этого равенства следует, что каждый кошелек имеет один (в нашем примере со схемой 2/3) мультиподписной ключ, который есть у другого участника.

После генерации участники обмениваются публичными мультиподписными ключами:

Мультиподпись в сети Monero

Наконец, публичный ключ траты кошелька рассчитывается путём суммирования уникальных значений публичных мультиподписных ключей, то есть для нашего примера это будет:

Мультиподпись в сети Monero

Как мы видим, для расчета ключа траты (как частного, так и публичного) в случае 2/3 нам нужна информация только от любых двух участников.

На этом создание кошелька завершено, и его можно использовать в соответствии с выбранной схемой.



Транзакции в Monero

Чтобы объяснить, как создаются транзакции с мультиподписью, давайте кратко рассмотрим, как работают транзакции в Monero. В упрощенном виде (без кольцевых подписей и RingCT) это можно представить так:

Мультиподпись в сети Monero

Рисунок 1. Упрощенное представление транзакции Здесь справа — выходы транзакции — деньги, которые она генерирует (прямая аналогия: купюры в кошельке), а слева — входы — деньги, которые она сжигает. Таким образом, когда Алиса хочет отправить Бобу 1 XMR, она собирает сумму в 1 XMR плюс комиссию со своих неизрасходованных выходов, помещает их вместо входов транзакции, вычисляет ключевой образ для каждого из них, генерирует выходы на сумму 1 XMR и вычисляет для каждого из них выходной ключ.

После получения транзакции Боб восстанавливает выходной ключ для каждого выхода, используя ключи частного просмотра и публичные траты, и, если восстановленный ключ и ключ, полученный в транзакции, совпадают, он считает этот выход предназначенным для него.

Несмотря на то, что мультиподписная транзакция ничем не отличается от любой другой транзакции с точки зрения сети, ее создание немного сложнее и включает в себя несколько этапов:

  • Участники обмениваются частичными ключевыми изображениями для известных выходов (или просто обмениваются выходами).

  • Участники ресинхронизируют свои кошельки для получения точного баланса с учетом уже полных ключевых образов.

  • Отправитель готовит транзакцию, подписывает ее и отправляет следующему участнику.

  • Каждый последующий участник добавляет свою часть подписи RingCT.
  • Последний подписавшийся завершает создание RingCT
И теперь транзакция готова к отправке в сеть.



Генерация ключевых изображений и обмен результатами

Во время сканирования (синхронизации) блокчейна кошелек не может определить, что конкретные входы тратят именно его выходы, поскольку у него нет возможности вычислить для них образ ключа.

Поэтому он видит только входящие транзакции (для них достаточно только пары ключей отслеживания).

Чтобы сгенерировать корректную транзакцию, нужно восстановить образ ключа для каждого из выходов, повторно просканировать блокчейн и определить, какие из них были потрачены, и только потом приступать к его генерации.

Рассмотрим процесс формирования ключевого образа.

Он рассчитывается по формуле:

Мультиподпись в сети Monero

, Где HP – определенная предопределенная хэш-функция, п – открытый ключ выхода (см.

рисунок 1), Икс — закрытый ключ вывода, который мы восстановим для получателя этого вывода, рассчитывается следующим образом:

Мультиподпись в сети Monero

, Где Хс – некоторая заранее известная криптографическая хеш-функция, а — приватный ключ просмотра, р – открытый ключ транзакции (ключ публикации Tx, см.

рисунок 1) и б – приватный ключ траты.

Подставив одно выражение в другое и раскрыв скобки, получим:

Мультиподпись в сети Monero

Но поскольку у нас нет полного расходного ключа, нам необходимо его восстановить.

В случае N/N все просто (возьмем для примера 3/3):

Мультиподпись в сети Monero

Здесь ЧАС п (П)б я частичное ключевое изображение, получено от i-го участника.

Для схем N – 1/N (2/3 от имени первого участника без участия третьего):

Мультиподпись в сети Monero

в этом случае ЧАС п (П)б я Б дж частичное ключевое изображение.

Суть процесса обмена выходами заключается именно в том, что необходимое количество подписантов транзакции отправляет свои частичные изображения ключей для каждого выхода другим участникам кошелька.

При этом участники не раскрывают свои приватные ключи, поэтому сторонний наблюдатель или недобросовестный участник не имеют возможности восстановить полный ключ траты и завладеть кошельком в индивидуальном порядке.

Имея эти данные, инициатор транзакции может сформировать ее и подготовить к подписанию.

Сгенерированная транзакция отправляется всем, кто согласен ее подписать, для генерации подписи Ring CT, создаются все необходимые подписи и транзакция отправляется в сеть.



Автоматизация обмена данными

Выше описаны процедуры обмена частями ключей и образов ключей, которые необходимо выполнять либо один раз, либо после каждой отправленной транзакции.

В текущей реализации Monero Core Wallet эти действия предлагается выполнять вручную путем обмена необходимыми данными по защищенным каналам связи с вашими корреспондентами вручную (экспортируя необходимые данные из кошелька и отправляя их через мессенджеры или другими способами).

Это можно продемонстрировать на примере создания кошелька по схеме 2/3 и подписания транзакции.

Каждый участник выполняет следующие команды с помощью утилиты monero-wallet-cli:

 [wallet 9uKCgo]: prepare_multisig
 MultisigV1baCWviNomMXe271W8HW4imh8SsnNEWP2bCswQfoB9MGzNZ8FUG3e8UCNm5toKQzSQH2e8rUWUCGazaCcvej1ToCQYBMovJZYaYiYWQvzsvyWruXycZdVDSsyugjEzwQNK3FUEkug2LXiH91NmekGb7kp9gK9kuoxDDhGn1nLKXUpnXR5
 Send this multisig info to all other participants, then use make_multisig <threshold> <info1> [<info2>.

] with others' multisig info This includes the PRIVATE view key, so needs to be disclosed only to that multisig wallet's participants [wallet 9uKCgo]: make_multisig 2 MultisigV1XQugvU4JwcwTQbKdH5qGFnavxUX54wGxNis2iN6zoLD94DahnXbyNxH1NQBp2rYRFFJCT2uiJbssHLJYEAb8X1tS5UCqTXYu3FkgRNSZt5mRNgE58iXZHPj839Pbm3ozGcXmRT6GcRMMxMjRonfYKpnPq1UyZSMN7Qr9AYin1gYyoJSh MultisigV1HVqTW8P4UNWUE8QfBaEdwDWJuXBWEPnTrKqVJiUudGG14cHREk9TKmeR9xzSs4wf4jd22mV94C2ehSViApawnpp2SpRqp19eKXLHz2JmNp7eGR6TJMt4VsDTqANRwb1FtD9weef342f5KXDRZK7iQT1MTubyHhEcFyV5aLCjjQ8owMkH Another step is needed MultisigxV1PQwytRuYGkB6UEVJ7v2S7q492cwNTdwySXyasToAuQQq73TvM1rBrog5bcYz5w2P6Z4jwKtzrHr7shRGo5mAShvLVbYtBdQNhQsizMb51K7iaWQB4te5mQaiB1cok84CbvA9WKnVpTJGyb7SbS7NwAgmpEhU812RTdzrdHp5sD41duYtRNW6qna5mTMYmtTjAEdKpKCvM6EwhV4ncWscpvoBfyYP Send this multisig info to all other participants, then use finalize_multisig <info1> [<info2>.

] with others' multisig info [wallet 9uKCgo]: finalize_multisig MultisigxV1PdeMJo5rxcWTXDJ7rbyuacBseugsn2djZKKEdwvFYVmz73TvM1rBrog5bcYz5w2P6Z4jwKtzrHr7shRGo5mAShvLUxykuq5gho7gGQBCEa3JmBaY7rNHqqUaCUs1WWQi9tojZTMmCJJ4evwJzcXEDqcAd7ShwxsJtJtXdiATs54BbBfyCbwXbnDRKAtagJF36z74KJA58NgEmnHv23ZQeePCoacM MultisigxV1RTwyE53FjKPQaAn4ZMWM5hc8C92eJndpyKby4L9HpF2TUxykuq5gho7gGQBCEa3JmBaY7rNHqqUaCUs1WWQi9tojVbYtBdQNhQsizMb51K7iaWQB4te5mQaiB1cok84CbvA928U2yJFK86jNxtMopxHkcnYjjeYfp8TAB53Y1CukBiHfL2M4EztDALXLReXjJxkMry65Jw6vVePJp2T5CW8T8QE5

Перед отправкой транзакции стороны должны обменяться частичными образами ключей:
 [wallet 9uKCgo]: export_multisig_info ki1
 Multisig info exported to ki1
 [wallet 9uKCgo]: import_multisig_info ki2 ki3
 Height 1103873, txid <f7e648915287fafca1dc67eb26267e09f92bba7ab7fd52a12600c3e6440db0eb>, 2.000000000000, idx 0/0
 Height 1103882, txid <2e3a5591c741c0943a47a2bcbd1ec26493158088c88308bcbfc97423ea95c491>, 0.009000000000, idx 0/0
 Multisig info imported
Далее кошелек повторно синхронизируется с учетом полных ключей и, получив данные об исходящих платежах, участник может подготовить транзакцию:
 [wallet 9uKCgo]: transfer 9vUnTucAioDHD4ZqrFHXAgfLqrsC3LkZ6JFr5axBLhDiFMaHuEk33aqXimoZEMtQh5ibdYxcNSBw2hBZLAsCnuw4B4rBeZX 1
 No payment id is included with this transaction. Is this okay?  (Y/Yes/N/No): Y
 There is currently a 2 block backlog at that fee level. Is this okay?  (Y/Yes/N/No)Y
 
 Transaction 1/1:
 Spending from address index 0
 Sending 1.000000000000.  The transaction fee is 0.012000000000
 Is this okay?  (Y/Yes/N/No): Y
 Unsigned transaction(s) successfully written to file: multisig_monero_tx
Необходимо передать сгенерированный файл другому участнику для подписания и отправки в сеть:
 [wallet 9twQxU]: sign_multisig multisig_monero_tx
 Loaded 1 transactions, for 1.031762770000, fee 0.012000000000, sending 1.000000000000 to 9vUnTucAioDHD4ZqrFHXAgfLqrsC3LkZ6JFr5axBLhDiFMaHuEk33aqXimoZEMtQh5ibdYxcNSBw2hBZLAsCnuw4B4rBeZX, 0.019762770000 change to 9uKCgopHzXrQLnph1ZNFQgdxZZyGhKRLfaNv7EEgWc1f3LQPSZR7BP4ZZn4oH7kAbX3kCd4oDYHg6hE541rQTKtHB7ufnmk, with min ring size 7, no payment ID. Is this okay? (Y/Yes/N/No): Y
 Transaction successfully signed to file multisig_monero_tx, txid 1d28af64bc78d05b625c4f7af7c321d4c8943c4c2692f57aa53e303387f40db6
 [wallet 9twQxU]: submit_multisig multisig_monero_tx
 Loaded 1 transactions, for 1.031762770000, fee 0.012000000000, sending 1.000000000000 to 9vUnTucAioDHD4ZqrFHXAgfLqrsC3LkZ6JFr5axBLhDiFMaHuEk33aqXimoZEMtQh5ibdYxcNSBw2hBZLAsCnuw4B4rBeZX, 0.019762770000 change to 9uKCgopHzXrQLnph1ZNFQgdxZZyGhKRLfaNv7EEgWc1f3LQPSZR7BP4ZZn4oH7kAbX3kCd4oDYHg6hE541rQTKtHB7ufnmk, with min ring size 7, no payment ID. Is this okay? (Y/Yes/N/No): Y
 Transaction successfully submitted, transaction <1d28af64bc78d05b625c4f7af7c321d4c8943c4c2692f57aa53e303387f40db6>
 You can check its status by using the `show_transfers` command.
Очевидно, что хотя этот подход и позволяет при желании использовать мультиподписные кошельки, он не может быть использован неопытными пользователями или, например, пользователями мобильных кошельков.

Поэтому мы разрабатываем собственное решение, которое бы автоматизировало обмен этими данными без ущерба для конфиденциальности сторон и безопасности транзакций, чтобы сделать технологию мультиподписи Monero доступной большему количеству людей.

Решение построено на основе приложений, поддерживающих как стандартные, так и мульти-SIG-кошельки, и открытой серверной части, обеспечивающей обмен и передачу данных на соответствующие кошельки.

Более подробную информацию об этом проекте можно найти на странице кошелек.

exan.tech , а о ресурсах, которые мы поддерживаем для сети Monero — в разделе exan.tech/en/projects/monero .



Заключение

Мы рассмотрели механизм создания мультиподписных кошельков и генерации мультиподписных транзакций в Monero. На данный момент поддерживается лишь ограниченный набор схем подписи, но он будет расширен до произвольных формул типа 2/5 и т.д. Существующий механизм обмена данными, необходимыми для функционирования кошелька, достаточно неудобен, но благодаря открытости Экосистему Monero, с помощью сторонних решений, можно довести до качества, знакомого обычным пользователям.

В следующих статьях мы поговорим о других аспектах устройства Monero: RingCT и кольцевых подписях, архитектуре кошелька и библиотеке libwallet, а также о перспективах развития этого блокчейна.

Задавайте свои вопросы, предлагайте темы для новых статей о технологиях в сфере криптовалют, а также подписывайтесь на нашу группу в Фейсбук чтобы быть в курсе наших событий и публикаций.

Теги: #блокчейн #криптовалюта #Децентрализованные сети #Криптовалюты #Криптография #monero

Вместе с данным постом часто просматривают: