# Счета с несколькими подписями на Namada

Счета с несколькими подписями (мультисигмы) - это счета в системе Namada, позволяющие использовать несколько подписей. Наличие мультисигм имеет множество преимуществ, включая, помимо прочего, следующие:

* Повышенная безопасность
* Возможность совместного использования кошельков
* Лучшие возможности восстановления.

По этой причине все счета в Namada по умолчанию являются счетами с несколькими подписями.

### Инициализация мультиподписного счета

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

Для генерации такого ключа используется следующий метод:

```rust
namadaw key gen \
--alias my-key1
```

Может быть сгенерирован и второй ключ (что будет полезно при работе с мультисигмами):

```rust
namadaw key gen \
--alias my-key2
```

Также может быть сформирован implicit адрес:

```rust
namadaw address gen \
--alias my-address
```

Инициализация счетов на Namada осуществляется следующим способом:

**Счет без мультисигмы (с одной подписью)**

```rust
namadac init-account \
--alias my-multisig-alias \
--public-keys my-key1 \
--signing-keys my-key1
```

Мультисиг счет (не менее 2 подписывающих лиц)

```rust
namadac init-account \
--alias my-multisig-alias \
--public-keys my-key1,my-key2 \
--signing-keys my-key1,my-key2 \
--threshold 2
```

### Представление транзакции с несколькими подписями

Для того чтобы отправить транзакцию с несколькими подписями, необходимо сначала создать офлайн-транзакцию.

#### Построение автономной транзакции

<mark style="color:orange;">Для версии</mark> <mark style="color:orange;">`v0.23.0`</mark> <mark style="color:orange;">существуют определенные ограничения на построение автономных транзакций. Пожалуйста, будьте внимательны к возможным ошибкам.</mark>

Аргумент `--dump-tx` позволяет пользователю сделать это. Необходимо указать папку, в которую будет сбрасываться транзакция.

```rust
mkdir tx_dumps
```

Это можно сделать следующим образом:

```rust
namadac transfer \
--source my-multisig-alias \
--target some-established-account-alias \
--token NAM \
--amount 100 \
--signing-keys my-key1 \
--dump-tx \
--output-folder-path tx_dumps
```

Это означает, что транзакция построена и готова к подписанию.

В указанной папке будет создан файл `.tx`. Этот файл содержит шестнадцатеричное представление байтов транзакции. Этот файл может быть использован для подписания транзакции.

#### Подписание транзакции

Следующий шаг - подписание транзакции. `my-key1` может подписать транзакцию следующим способом:

```rust
namadac sign-tx \
--tx-path "<path-to-file>" \
--signing-keys my-key1 \
--owner my-multisig-alias
```

<mark style="color:orange;">Обратите внимание, что на этом этапе транзакцию может подписать любое количество ключей</mark> <mark style="color:orange;">`--signing-keys`</mark><mark style="color:orange;">. В результате будет получено несколько подписей, которые могут быть использованы для отправки транзакции.</mark>

Это означает, что подпись была сохранена в этом файле (расположенном в текущем каталоге).

Сохраним его в качестве псевдонима:

{% code overflow="wrap" %}

```rust
export SIGNATURE_ONE="offline_signature_FB7246E3FC43F59D8AEEC234EBFDB9DF1AC9BB7B14E536D05A7E2617CA41D4CD_0.tx"
```

{% endcode %}

Убедитесь, что транзакция подписана не менее чем k из n ключей, где k - минимальное количество подписей, необходимое для отправки транзакции, а n - общее количество ключей. В данном примере k=2 и n=2.

Затем допустим, что в результате подписания создается еще одна подпись, которую мы сохраняем в псевдониме `SIGNATURE_TWO`.

#### Отправка транзакции

Последним шагом является отправка транзакции. Это можно сделать с помощью следующего метода:

{% code overflow="wrap" %}

```rust
namadac tx \
--tx-path "tx_dumps/a45ef98a817290d6fc0efbd480bf66647ea8061aee1628ce09b4af4f4eeed1c2.tx" \
--signatures $SIGNATURE_ONE \
--signatures $SIGNATURE_TWO \
--owner my-multisig-alias \
--gas-payer my-key1
```

{% endcode %}

<mark style="color:orange;">Обратите внимание на отсутствие запятых в аргументе</mark> <mark style="color:orange;">`--signatures`</mark><mark style="color:orange;">. Это связано с тем, что аргумент представляет собой список файлов, а не список подписей. Также обратите внимание на папку</mark> <mark style="color:orange;">`tx_dumps`</mark><mark style="color:orange;">. Это папка, в которую была сброшена транзакция, как указано в параметре</mark> <mark style="color:orange;">`--output-folder-path`</mark> <mark style="color:orange;">на предыдущем шаге.</mark>

### Изменение порога мультисигмы

Существует возможность изменить порог мультиподписи счета. Это можно сделать следующим образом:

```rust
/namadac update-account \
--address my-multisig-address \
--threshold 1 \
--signing-keys my-key1,my-key2
```

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

```rust
namadac query-account \
--owner my-multisig-address
```

В результате чего будет получен порог 1, а также два открытых ключа.

### Изменение открытых ключей учетной записи multisig

Существует возможность изменить открытые ключи учетной записи multisig. Это можно сделать следующим образом:

```rust
namadac update-account \
--address my-multisig-address \
--public-keys my-key3,my-key4,my-key5 \
--signing-keys my-key1,my-key2
```

Это приведет к изменению открытых ключей multisig-аккаунта с `my-key1` и `my-key2` на ключи `my-key3`, `my-key4` и `my-key5` (при условии, что они существуют в кошельке).

Публичные ключи, указанные в аргументе `--public-keys`, станут новыми подписантами мультисигмы. Список должен представлять собой список открытых ключей, разделенных запятыми и не содержащий пробелов. В списке должно быть не менее 1 открытого ключа, а длина списка должна быть не меньше порога счета multisig.
