Перевод О том, что такое мультиподписи Monero

Тема в разделе "Статьи", создана пользователем Mr. Pickles, 18 июл 2018.

  1. Mr. Pickles

    Команда форума Модератор Редактор

    Регистрация:
    11 сен 2017
    Сообщения:
    301
    Симпатии:
    107
    Этим текстом мы открываем новую серию публикаций, в которой будем рассказывать о механизмах работы различных блокчейнов, которые в настоящее время существуют в отрасли. И сегодня я рад представить вам первый объект наших исследований: Monero - всем известная и ориентированная на защиту конфиденциальности криптовалюта. Будучи анонимной, сеть использует ряд интересных алгоритмических и криптографических решений, включая мультиподписи (или просто multisig), схему реализации цифровых подписей, позволяющую множеству пользователей одновременно, образуя группу, подписывать документы.
    1.jpeg
    Несмотря на то, что протокол мультиподписей был реализован Monero уже несколько месяцев назад, в сети по-прежнему наблюдается недостаток информации, касающейся принципов работы этой технологии. Поэтому, прежде всего, нам бы хотелось заполнить этот пробел. Так как сам процесс создания транзакции с применением протокола мультиподписей довольно сложен, мы решили сфокусировать внимание только на его самых важных аспектах, включая процесс создания кошелька и обмена ключами, чего, на наш взгляд, будет достаточно для того, чтобы понять сильные и слабые стороны этой технологии.

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

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

    Общее количество владельцев и пороговое значение одобрения определяют так называемую «схему» кошелька. Например, у кошелька 3/3, использующего протокол multisig, будет три владельца, которые должны будут анонимно подтверждать каждую транзакцию, в то время как в случае с кошельком 2/3 любому из владельцев, чтобы перевести средства, понадобится всего лишь ещё один голос.

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

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

    Каждый кошелёк Monero использует два набора приватных и публичных криптографических ключей. Каждый набор включает в себя «ключ траты» и «ключ просмотра». Вместе ключи конкретного кошелька формируют адрес, который используется для получения средств. Подобным образом добавление приватного ключа просмотра к приватному ключу траты создаёт ключ отслеживания, который другая сторона может использовать для отслеживания средств, отправленных на ваш кошелёк (но никогда не наоборот — вашей анонимности ничего не угрожает).

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

    Для краткости, начиная с этого момента, для обозначения публичных ключей мы будет использовать только заглавные буквы (то есть B для публичного ключа траты) и строчные для обозначения приватных ключей (то есть b для приватного ключа траты). Чтобы вам были понятны обозначения, которые будут использованы ниже, взгляните на формулу, которая показывает, как публичный ключ выводится на основе приватного ключа:
    2.png

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

    Использование мультиподписей в Monero

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

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

    Создание кошелька multisig в Monero

    В настоящее время программное обеспечение Monero поддерживает только схемы N/N и N-1/N. Чтобы настроить multisig кошелёк N/N, пользователям необходимо произвести один ряд вычислений, а схема N-1/N подразумевает наличие всего одного дополнительного шага. Процесс создания кошелька 2/2 показан на рисунке 1.

    3.jpg
    Рисунок 1. Создание multisig кошелька 2/2

    Сначала участники делятся всеми своими приватными ключами просмотра и публичными ключами траты, а затем вычисляют их соответствующие суммы. Сумма приватных ключей просмотра становится приватным ключом просмотра для нового кошелька, а его публичный ключ просмотра выводится на основе приватного. Затем подобным образом вычисляется и публичный ключ траты. Если была выбрана схема N/N, то на этом всё и закончится. Кошелёк будет создан.

    Если же пользователями была выбрана схема N-1/N, им по-прежнему придётся делиться своими приватными ключами просмотра и публичным ключами траты друг с другом. После этого каждый участник будет должен умножить все полученные публичные ключи траты на свой собственный приватный ключ траты. Таким образом, создаётся новый набор приватных ключей траты, который называется «ключами с мультиподписями» (multisignature keys), как показано на рисунке 2.

    4.jpg
    Рисунок 2. Создание multisig кошелька 2/3

    Вы, должно быть, заметили, что на рисунке выше ключи одинакового цвета имеют одинаковое значение. Причина заключается в том, что такие ключи с мультиподписями обладают одним важным свойством, которое можно выразить следующим равенством:
    5.png
    Для простоты при умножении приватного ключа на публичный, индекс может перемещаться как угодно, и это никак не повлияет на результат (между прочим, это то самое свойство произведения, которое лежит в основе протокола обмена ключами Диффи-Хеллмана на основе эллиптической кривой). Это означает, что каждый multisig ключ совместно используется двумя определёнными участниками.

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

    Теперь участникам остаётся вычислить только ключ просмотра, и делается это точно так же, как и в случае с кошельком 2/2.

    А теперь, когда кошелёк создан, можно перейти к следующему этапу и узнать, как им пользоваться.

    Транзакции Monero

    Для того чтобы понять как провести multisig транзакцию, давайте кратко рассмотрим как в целом перемещаются средства в блокчейне Monero. В предельно упрощённой форме (без учёта кольцевых подписей и протокола RingCT) это работает следующим образом:

    6.jpg
    Рисунок 3. Упрощённая схема транзакции

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

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

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

    С точки зрения сети multisig транзакция не является другой в каком-либо смысле, несмотря на то, что она чуть более сложна. Обычно она проводится в несколько этапов:

    • участники обмениваются частичными образами ключей всех известных выходов;

    • участники пересинхронизируют свои кошельки, чтобы выяснить точный баланс с учётом образов ключей;

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

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

    Для того чтобы правильно провести транзакцию, пользователю необходимо восстановить образ ключа для каждого выхода, затем синхронизироваться с блокчейном и определить то, какие выходы были потрачены, после чего он сможет перейти к формированию транзакции. На рисунке 4 показан процесс восстановления образов ключей для кошелька 2/3.

    7.jpg
    Рисунок 4. Восстановление образов ключей для кошелька 2/3

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

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

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

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

    Вот пример процедур, необходимых для создания кошелька по схеме 2/3 и подписания транзакции. Каждый участник, используя утилиту monero-wallet-cli, вводит следующие команды:
    HTML:
    [wallet 9uKCgo]: prepare_multisig
    MultisigV1baCWviNomMXe271W8HW4imh8SsnNEWP2bCswQfoB9MGzNZ8FUG3e8UCNm5toKQzSQH2e8rUWUCGazaCcvej1ToCQYBMovJZYaYiYWQvzsvyWruXycZdVDSsyugjEzwQNK3FUEkug2LXiH91NmekGb7kp9gK9kuoxDDhGn1nLKXUpnXR5
    Используется ПРИВАТНЫЙ ключ просмотра, который раскрывается только участникам multisig кошелька:
    HTML:
    [wallet 9uKCgo]: make_multisig 2 MultisigV1XQugvU4JwcwTQbKdH5qGFnavxUX54wGxNis2iN6zoLD94DahnXbyNxH1NQBp2rYRFFJCT2uiJbssHLJYEAb8X1tS5UCqTXYu3FkgRNSZt5mRNgE58iXZHPj839Pbm3ozGcXmRT6GcRMMxMjRonfYKpnPq1UyZSMN7Qr9AYin1gYyoJSh MultisigV1HVqTW8P4UNWUE8QfBaEdwDWJuXBWEPnTrKqVJiUudGG14cHREk9TKmeR9xzSs4wf4jd22mV94C2ehSViApawnpp2SpRqp19eKXLHz2JmNp7eGR6TJMt4VsDTqANRwb1FtD9weef342f5KXDRZK7iQT1MTubyHhEcFyV5aLCjjQ8owMkH
    
    Another step is needed
    
    MultisigxV1PQwytRuYGkB6UEVJ7v2S7q492cwNTdwySXyasToAuQQq73TvM1rBrog5bcYz5w2P6Z4jwKtzrHr7shRGo5mAShvLVbYtBdQNhQsizMb51K7iaWQB4te5mQaiB1cok84CbvA9WKnVpTJGyb7SbS7NwAgmpEhU812RTdzrdHp5sD41duYtRNW6qna5mTMYmtTjAEdKpKCvM6EwhV4ncWscpvoBfyYP
    Эта multisig информация отправляется всем участникам, а затем используется finalize_multisig <info1> [<info2> …] с multisig информацией остальных:
    HTML:
    [wallet 9uKCgo]: finalize_multisig MultisigxV1PdeMJo5rxcWTXDJ7rbyuacBseugsn2djZKKEdwvFYVmz73TvM1rBrog5bcYz5w2P6Z4jwKtzrHr7shRGo5mAShvLUxykuq5gho7gGQBCEa3JmBaY7rNHqqUaCUs1WWQi9tojZTMmCJJ4evwJzcXEDqcAd7ShwxsJtJtXdiATs54BbBfyCbwXbnDRKAtagJF36z74KJA58NgEmnHv23ZQeePCoacM MultisigxV1RTwyE53FjKPQaAn4ZMWM5hc8C92eJndpyKby4L9HpF2TUxykuq5gho7gGQBCEa3JmBaY7rNHqqUaCUs1WWQi9tojVbYtBdQNhQsizMb51K7iaWQB4te5mQaiB1cok84CbvA928U2yJFK86jNxtMopxHkcnYjjeYfp8TAB53Y1CukBiHfL2M4EztDALXLReXjJxkMry65Jw6vVePJp2T5CW8T8QE5
    Перед тем как отправить транзакцию, все стороны должны обменяться частичными образами ключей:
    HTML:
    [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
    После этого кошелёк пересинхронизируется, чтобы проверить полноту ключей. После получения данных об исходящих платежах один из участников может начать проведение транзакции:
    HTML:
    [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
    Затем сгенерированный файл передаётся другому участнику для подписания и дальнейшей передачи в сеть:
    HTML:
    [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>
    Статус транзакции можно проверить, используя команду show_transfers.

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

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

    Больше информации, касающейся нашего вклада в дело Monero, вы найдёте по ссылке https://exan.tech/en/projects/monero/, а также на странице проекта: https://wallet.exan.tech.

    Выводы

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

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

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

    Источник: Monero multisignatures explained

    Перевод:
    Mr. Pickles (@v1docq47)
    Редактирование:
    Agent LvM (@LvMi4)
    Коррекция:
    Kukima (@Kukima)
     
    #1 Mr. Pickles, 18 июл 2018
    Последнее редактирование модератором: 23 июл 2018
    MoneroRus и TheFuzzStone нравится это.
  • О нас

    Наш сайт является одним из уникальных мест, где русскоязычное сообщество Monero может свободно общаться на темы, связанные с этой криптовалютой. Мы стараемся публиковать полезные мануалы и статьи (как собственные, так и переводы с английского) о криптовалюте Monero. Если вы хорошо владеете английским (или можете писать собственные статьи/мануалы) и хотите помочь в переводах и общем развитии Monero для русскоязычной аудитории - свяжитесь с одним из администраторов.