Перейти к основному содержимому

Создание простого контракта с мультиподписью с помощью fift

продвинутый уровень

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

💡 Общие сведения

Это руководство поможет вам узнать, как использовать ваш контракт с мультиподписью. Напомним, что (n, k)-контракт с мультиподписью – это мультиподписной кошелек с n держателями закрытых ключей, который принимает запросы на отправку сообщений, если запрос, заявка, собирает не менее k подписей держателей.

На основе оригинального кода контракта мультиподписи и обновлений от akifoq:

совет для начинающих

Для тех, кто впервые работает с мультиподписью: Что такое технология мультиподписи? (видео)

📖 Чему вы научитесь

  • Как создать и настроить простой кошелек с мультиподписью.
  • Как развернуть кошелек с мультиподписью с помощью lite-client.
  • Как подписать запрос и отправить его в сообщении в блокчейн.

⚙ Настройте свое окружение

Прежде чем мы начнем наше путешествие, проверьте и подготовьте ваше окружение.

  • Установите двоичные файлы func, fift, lite-client и fiftlib из раздела установки.
  • Клонируйте репозиторий и откройте каталог в CLI.
git clone https://github.com/akifoq/multisig.git
cd ~/multisig

🚀 Давайте начнем!

  1. Скомпилируйте код в fift.
  2. Подготовьте ключи для владельцев мультиподписи.
  3. Разверните контракт.
  4. Взаимодействуйте с развернутым кошельком с мультиподписью в блокчейне.

Скомпилируйте контракт

Скомпилируйте контракт в Fift с помощью:

func -o multisig-code.fif -SPA stdlib.fc multisig-code.fc

Подготовьте ключи владельцев мультиподписи

Создайте ключи участников

Чтобы создать ключ, вам нужно запустить:

fift -s new-key.fif $KEY_NAME$
  • Где KEY_NAME - это имя файла, в который будет записан закрытый ключ.

Например:

fift -s new-key.fif multisig_key

Мы получим файл multisig_key.pk с закрытым ключом внутри.

Соберите открытые ключи

Также скрипт выдаст открытый ключ в формате:

Public key = Pub5XqPLwPgP8rtryoUDg2sadfuGjkT4DLRaVeIr08lb8CB5HW

Все, что после "Public key = ", нужно где-то сохранить!

Давайте сохраним в файле keys.txt. Важно, чтобы каждый открытый ключ был указан с новой строки.

Разверните контракт

Разверните через lite-client

После создания всех ключей вам необходимо собрать открытые ключи в текстовый файл keys.txt.

Например:

PubExXl3MdwPVuffxRXkhKN1avcGYrm6QgJfsqdf4dUc0an7/IA
PubH821csswh8R1uO9rLYyP1laCpYWxhNkx+epOkqwdWXgzY4

После этого вам нужно запустить:

fift -s new-multisig.fif 0 $WALLET_ID$ wallet $KEYS_COUNT$ ./keys.txt
  • $WALLET_ID$ - номер кошелька, назначенный для текущего ключа. Рекомендуется использовать уникальный $WALLET_ID$ для каждого нового кошелька с тем же ключом.
  • $KEYS_COUNT$ - количество ключей, необходимых для подтверждения. Обычно оно равно количеству открытых ключей
Объяснение wallet_id

Можно создать много кошельков с одинаковыми ключами (ключ Алисы, ключ Боба). Что же делать, если у Алисы и Боба уже есть сокровища? Именно в таком случае $WALLET_ID$ и выполняет свою роль.

Скрипт выведет что-то вроде:

new wallet address = 0:4bbb2660097db5c72dd5e9086115010f0f8c8501e0b8fef1fe318d9de5d0e501

(Saving address to file wallet.addr)

Non-bounceable address (for init): 0QBLuyZgCX21xy3V6QhhFQEPD4yFAeC4_vH-MY2d5dDlAbel

Bounceable address (for later access): kQBLuyZgCX21xy3V6QhhFQEPD4yFAeC4_vH-MY2d5dDlAepg

(Saved wallet creating query to file wallet-create.boc)
к сведению

Если у вас ошибка "public key must be 48 character long", убедитесь, что в вашем файле keys.txt имеет тип переноса слов в unix - LF. Например, перенос слов можно изменить с помощью редактора Sublime text.

подсказка

Адрес возврата лучше сохранить — это адрес кошелька.

Активируйте свой контракт

Вам нужно отправить немного TON в нашу недавно сгенерированную сокровищницу. Например, 0,5 TON. Вы можете отправить тестовые монеты через @testgiver_ton_bot.

После этого необходимо запустить lite-client:

lite-client -C global.config.json
Где взять global.config.json?

Вы можете получить новый файл конфигурации global.config.json для основной сети или тестовой сети.

После запуска lite-client лучше всего запустить команду time в консоли lite-client, чтобы убедиться в успешном подключении:

time

Итак, lite-клиент работает!

Далее вам необходимо развернуть кошелек. Для этого выполните команду:

sendfile ./wallet-create.boc

После этого кошелек будет готов к работе в течение минуты.

Взаимодействие с кошельком с мультиподписью

Создание запроса

Для начала вам необходимо создать запрос сообщения:

fift -s create-msg.fif $ADDRESS$ $AMOUNT$ $MESSAGE$
  • $ADDRESS$ - адрес, куда отправлять монеты
  • $AMOUNT$ - количество монет
  • $MESSAGE$ - имя файла для скомпилированного сообщения.

Например:

fift -s create-msg.fif EQApAj3rEnJJSxEjEHVKrH3QZgto_MQMOmk8l72azaXlY1zB 0.1 message
подсказка

Чтобы добавить комментарий к вашей транзакции, используйте атрибут -C comment. Для получения дополнительной информации запустите файл create-msg.fif без параметров.

Выберите кошелек

Далее вам необходимо выбрать кошелек, с которого вы будете отправлять монеты:

fift -s create-order.fif $WALLET_ID$ $MESSAGE$ -t $AWAIT_TIME$

Где

  • $WALLET_ID$ - это идентификатор кошелька, поддерживаемый этим контрактом с мультиподписью.
  • $AWAIT_TIME$ — Время в секундах, в течение которого смарт-контракт будет ожидать подписи от владельцев кошелька с мультиподписью для запроса.
  • $MESSAGE$ — здесь указано имя boc-файла сообщения, созданного на предыдущем шаге.
к сведению

Если за время $AWAIT_TIME$ запрос не был подписан, то валидность запроса истекает. Стандартное время ожидания составляет 2 часа (7200 секунд).

Например:

fift -s create-order.fif 0 message -t 7200

Готовый файл будет сохранен в order.boc

к сведению

order.boc необходимо предоставить держателям ключей, они должны его подписать.

Подпишите свою часть

Для совершения этой операции, вам необходимо выполнить:

fift -s add-signature.fif $KEY$ $KEY_INDEX$
  • $KEY$ - имя файла, содержащего закрытый ключ для подписи, без расширения.
  • $KEY_INDEX$ - индекс указанного ключа в keys.txt (с нулевым индексом)

Например, для нашего файла multisig_key.pk:

fift -s add-signature.fif multisig_key 0

Создайте сообщение

После того, как все подписали заявку, ее нужно преобразовать в сообщение для кошелька и подписать снова с помощью следующей команды:

fift -s create-external-message.fif wallet $KEY$ $KEY_INDEX$

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

Например:

fift -s create-external-message.fif wallet multisig_key 0

Отправьте подпись в блокчейн TON

После этого вам нужно снова запустить light client:

lite-client -C global.config.json

Далее нам нужно только отправить нашу подпись! Для этого запустите:

sendfile wallet-query.boc

Если все остальные подписали запрос, он будет выполнен!

Вы сделали это, ура! 🚀🚀🚀

См. также