diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/v3/guidelines/smart-contracts/howto/multisig.md b/i18n/ru/docusaurus-plugin-content-docs/current/v3/guidelines/smart-contracts/howto/multisig.md new file mode 100644 index 0000000000..082b5b96cf --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/v3/guidelines/smart-contracts/howto/multisig.md @@ -0,0 +1,275 @@ +--- +description: В конце руководства вы развернете мультиподписной контракт в ​​блокчейне TON. +--- + +# Создайте простой мультиподписной контракт с fift + +:::caution продвинутый уровень +Эта информация **низкого уровня**. Может быть сложной для понимания новичками и предназначена для продвинутых людей, которые хотят понять [fift](/v3/documentation/smart-contracts/fift/overview). Использование fift не требуется в повседневных задачах. +::: + +## 💡 Обзор + +Это руководство поможет вам узнать, как использовать ваш контракт с несколькими подписями. +Напомним, что (n, k)-контракт с несколькими подписями - это мультиподписной кошелек с n владельцами закрытых ключей, который принимает запросы на отправку сообщений, если запрос (он же заказ, query) собирает как минимум k подписей владельцев. + +На основе оригинального кода мультиподписного контракта и обновлений akifoq: + +- [оригинальный TON Blockchain multisig-code.fc](https://github.com/ton-blockchain/ton/blob/master/crypto/smartcont/multisig-code.fc) +- [akifoq/multisig](https://github.com/akifoq/multisig) с fift библиотекой для работы с мультиподписью. + +:::tip совет для начинающих +Для тех, кто новичок в мультиподписи: [What is Multisig Technology? (видео)](https://www.youtube.com/watch?v=yeLqe_gg2u0) +::: + +## 📖 Что вы узнаете + +- Как создать и настроить простой мультиподписной кошелек. +- Как развернуть мультиподписной кошелек с помощью lite-client. +- Как подписать запрос и отправить его в сообщении в блокчейн. + +## ⚙ Настройте свое окружение + +Прежде чем мы начнем наше путешествие, проверьте и подготовьте свое окружение. + +- Установите двоичные файлы `func`, `fift`, `lite-client` и `fiftlib` из раздела [Установка](/v3/documentation/archive/precompiled-binaries). +- Клонируйте [репозиторий](https://github.com/akifoq/multisig) и откройте его каталог в CLI. + +```bash +git clone https://github.com/akifoq/multisig.git +cd ~/multisig +``` + +## 🚀 Давайте начнем! + +1. Скомпилируйте код в формат fift. +2. Подготовьте ключи для владельцев мультиподписи. +3. Разверните свой контракт. +4. Взаимодействуйте с развернутым мультиподписным кошельком в блокчейне. + +### Скомпилируйте контракт + +Скомпилируйте контракт в Fift с помощью: + +```cpp +func -o multisig-code.fif -SPA stdlib.fc multisig-code.fc +``` + +### Подготовьте ключи владельцев мультиподписи + +#### Создайте ключи участников + +Чтобы создать ключ, вам нужно запустить: + +```cpp +fift -s new-key.fif $KEY_NAME$ +``` + +- Где `KEY_NAME` - это имя файла, в который будет записан закрытый ключ. + +Например: + +```cpp +fift -s new-key.fif multisig_key +``` + +Мы получим файл `multisig_key.pk` с закрытым ключом внутри. + +#### Соберите открытые ключи + +Также скрипт выдаст открытый ключ в формате: + +``` +Public key = Pub5XqPLwPgP8rtryoUDg2sadfuGjkT4DLRaVeIr08lb8CB5HW +``` + +Все, что после `"Public key = "`, нужно где-то сохранить! + +Давайте сохраним в файле `keys.txt`. Один открытый ключ на строку, это важно. + +### Разверните ваш контракт + +#### Разверните через lite-client + +После создания всех ключей вам нужно собрать открытые ключи в текстовый файл `keys.txt`. + +Например: + +```bash +PubExXl3MdwPVuffxRXkhKN1avcGYrm6QgJfsqdf4dUc0an7/IA +PubH821csswh8R1uO9rLYyP1laCpYWxhNkx+epOkqwdWXgzY4 +``` + +После этого вам нужно запустить: + +```cpp +fift -s new-multisig.fif 0 $WALLET_ID$ wallet $KEYS_COUNT$ ./keys.txt +``` + +- `$WALLET_ID$` - номер кошелька, назначенный для текущего ключа. Рекомендуется использовать уникальный `$WALLET_ID$` для каждого нового кошелька с тем же ключом. +- `$KEYS_COUNT$` - количество ключей, необходимых для подтверждения, обычно равно количеству открытых ключей + +:::info Объяснение wallet_id +Можно создать много кошельков с одинаковыми ключами (ключ Алисы, ключ Боба). Что делать, если у Алисы и Боба уже есть treasure? Вот почему `$WALLET_ID$` здесь имеет решающее значение. +::: + +Скрипт выведет что-то вроде: + +```bash +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) +``` + +:::info +Если у вас ошибка "public key must be 48 character long", убедитесь, что в вашем файле `keys.txt` есть перенос слов типа unix - LF. Например, перенос слов можно изменить с помощью редактора Sublime text. +::: + +:::tip +Лучше оставить адрес Bounceable - это адрес кошелька. +::: + +#### Активируйте свой контракт + +Вам нужно отправить немного TON на наш недавно сгенерированный *treasure*. Например, 0,5 TON. Вы можете отправить монеты тестовой сети через [@testgiver_ton_bot](https://t.me/testgiver_ton_bot). + +После этого Вам нужно запустить lite-client: + +```bash +lite-client -C global.config.json +``` + +:::info Где взять `global.config.json`? +Вы можете получить свежий файл конфигурации `global.config.json` для [основной сети](https://ton.org/global-config.json) или [тестовой сети](https://ton.org/testnet-global.config.json). +::: + +После запуска lite-client лучше всего запустить команду `time` в консоли lite-client, чтобы убедиться, что соединение прошло успешно: + +```bash +time +``` + +Итак, lite-клиент работает! + +После того, как вам нужно развернуть кошелек, выполните команду: + +``` +sendfile ./wallet-create.boc +``` + +После этого кошелек будет готов к работе в течение минуты. + +### Взаимодействие с мультиподписным кошельком + +#### Создание запроса + +Сначала вам нужно создать запрос сообщения: + +```cpp +fift -s create-msg.fif $ADDRESS$ $AMOUNT$ $MESSAGE$ +``` + +- `$ADDRESS$` - адрес, куда отправлять монеты +- `$AMOUNT$` - количество монет +- `$MESSAGE$` - имя файла для скомпилированного сообщения. + +Например: + +```cpp +fift -s create-msg.fif EQApAj3rEnJJSxEjEHVKrH3QZgto_MQMOmk8l72azaXlY1zB 0.1 message +``` + +:::tip +Чтобы добавить комментарий к вашей транзакции, используйте атрибут `-C comment`. Чтобы получить больше информации, запустите файл *create-msg.fif* без параметров. +::: + +#### Выберите кошелек + +Далее вам нужно выбрать кошелек, из которого будут отправлены монеты: + +``` +fift -s create-order.fif $WALLET_ID$ $MESSAGE$ -t $AWAIT_TIME$ +``` + +Где + +- `$WALLET_ID$` - это идентификатор кошелька, поддерживаемого этим мультиподписным контрактом. +- `$AWAIT_TIME$` - Время в секундах, в течение которого смарт-контракт будет ожидать подписи от владельцев мультиподписного кошелька для запроса. +- `$MESSAGE$` - десь указано имя boc-файла сообщения, созданного на предыдущем шаге. + +:::info +Если до подписания запроса прошло время, равное `$AWAIT_TIME$`, запрос становится просроченным. Как обычно, $AWAIT_TIME$ равно паре часов (7200 секунд) +::: + +Например: + +``` +fift -s create-order.fif 0 message -t 7200 +``` + +Готовый файл будет сохранен в `order.boc` + +:::info +`order.boc` необходимо предоставить держателям ключей, они должны его подписать. +::: + +#### Подпишите свою часть + +Чтобы подписать, вам нужно сделать: + +```bash +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: + +```bash +lite-client -C global.config.json +``` + +И после этого мы хотим отправить нашу подпись! Просто запустите: + +```bash +sendfile wallet-query.boc +``` + +Если все остальные подписали запрос, он будет выполнен! + +Вы сделали это, ха-ха! 🚀🚀🚀 + +## Что дальше? + +- [Подробнее о мультиподписных кошельках в TON](https://github.com/akifoq/multisig) от akifoq