Объясняем как работает мультисиг, как им пользоваться и чем его заменить, если не хотите деплоить контракты.
Как работает приватный ключ?
Сначала вспомним основы. Криптокошелек или же аккаунт — это пара из публичного и приватного ключей:
- публичный — уникальный идентификатор аккаунта, как номер телефона или номер банковской карты;
- приватный — пароль для управления аккаунтом.
При создании нового аккаунта сеть сначала генерирует случайный приватный ключ, а потом получает из него публичный.
Когда владелец аккаунта совершает любую операцию со своим адресом, он отправляет блокчейн-ноде инструкции, подписанные его приватным ключом. Нода с помощью криптографических функций может проверить, что подпись была создана на базе приватного ключа, который соответствует публичному ключу нужного адреса.
Грубо говоря, с помощью подписи нода убеждается, что операцию с адресом хочет выполнить человек, у которого есть ключ от этого адреса.
В итоге: если у пользователя есть приватный ключ — он может управлять средствами на соответствующем адресе. Если ключ получит другой пользователь, он также получит доступ к адресу. Поэтому приватные ключи нужно хранить на безопасном устройстве, желательно не подключенному к интернету.
Как работает мультисиг?
Мультисиг — это смарт-контракт, который выполнит какую-либо операцию только если ее подписали несколько ранее привязанных приватных ключей. Количество необходимых подписей называется пороговым значением (treshold).
Он работает так:
- Алиса, Боб и Ева создали мультисиг-контракт на базе своих публичных ключей с пороговым значением 2 и внесли на него 100 tez.
- Алиса и Боб хотят отправить 10 tez Еве.
- Алиса запрашивает octez-client подготовить код инструкции для подписи и передает код Бобу.
- Алиса и Боб подписывает код своими ключами.
- Алиса инициирует транзакцию контракта и передает ей обе подписи.
- Контракт проверяет, что подписи соответствуют привязанным к нему публичным ключам, и отправляет 10 tez Еве.
Мультисиг нужен для очень безопасного хранения средств. Например, если хакер получит доступ к одному приватному ключу от мультисига, то не сможет вывести из него средства. Когда владельцы других ключей узнают о краже ключа, они закроют уязвимость: уберут из хранилища контракта скомпрометированный ключ и добавят вместо него новый.
Также мультисиг можно использовать в одиночку. Например, хранить один ключ в блокноте, второй — на десктопе, третий — на смартфоне. Если хакер получит доступ к десктопу, то без доступа к смартфону и блокноту не сможет вывести из адреса средства. А если пользователь потеряет смартфон, то все равно сможет управлять адресом с помощью ключей на десктопе и в блокноте.
Как пользоваться мультисигом на Tezos?
Команда Attic Labs разработала приложение TzSign для деплоя и работы с мультисиг-контрактами. Мы смогли задеплоить контракт, однако дальше получили ошибку «Контракт не найден».
Второй способ — самостоятельно задеплоить контракт через octez-client (теперь tezos-client называется так). Мы следовали инструкции с Tezos Gitlab — все работает.
Публикация мультисиг-контракта:
octez-client deploy multisig MULTISIG_NAME transferring 1 from PUB_KEY1 with threshold X on public keys PUB_KEY1 PUB_KEY2 PUB_KEY9000 –burn-cap 1
Значения в команде:
- MULTISIG_NAME — псевдоним контракта в конкретном octez-client, чтобы не вводить каждый раз адрес мультисига;
- transferring 1 from PUB_KEY1 — депозит 1 tez на адрес контракта с адреса PUB_KEY1. Этими средствами будет изначально управлять мультисиг;
- treshold X — пороговое значение подписей;
- PUB_KEY1, PUB_KEY2, PUB_KEY9000 — адреса, которые смогут управлять контрактом. Их может быть сколько угодно, можно указывать псевдонимы импортированных приватных ключей или просто адреса формата tz…
Подготовка транзакции:
octez-client prepare multisig transaction on MULTISIG_NAME transferring X to PUB_KEY2
В ответе octez-client выдаст значение bytes to sign — это и есть инструкции, которые нужно подписать и передать мультисиг-контракту для выполнения транзакции.
Подпись байтов:
PUB_KEY1_SIGNATURE=$(octez-client sign bytes ‘BYTES’ for PUB_KEY1 | cut -d ‘ ‘ -f 2)
Значения:
- PUB_KEY1_SIGNATURE — внутренняя переменная терминала, которой он присвоит значение подписи;
- BYTES — значение Bytes to sign. Не забудьте одинарные кавычки.
Такие подписи нужно сделать от имени порогового количества адресов. Если байты нужно подписать на другой машине, уберите присвоение переменной:
octez-client sign bytes ‘BYTES’ for PUB_KEY1
Клиент выдаст строку с подписью. Ее нужно передать инициатору транзакции.
Отправка транзакции:
octez-client from multisig contract MULTISIG_NAME transfer X to PUB_KEY1 on behalf of PUB_KEY2 with signatures “$PUB_KEY1_SIGNATURE” “$PUB_KEY2_SIGNATURE”
Результат: тестовая транзакция в 0,4 tez с нашего мультисига прошла успешно.
Офчейн-мультисиг — схема Шамира
Схема разделения секрета Шамира или просто схема Шамира — это разделение секретного сообщения на несколько частей, из определенного количества которых можно восстановить исходное сообщение.
Для безопасного хранения приватного ключа ее можно использовать так:
- Разбить приватный ключ на несколько частей.
- Записать каждую часть на разные носители информации.
- При необходимости воспользоваться ключом прочитать нужное количество частей и восстановить их них ключ.
Многие онлайн-сервисы для криптографии предоставляют бесплатные приложения для работы со схемой Шамира. Мы использовали сайт iancoleman.io и разбивали ссылку на мультисиг-контракт на TzKT.