Для финансовых сервисов критически важна безопасность средств, которые находятся в их управлении. Одна из самых главных задач при разработке централизованной биржи криптовалют — защита средств клиентов. В рамках авторской колонки Евгений Павленко, CTO Axioma Group, рассказал на примере собственных разработок, почему хорошим способом защиты для биткоина и его форков, которые используют модель транзакций с UTXO, является многократная подпись (multisig).

Как работают криптобиржи

Клиенты вводят свои средства на биржу через специальный hot-wallet, находящийся под полным контролем биржи. Для всех клиентов в hot-wallet создаются уникальные адреса, причем для обеспечения анонимности в блокчейне для каждой операции депозита можно использовать новый адрес. Полученные средства никак не закрепляются за клиентом. Вывод средств с биржи может производиться с любых адресов, которые выберет алгоритм формирования транзакции. Обычно это те адреса, на которые другие клиенты ранее внесли депозиты. Также могут быть задействованы адреса из change-wallet, где аккумулируется сдача от предыдущих транзакций, либо адреса для работы с cold-wallet, куда в целях дополнительной безопасности поступают излишки средств, не участвующих в ежедневной операционной деятельности.

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

Безопасность и требования бизнеса

Однако эти меры безопасности создали проблемы для бизнес-требования — иметь неограниченный запас адресов для депозита, которые могут понадобиться клиентам в любой момент. Тогда решили применить стандарт BIP-32 Hierarchical Deterministic Wallet (open-source реализация этого стандарта). Эта библиотека работает для биткоина «из коробки», но ее можно адаптировать для любого форка, добавив параметры нужных сетей.

Благодаря применению BIP-32 необходимое количество адресов для депозита можно моментально создать в бирже, а затем добавить в hot-wallet в режиме watch-only, чтобы отслеживать транзакции депозита. В момент следующей расшифровки кошелька для таких адресов воссоздаются приватные ключи, и пришедшие на них депозиты поступают в распоряжение биржи.

Больше безопасности на блокчейне

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

Это частный случай стандарта BIP-16 Pay to Script Hash (P2SH), который позволяет добавлять в транзакции блокчейна дополнительные правила проверки. Вместе с подписью транзакции вывода средств на стороне hot-wallet было решено дополнительно заверять ее второй подписью. Новую сторону, которая добавляет вторую подпись перед отправкой транзакции в сеть, так и назвали — бухгалтерия (английский термин — co-signer). Здесь ответственный сотрудник, перед тем как поставить свое одобрение, может изучить детали транзакции и убедиться, что она легитимна, то есть состоит из правомерных заявок на вывод средств от реальных пользователей биржи.

Для ввода средств на биржу пользователям теперь нужно выдавать специальные multisig-адреса. Чтобы распоряжаться присланным депозитом, необходимо знать оба приватных ключа, которые были использованы для создания адреса этого депозита. Один приватный ключ сохраняется в зашифрованном виде в hot-wallet, второй — на сервере бухгалтерии. Для сохранения конфиденциальности ключи второй подписи должны генерироваться в том же объеме и храниться независимо от остального проекта. Осталось решить, как теперь получить неограниченный запас multisig-адресов для работы депозитов на бирже.

Новый инструмент для мультиподписи

Анализируя пути реализации multisignature, мы обнаружили нехватку доступного работающего решения. Multisig-адрес для депозита должен быть детерминировано получен из пары адресов (публичных ключей) — адреса из hot-wallet и соответствующего ему адреса из бухгалтерии. Для бухгалтерии мы вновь можем применить уже знакомый BIP-32, чтобы оперировать в бирже только публичными ключами, не нарушая конфиденциальность приватных ключей. Имея на сервере биржи пару публичных ключей, соответствующих искомому multisig-адресу, можно применить стандарт BIP-45 Structure for Deterministic P2SH Multisignature Wallets. Этот стандарт позволяет генерировать детерминированные multisig-адреса для депозита, используя только публичные ключи. Это единственно разумный вариант, потому что применение в этой процедуре приватных ключей от сразу нескольких сторон нарушает их конфиденциальность. В качестве бонуса обеспечивается резервное копирование депозитов: в любой момент можно восстановить все адреса, получив публичные ключи hot-wallet и бухгалтерии.

Команда наших программистов не нашла доступных библиотек, работающих со стандартом BIP-45, и решила скомбинировать уже существующие технологии для реализации этого стандарта. Добавив в наш toolchain библиотеку Bitcoin-ruby, мы разработали новую библиотеку, которая полностью соответствует стандарту BIP-45. Такой подход оказался очень эффективным, так как позволил максимально быстро получить нужный инструмент, отсутствующий на рынке.

Потребовалось еще одно изменение, связанное с безопасностью средств на change-wallet. В процессе работы проекта здесь могут накапливаться значительные суммы. Можно пытаться минимизировать эффект, например, перечислив эти средства на cold-wallet. Мы пошли другим путем и перевели эти адреса также на схему с multisignature. Это не потребовало изменений в архитектуре. При формировании выходов транзакции используется адрес из нового пула адресов «для сдачи», который наполняется по той же самой схеме, что и адреса для депозитов.

Результат: удобство работы и безопасность

Внедрение нового решения не сильно повлияло на существующую схему работы. Multisig-адреса для депозита по-прежнему генерируются на стороне биржи и сохраняются в кошельках hot-wallet. Здесь же находится один из пары приватных ключей, необходимый для управления средствами. Вторые приватные ключи располагаются на новой площадке, созданной для бухгалтерии. Все исходящие транзакции, будучи подписанными на hot-wallet, направляются на эту площадку для получения второй подписи. Только после подтверждения эти транзакции попадают в блокчейн. Инфраструктуру площадки для бухгалтерии мы сделали полностью независимой от основного проекта, чтобы минимизировать ущерб от возможного взлома серверов проекта.

В результате внедрения технологии multisig повысился уровень защиты средств в криптовалюте, которые пользователи доверяют бирже. Ни один сотрудник не обладает полной информацией, которая дает возможность потратить эти средства. Сервера hot-wallet и бухгалтерии находятся на разных площадках, их обслуживание ограничено регламентом, этим занимается ответственный персонал, не связанный друг с другом. Все приватные ключи зашифрованы. Значительно выросла защита от внешних угроз. Чтобы получить доступ к средствам, злоумышленнику теперь потребуется последовательно взломать три независимых площадки, а также узнать пароли, которыми зашифрованы кошельки. Резервные копии мастер-ключей для hot-wallet и бухгалтерии хранятся отдельно, в надежных местах. На основе резервных копий имеется возможность восстановить 100% инфраструктуры hot-wallet и бухгалтерии с нуля.


По вопросам размещения материалов в рамках авторской колонки, пожалуйста, пишите на np@decenter.org.