Создание простого контракта с мультиподписью с помощью fift
Эта информация очень низкого уровня. Может быть сложной для понимания новичками и предназначена для продвинутых пользователей, которые хотят понять работу fift. Использование fift не требуется в повседневных задачах.
💡 Общие сведения
Это руководство поможет вам узнать, как использовать ваш контракт с мультиподписью. Напомним, что (n, k)-контракт с мультиподписью – это мультиподписной кошелек с n дер жателями закрытых ключей, который принимает запросы на отправку сообщений, если запрос, заявка, собирает не менее k подписей держателей.
На основе оригинального кода контракта мультиподписи и обновлений от akifoq:
- оригинальный multisig-code.fc блокчейна TON
- akifoq/multisig с fift библиотекой для работы с мультиподписью.
Для тех, кто впервые работает с мультиподписью: Что такое технология мультиподписи? (видео)
📖 Чему вы научитесь
- Как создать и настроить простой кошелек с мультиподписью.
- Как развернуть кошелек с мультиподписью с помощью lite-client.
- Как подписать запрос и отправить его в сообщении в блокчейн.
⚙ Настройте свое окружение
Прежде чем мы начнем наше путешествие, проверьте и подготовьте ваше окружение.
- Установите двоичные файлы
func
,fift
,lite-client
иfiftlib
из раздела установки. - Клонируйте репозиторий и откройте каталог в CLI.
git clone https://github.com/akifoq/multisig.git
cd ~/multisig
🚀 Давайте начнем!
- Скомпилируйте код в fift.
- Подготовьте ключи для владельцев мультиподписи.
- Разверните контракт.
- Взаимодействуйте с развернутым кошельком с мультиподписью в блокчейне.
Скомпилируйте контракт
Скомпилируйте контрак т в 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$
и выполняет свою роль.
Скрипт выведет что-то вроде:
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
необходимо предоставить держателям ключей, они должны его подписать.