Решение проблемы защиты конфиденциальности данных в протоколах доказательства обязательств

Аннотация: В этой статье мы рассмотрим состояние криптовалютных систем, использующих протоколы доказательства активов (Proof-of-Assets) и доказательства обязательств (Proof-of-Liability), согласно которым биржи публикуют список балансов пользователей, в сумме составляющие общую величину финансовых обязательств биржи. Благодаря этому пользователи могут проверить, включен ли их баланс в этот список, что дает уверенность в платежеспособности биржи. В частности, мы рассмотрим впечатляющую систему биржи Coinfloor, в которой обязательства подтверждаются ежемесячно. Мы также обсудим низкий уровень внедрения этой системы на крупных биржах, что отчасти обусловлено опасениями по поводу конфиденциальности данных в таких протоколах, которые могут раскрывать важную информацию пользователей, например, сведения о балансе счета и его изменении со временем. Мы предложим новую схему подтверждения обязательств, в которой частично решены многие из известных проблем конфиденциальности. Важнейшее новшество в том, что баланс пользователей разбивается на несколько частей, причем соотношение разбивки определяется генератором случайных чисел — это позволяет избежать раскрытия информации о балансе счетов пользователей на платформе.

Обзор

В традиционной финансовой системе одним из инструментов, которые потенциальные клиенты могут использовать для оценки платежеспособности финансовых учреждений, принимающих средства клиентов, является независимая аудиторская проверка. Безусловно, независимый аудит и публикация финансовой отчетности могут использоваться и в криптовалютном пространстве. Однако существуют и другие, гораздо более эффективные инструменты проверки платежеспособности, самые известные из которых — доказательство обязательств (Proof-of-Liability) и доказательство резервов (Proof-of-Reserves). Если использовать эти два вида доказательств в комплексе, это может служить доказательством платежеспособности — по крайней мере, в отношении конкретного токена.

Доказательство резервов > Доказательство обязательств ⇒ платежеспособность

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

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

Доказательство активов

В криптовалютном пространстве реализовать систему на базе доказательства активов (Proof-of-Assets) проще, чем систему на базе доказательства обязательств (Proof-of-Liability). При использовании системы PoA централизованной платформе достаточно периодически публиковать полный список всех биткоин-адресов, которые якобы контролирует биржа. В этом случае любая третья сторона может суммировать все биткоины, связанные с указанными в списке адресами в блокчейне на определенном уровне блока. Таким образом, для подтверждения наличия у биржи криптовалютных активов по сути требуется лишь публикация списка адресов. Улучшением этой системы может быть публикация или раскрытие информации о способах получения адресов с использованием набора открытых ключей, например, скриптов redeem или путей получения каждого адреса, находящегося под контролем биржи.

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

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

Доказательство обязательств

В отличие от доказательства активов, доказательство обязательств — куда более сложная концепция. При использовании PoL биржа публикует список всех обязательств на определенный момент времени (как при использовании схемы PoA). В теории этот список может включать баланс счета и имя каждого кредитора (подробнее о том, почему это непрактично из соображений конфиденциальности, мы расскажем ниже). Но биржа всегда может исключить из списка определенные обязательства, тем самым создавая видимость платежеспособности, а на самом деле находясь в неплатежеспособном состоянии. В качестве решения этой проблемы каждому кредитору предлагается найти себя в открытом списке обязательств. Если хотя бы один кредитор заявит, что его нет в списке, биржа может считаться мошеннической. Проблема в том, что не все кредиторы проверяют список. Но эта система достаточно надежна, так как дает пользователям гораздо больше гарантий в отношении платежеспособности биржи по сравнению с платформами, которые вообще не проводят этот процесс.Очевидно, что при использовании описанной выше методики страдает конфиденциальность пользователей, ведь имя каждого пользователя и история баланса его счета размещаются в открытом доступе. До публикации этой статьи существовали две методики, которые можно было использовать в тандеме для повышения конфиденциальности данных пользователей. Эти идеи были впервые описаны Грегом Максвеллом приблизительно в 2014 году.

  1. Скрывание связи между опубликованными балансами и персональными данными пользователей: имя пользователя может быть исключено из списка; вместо этого список может содержать хэш имени/электронной почты пользователя, связанный с одноразовым случайным числом, которое присваивается каждому пользователю. Так пользователь может убедиться, что он включен в список, а его имя при этом останется в тайне.
  2. Частичная публикация балансов пользователей: полный список обязательств не публикуется; вместо этого все обязательства располагаются в виде листьев дерева Меркла, на вершине которого публикуются суммарные обязательства биржи и хэш. Каждому пользователю показывается минимальная информация, необходимая для перехода от баланса его счета к корню дерева Меркла. В этом случае каждый пользователь может с высокой степенью уверенности убедиться в том, что его баланс включен в общую сумму обязательств биржи, и при этом узнать минимум о других пользователях.

Ниже в качестве примера приведено простое дерево Меркла, соответствующее бирже, у которой всего четыре счета. Если вы являетесь владельцем счета 001, то для того, чтобы убедиться, что ваш баланс в размере 200 сатоши включен в суммарный баланс обязательств биржи в размере 1400 сатоши, требуется только информация внутри области, выделенной красным.

Рисунок 1. Пример схемы использования доказательства обязательств

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

Текущий статус протокола доказательства обязательств

Насколько нам известно, в настоящее время полностью доказательство платежеспособности публикует только британская спотовая биткоин-биржа Coinfloor. Полное доказательство активов и обязательств публикуется каждый месяц. Биржа публикует простой список всех балансов пользователей в виде таблицы с двумя столбцами. В первом столбце указывается хэш случайной строки, присвоенный каждому пользователю, с меткой времени составления таблицы. Во втором столбце указывается баланс пользователя в сатоши. После составления таблицы Coinfloor добавляет хэш таблицы доказательства обязательств в поле OP_Return биткоин-транзакции, в которой сумма расхода превышает сумму обязательств. Таким образом, транзакция выполняет функцию доказательства активов и доказывает платежеспособность Coinfloor. Пример такой биткоин-транзакции можно найти здесь

Биржа Kraken также экспериментировала с протоколами доказательства обязательств. Но, насколько нам известно, разработанная ею схема в настоящее время не используется. Также рекомендуем ознакомиться с недавней статьей Ника Картера, в которой приводится краткий обзор использования схем доказательства резервов (активов) криптовалютными биржами. На наш взгляд, самую надежную систему в настоящее время использует Coinfloor.

Проблемы конфиденциальности данных

Система Coinfloor кажется достаточно надежной и дает неплохую гарантию платежеспособности платформы Coinfloor (насколько это вообще возможно). Но она не идеальна — по крайней мере, с точки зрения конфиденциальности данных пользователей и коммерческих соображений, которые должна учитывать Coinfloor. Компания ежемесячно публикует данные о точном остатке на счетах всех своих клиентов. Как показано на рисунках 2 и 3 ниже, отраслевые аналитики и, возможно, конкуренты могут почерпнуть из этой сводки ценную информацию о клиентах Coinfloor и потенциально использовать ее в целях, которые противоречат интересам Coinfloor. 

Рисунок 2. Распределение счетов пользователей Coinfloor по величине баланса (по состоянию на апрель 2021г.)

Source: Coinfloor, BitMEX Research

Рисунок 3. Количество биткоинов, которые хранятся в Coinfloor, по величине балансов (по состоянию на апрель 2021 г.)

Source: Coinfloor, BitMEX Research

Аналитики также могут использовать эту информацию, чтобы больше узнать об отдельных клиентах Coinfloor. Например, все балансы счетов находятся в открытом доступе, и если величина балансов не меняется (например, если счета не активны), то между ними можно установить связь. Например, в отчете Coinfloor о платежеспособности за апрель 2021 года фигурирует счет с балансом 49 456 707 сатоши. В отчете о платежеспособности за март 2021 года также есть информация о счете с балансом 49 456 707 сатоши. Таким образом, можно с достаточно высокой уверенностью предположить, что на Coinfloor есть счет с балансом 49 456 707 сатоши, который не используется как минимум в течение одного месяца. 

Система Coinfloor кажется надежной и эффективной; действия Coinfloor в этой области заслуживают похвалы, а недостатки, на которые мы указываем здесь, довольно незначительны. Скорее всего, руководство Coinfloor не слишком обеспокоено тем, что раскрывает информацию, которая может представлять коммерческую ценность. Пользователей Coinfloor это, похоже, также не особенно беспокоит. Но если бы аналогичную схему использовала крупная биржа, например, Binance, Coinbase или FTX, понятно, что эти данные стали бы объектом пристального внимания криптовалютных хедж-фондов и отраслевых аналитиков, и их выводы не всегда были бы благоприятны для таких бирж или их клиентов. По нашему мнению, именно из соображений конфиденциальности крупные биржи и не внедряют такие схемы подтверждения обязательств.

Предлагаемые решения проблем конфиденциальности

Команды BitMEX Wallet и BitMEX Research разработали схему, которая позволяет частично решить некоторые из упомянутых выше проблем. Суть в том, что баланс отдельного счета случайным образом распределяется между несколькими листьями дерева Меркла. Баланс каждого пользователя делится как минимум один раз и поэтому распределяется как минимум между двумя листьями. В определенный момент времени (например, каждый месяц) для каждого пользователя генерируется случайное число в диапазоне от 0 до 1. Затем баланс счета пользователя делится в соответствии с этой дробью. Например, если баланс счета пользователя составляет 200 сатоши, и было выбрано число 0,400, баланс будет разделен на две части: 80 сатоши и 120 сатоши. Балансы клиентов разделяются подобным образом до тех пор, пока не будет получено достаточно значений для заполнения структуры дерева. Таким образом, каждый баланс счета разделяется на две или более части. Чтобы проверить свой баланс, необходимо найти его составляющие на нескольких листьях дерева (или в нескольких пунктах списка) и суммировать. Так пользователь может убедиться, что указанный баланс соответствует ожидаемому суммарному балансу счета. Ниже приведена основная информация о предлагаемой схеме.

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

Пример случайного числа счета: 8h9n09il7sdftg74r1

В дополнение к основному случайному числу (nonce) используется случайное число нижнего уровня (sub-nonce), которое меняется в зависимости от уровня блока биткоина. Аналогичным образом устроен хэш SHA1 на Coinfloor, в котором в качестве входных данных для функции хэша используется метка времени, поэтому он разный в каждом экземпляре доказательства обязательств.

Случайное число нижнего уровня = Sha256(случайное число счета, уровень блока биткоина)
Пример случайного числа нижнего уровня:
sha256(8h9n09il7sdftg74r1,680359)=3d70334e74430e0dc4b4e4c8a4152a604a6183428247cf151daa991eb89e9a41

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

Хэш(ID счета, случайное число нижнего уровня, баланс счета (в сатоши) на листе дерева, индекс положения листа)

sha256(001,3d70334e74430e0dc4b4e4c8a4152a604a6183428247cf151daa991eb89e9a41,80,2)=4bf681c36300cbf94cbcd0456ede75826ed90c51497821fd732adba76b22fe51

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

Рисунок 4. Пример схемы доказательства обязательств с улучшенными характеристиками обеспечения конфиденциальности

Балансы на счетах на Рис. 4 такие же, как и на Рис. 1, но на этот раз каждый счет был разделен на два листа, расположение которых было изменено. Например, счет 001 был разделен на два листа: лист с индексом 3 с балансом 80 сатоши и лист с индексом 5 с балансом 120 сатоши. В сумме эти два листа добавляют к общему балансу 200 сатоши, что показано на Рис. 1. Владелец счета 001 получает от биржи случайное число нижнего уровня (sub-nonce). Теперь клиент может просмотреть баланс своего счета на двух листьях — для этого ему нужно найти это число в структуре дерева.

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

На Рисунке 5 ниже показано, как биржа BitMEX раскрывает необходимую информацию пользователю после входа на платформу.

Рисунок 5. Снимок экрана, показывающий, как биржа BitMEX раскрывает пользователю необходимую информацию о доказательстве обязательств

Как проводить новую процедуру подтверждения обязательств

Если биржа публикует полную структуру дерева Меркла, пользователь может проверить, включен ли баланс его счета в общую сумму доказательств, следующим образом:

  1. Пользователь скачивает полное дерево Меркла (несколько сотен мегабайт данных).
  2. Пользователь скачивает предоставленный программный пакет, который может проверить (просканировать) все листья дерева Меркла.
  3. Пользователь получает идентификатор счета и последнее случайное число нижнего уровня (их предоставляет биржа после входа в платформу).
  4. Установленное на компьютере пользователя ПО сканирует все листья дерева Меркла, выполняя хэш-функции и ища совпадение на каждом листе. Входными данными для хэш-функции являются идентификатор счета и полученное случайное число нижнего уровня, а также индекс листа и баланс. Индекс листа и баланс можно вывести на основе самого дерева: индекс листа соответствует положению в дереве, а баланс прямо указан на каждом листе.
  5. После того как все совпадения обнаружены, пользователю сообщается, на каких листьях указаны его балансы. Их можно суммировать, чтобы убедиться, что они соответствуют ожиданиям пользователя и балансу его счета на момент получения доказательства. Это дает пользователю уверенность в том, что его баланс включен в список обязательств биржи.

Краткое описание полей в дереве Меркла

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

Элемент данных

Почему он необходим?

Случайное число нижнего уровня

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

Индекс листа

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

Баланс

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

Четыре типа гарантий

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

  1. Проверка дерева Меркла и списка обязательств: сумма отдельных обязательств должна быть равна общей величине обязательств и не должна превышать резервы.
  2. Проверка включения баланса счета пользователя (заинтересованного лица) в общедоступный список обязательств.
  3. Проверка включения в список обязательств баланса счетов других пользователей (для этого нужно получить случайное число нижнего уровня и ID счета у других пользователей — либо напрямую, либо из открытого источника).
  4. Отсутствие заявлений других проверенных владельцев счетов о том, что их баланс не включен в список обязательств (мошенник всегда может заявить об этом, и мы не уверены, что существует эффективный способ это предотвратить).

Заключение

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

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

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