6 января 2023

Что такое мультисиг и зачем он нужен? Объясняем простыми словами

Объясняем как работает мультисиг, как им пользоваться и чем его заменить, если не хотите деплоить контракты.

Как работает приватный ключ?

Сначала вспомним основы. Криптокошелек или же аккаунт — это пара из публичного и приватного ключей:

  • публичный — уникальный идентификатор аккаунта, как номер телефона или номер банковской карты;
  • приватный — пароль для управления аккаунтом.

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

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

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

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

Как работает мультисиг?

Мультисиг — это смарт-контракт, который выполнит какую-либо операцию только если ее подписали несколько ранее привязанных приватных ключей. Количество необходимых подписей называется пороговым значением (treshold).

Он работает так:

  1. Алиса, Боб и Ева создали мультисиг-контракт на базе своих публичных ключей с пороговым значением 2 и внесли на него 100 tez.
  2. Алиса и Боб хотят отправить 10 tez Еве.
  3. Алиса запрашивает octez-client подготовить код инструкции для подписи и передает код Бобу.
  4. Алиса и Боб подписывает код своими ключами.
  5. Алиса инициирует транзакцию контракта и передает ей обе подписи.
  6. Контракт проверяет, что подписи соответствуют привязанным к нему публичным ключам, и отправляет 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 с нашего мультисига прошла успешно.

Офчейн-мультисиг — схема Шамира

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

Для безопасного хранения приватного ключа ее можно использовать так:

  1. Разбить приватный ключ на несколько частей.
  2. Записать каждую часть на разные носители информации.
  3. При необходимости воспользоваться ключом прочитать нужное количество частей и восстановить их них ключ.

Многие онлайн-сервисы для криптографии предоставляют бесплатные приложения для работы со схемой Шамира. Мы использовали сайт iancoleman.io и разбивали ссылку на мультисиг-контракт на TzKT.

Обсудить в Discord!