Кольцевая подпись позволяет подписать сообщение от имени группы так, что любой может проверить, что подпись сделана одним из ключей группы, но никто не может сказать, каким именно. В этой статье объясняется, как работают кольцевые подписи, — от статьи 2001 года, в которой они были представлены, до образов ключей и CLSAG, — и показано, как Blocknet использует кольцо из 16, чтобы отправитель каждого платежа оставался приватным.
Что такое кольцевая подпись?
Кольцевая подпись — это цифровая подпись, созданная одним приватным ключом и набором публичных ключей других людей. Проверяющий может убедиться, что подписал владелец одного из этих ключей, но не может сказать, какого именно. Подписант выбирает группу на месте, без предварительной настройки и без участия остальных членов.
Обычная цифровая подпись привязывает сообщение к одному публичному ключу. Кольцевая подпись привязывает его к набору публичных ключей, который называется кольцом. Подписанту нужен только собственный приватный ключ; остальные участники не вносят ничего, кроме уже опубликованных ими публичных ключей. Для стороннего наблюдателя каждый участник кольца — одинаково правдоподобный подписант.
Откуда взялись кольцевые подписи?
Рон Ривест, Ади Шамир и Яэль Тауман представили кольцевые подписи на ASIACRYPT 2001 в статье под названием «How to Leak a Secret» («Как раскрыть секрет»). Их пример — член кабинета министров, который хочет передать журналисту информацию так, чтобы было доказано, что она исходит от кабинета, но не было видно, от какого именно министра. Он подписывает своим ключом и публичными ключами других членов кабинета, и журналист может проверить подпись, не узнав, кто её написал.
Идея выделялась двумя свойствами. Нет менеджера группы, который мог бы раскрыть подписанта, — это отличает кольцевые подписи от более старых групповых подписей. И кольцо спонтанное: подписант может собрать его из любых опубликованных ключей в момент подписания. Авторы выбрали название, потому что «кольца — это геометрические фигуры с однородной периферией и без центра»: каждый участник находится на краю, и никто не главный. Алгоритм подписи имеет ту же форму — цепочку вычислений, которая замыкается сама на себя.
Как работает кольцевая подпись?
Современные схемы, используемые в криптовалютах, строят эту петлю из хешей и ключей на эллиптических кривых. Вот идея в простых шагах для кольца из 16 публичных ключей:
- Начните со своей позиции. Подписант выбирает случайное секретное число и хеширует его вместе с сообщением. Этот хеш становится вызовом (challenge) для следующей позиции в кольце.
- Подделайте ответ для каждой другой позиции. Для каждого из остальных 15 участников подписант выбирает случайный ответ и объединяет его с публичным ключом этого участника и текущим вызовом, чтобы вычислить вызов для следующей позиции.
- Замкните кольцо. Пройдя полный круг, цепочка возвращается к позиции самого подписанта. Только тот, у кого есть приватный ключ этой позиции, может вычислить единственный ответ, при котором цепочка придёт ровно туда, откуда началась.
Подпись — это начальный вызов плюс 16 ответов. Проверяющий начинает с любого места, проходит по кольцу, заново вычисляя каждый вызов из публичных ключей и ответов, и проверяет, что петля замыкается. Каждая позиция выглядит одинаково: публичный ключ и ответ, похожий на случайный. Ничто не указывает, откуда начал подписант, поэтому проверяющий узнаёт, что кольцо замкнул один приватный ключ, и ничего о том, какой именно.
Как образы ключей предотвращают двойную трату?
Для денег у простой кольцевой подписи есть один пробел: если каждая трата скрывается среди других выходов, сеть не видит, что одни и те же монеты потратили дважды. Связываемые кольцевые подписи решают эту проблему. Джозеф Лю, Виктор Вэй и Дункан Вонг описали первую такую схему, LSAG, на ACISP 2004 (ePrint 2004/027). Две подписи, созданные одним и тем же приватным ключом, можно связать друг с другом, при этом подписант по-прежнему скрывается в кольце.
Схема CryptoNote 2013 года превратила это в образ ключа. Для выхода с приватным ключом x и публичным ключом P кошелёк вычисляет I = x · Hp(P), где Hp хеширует публичный ключ в точку на кривой. Подпись доказывает, что I принадлежит тому участнику кольца, который подписал, не говоря, какому именно. Поскольку образ ключа зависит только от тратимого выхода, повторная трата этого выхода всегда даёт тот же I. Каждая нода хранит список уже встречавшихся образов ключей и отклоняет любую транзакцию, которая повторяет один из них.
От MLSAG к CLSAG
Криптовалютам, которые также скрывают суммы, нужно, чтобы кольцевая подпись доказывала второй факт: что скрытая сумма входа совпадает с тем, что тратит транзакция. Статья Шена Нётера 2015 года «Ring Signature Confidential Transactions for Monero» (RingCT) сделала это с помощью MLSAG — кольцевой подписи над двумя наборами ключей: одним для владения и одним для обязательств сумм.
CLSAG от Брэндона Гуделла, Саранга Нётера и Артура Блю (ePrint 2019/654) доказывает те же два факта компактнее. Monero перешёл с MLSAG на CLSAG в обновлении октября 2020 года. Документация Monero сообщает о проверке примерно на 20% быстрее и об уменьшении типичной транзакции с двумя входами и двумя выходами примерно с 2,5 kB до 1,9 kB.
Что размер кольца значит для приватности?
Размер кольца — это число выходов в каждом кольце: настоящий плюс ложные входы. Кольцо из 16 означает, что наблюдатель видит 16 одинаково допустимых кандидатов для каждого входа. Фиксированный размер важен не меньше, чем большой, потому что когда каждый вход использует один и тот же размер, сам размер ничего не говорит о том, кто составил транзакцию.
Ложные входы — это реальные выходы из блокчейна, поэтому каждый из них действительно может быть тратимой монетой. Если бы размер колец мог меняться, кошелёк, выбравший необычный размер, помечал бы собственные транзакции. Monero увеличил размер кольца с 11 до 16 в обновлении августа 2022 года, а Blocknet по правилам консенсуса использует 16 для каждого входа.
Как Blocknet использует кольцевые подписи
Каждый вход в Blocknet подписывается с помощью CLSAG и RingCT над кольцом ровно из 16 выходов. Правила обеспечиваются консенсусом, поэтому ни один кошелёк не может от них отказаться:
- Фиксированное кольцо из 16. Демон отклоняет любой вход, кольцо которого состоит не ровно из 16 участников. Его код фиксирует размер, «чтобы предотвратить утечку информации из-за переменного размера колец».
- Только реальные выходы. Каждый участник кольца должен быть реальным выходом, уже находящимся в блокчейне, поэтому каждый ложный вход — это монета, которая действительно могла бы быть потрачена.
- Случайные ложные входы и случайная позиция. Кошелёк перемешивает выходы блокчейна с помощью криптографически стойкого генератора случайных чисел, чтобы выбрать 15 ложных входов, а затем ставит ваш настоящий выход на случайную позицию в кольце.
- Владение и сумма в одном доказательстве. Каждая подпись доказывает, что вы владеете одним участником кольца и что скрытая сумма вашего входа совпадает с обязательством этого участника, поэтому суммы сходятся, не будучи показанными.
- Образы ключей проверяются по блокчейну. Образ ключа входит в подписываемые данные, и сеть отклоняет транзакцию, если этот образ ключа уже был потрачен или встречается дважды в одной транзакции.
У формата транзакций нет прозрачного режима, поэтому каждый платёж в блокчейне содержит такие кольца. Кольцевые подписи скрывают отправителя; одноразовые стелс-адреса скрывают получателя, а обязательства Педерсена с Bulletproofs скрывают сумму. В статье о том, как Blocknet сохраняет платежи приватными, разобран каждый из этих уровней и то, что они значат, когда вы кому-то платите.
Что дальше: обновление Faraday
Blocknet планирует обновление сети под названием Faraday, активация которого, согласно blocknetcrypto.com, запланирована примерно на 16 февраля 2027 года. Как сказано на сайте: «Сегодня трата скрывается среди 16 выходов. После Faraday она будет скрываться среди всех выходов в блокчейне». Faraday также принесёт новые доказательства трат, которые сайт описывает так: «Созданы так, чтобы квантовый компьютер не мог подделать трату». Проектирование, тестирование и состязательная проверка продолжаются, и указанные даты — плановые, не окончательные.
Получите BNT, чтобы отправлять их приватно
Простой способ получить монеты, которые используют эти кольца, — намайнить их. Майнер seine бесплатный, с открытым исходным кодом и сам подстраивается под ваш компьютер, а bntpool.com — его пул по умолчанию, так что вы сможете начать майнить уже через несколько минут. Руководство по майнингу описывает настройку, и вы можете майнить прямо на свой адрес или на имя Blocknet ID.
Часто задаваемые вопросы
Чем кольцевая подпись отличается от групповой подписи?
Групповой подписи нужен менеджер, который заранее создаёт группу и может раскрыть, кто подписал. У кольцевой подписи нет ни менеджера, ни предварительной настройки: подписант выбирает любой набор публичных ключей на месте, и никто, включая владельцев использованных ключей, не может потом доказать, какой участник создал подпись.
Что такое образ ключа в кольцевой подписи?
Образ ключа (key image) — это значение, вычисленное из приватного ключа тратимого выхода. Один и тот же выход всегда даёт один и тот же образ ключа, поэтому сеть отклоняет его повторную трату, но при этом образ ключа не раскрывает, какой участник кольца настоящий. Он превращает кольцевую подпись в связываемую кольцевую подпись, которая предотвращает двойную трату.
Что такое CLSAG?
CLSAG — это схема связываемой кольцевой подписи, описанная Брэндоном Гуделлом, Сарангом Нётером и Артуром Блю в 2019 году. Она доказывает, что подписант владеет одним выходом в кольце и что суммы сходятся, а образ ключа не допускает двойных трат. Monero перешёл на неё в октябре 2020 года, а Blocknet подписывает каждый вход с помощью CLSAG и RingCT.
Какой размер кольца использует Blocknet?
Blocknet использует кольцо ровно из 16 участников для каждого входа: настоящий выход плюс 15 ложных входов (decoy), каждый из которых — реальный выход, уже находящийся в блокчейне. Консенсус отклоняет любой другой размер. Поскольку каждый вход использует один и тот же размер, размер кольца никогда не может выделить транзакцию, а настоящий выход стоит на случайной позиции в кольце.
Скрывают ли кольцевые подписи сумму платежа?
Нет. Кольцевая подпись скрывает, какой выход заплатил. Суммы скрывает отдельный уровень: обязательства Педерсена, которые фиксируют число, не показывая его, плюс доказательства диапазона Bulletproofs, которые доказывают, что каждая сумма корректна. Blocknet использует всё это вместе в каждой транзакции, наряду с одноразовыми стелс-адресами, которые скрывают получателя.