Skip to content

Commit

Permalink
New translations multisig.md (Russian)
Browse files Browse the repository at this point in the history
  • Loading branch information
TonSquare committed Dec 25, 2024
1 parent 02a54c5 commit b95565c
Showing 1 changed file with 275 additions and 0 deletions.
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

0 comments on commit b95565c

Please sign in to comment.