forked from ton-community/ton-docs
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
New translations multisig.md (Russian)
- Loading branch information
Showing
1 changed file
with
275 additions
and
0 deletions.
There are no files selected for viewing
275 changes: 275 additions & 0 deletions
275
...rus-plugin-content-docs/current/v3/guidelines/smart-contracts/howto/multisig.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |