# Как использовать мультиподписи

Автор [@vik](https://golos.id/@vik)

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

Для удобства я создал отдельный сервис [GOLOS.CF/MULTISIG](https://golos.cf/multisig)

**Опытные пользователи могут использовать сразу, все остальным рекомендую внимательно читать пост :)**

С его помощью можно создать мультисиг кошелек или мультисиг аккаунт куратора (кита с большой СГ) и многое другое

![](http://telegra.ph//file/1bc2b36e24b79b4306e2a.png)

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

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

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

Активный ключ - Опасно. Используйте приватный активный ключ для транзакций связанных с переводами токенов, редактированием аккаунта, настройками мультисига, с понижением и переадресацией силы голоса и других операций связанных с настройкой кошелька.

Реализация мультисига осуществляется с помощью добавления в существующий аккаунт мультиавторизации по ключу, например я могу добавить к своему постинг ключу логин другого пользователя и он сможет используя мой логин и его собственный ключ управлять моим аккаунтом на уровне постинга. Интересно, но не совсем то, что нужно, ведь у него появляются те же права постинга, что и у меня и это сложно назвать мультисигом в полной мере. Это решается так называемым весом для каждого логина и установкой минимального веса для принятия транзакции блокчейном.

Перейдем к практике!

## 🔑 Создание мультисиг-аккаунта для своего DAO

> DAO - децентрализованная автономная организация

Придумаем собственное DAO и некое подобие смартконтракта, пусть это будет аккаунт-кошелек @cryptobank

Аккаунт с наибольшим, но не решающим влиянием:

@vik (вес 5)

Аккаунты представители со средним влиянием:

@vox @robot @dpos @ceo - вес у каждого 2

Также мы установим минимально-необходимый вес для принятия блокчейном транзакции - 10

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

@vox @robot @dpos @ceo - суммарный вес 8

Они не смогут потратить средства @cryptobank пока транзакцию не подпишет @vik и не сделает сумму веса не менее 10.

В то же время если @vik и @robot захотят потратить средства @cryptobank - они не смогут это сделать, так как их вес будет 7. Но если присоединятся @dpos и @vox - транзакция будет осуществлена (вес 5+2+2+2 = 11) и подпись @ceo не понадобилась, хватило веса и без него.

Говоря о смартконтракте, я подразумевал использование суперкитов голоса в качестве постинг мультисига с большим количеством участников. Например вес каждого участника 1. Всего участников 20. Минимальный вес для подписи операции с простановкой 100% апвота - 15. Таким образом если 15 человек из 20 согласны - суперкит голосует за некий пост. И это абсолютно безопасно - ключи остаются при ките.

## Создание мультисига [golos.cf/multisig/#step4](https://golos.cf/multisig/#step4)

![](http://telegra.ph//file/a2fb302ce6b9022e3d669.png)

В поле минимальный вес следует вводить целое число 1, 2, 3 ... 10 и т.п. это число будет минимальным суммарным весом для подписей начиная с которого транзакция сможет быть принята в блокчейн. Руководствуйтесь принципами весов для создания собственных комбинаций прав доступа.

В поле списка аккаунтов можно ввести логины и раздать им вес.

Опция уровня доступа позволяет выбирать между постинг/активной авторизацией.

На скриншоте я добавил аккаунту @cryptobank минимальный вес 10 и добавил в мультисиг логины с весом соблюдая синтаксис для моей формы:

`vik=5/robot=2/dpos=2/vox=2`

Уровень доступа я выбрал - активный, поскольку это интереснее и в случае ошибок "накажет рублем" :)

## 📓 Создание мультиподписной транзакции

Аккаунт мультисиг уже есть - @cryptobank

Теперь смоделируем ситуацию. Например @vik как участник мультисига и президент карманного DAO хочет распределить бюджет и перевести с бомжебанка монеты аккаунтам @registrator и @upvoter

Для этого @vik создает транзакцию, подписывает ее сам и передает на подпись другим.

![](http://telegra.ph//file/ffbbcd4b4021f0a4f2236.png)

На скрине в поле ввода операций можно ввести несколько операций и упаковать их в одну транзакцию. Это крайне удобно для отчетности.

Формат ввода операций был такой:

```
["transfer",{"from":"cryptobank","to":"registrator","amount":"0.002 GBG","memo":"Тест мультисига https://golos.cf/multisig/#step1"}],  
["transfer",{"from":"cryptobank","to":"upvoter","amount":"0.005 GBG","memo":"Тест мультисига https://golos.cf/multisig/#step1"}]
```

Обратите внимание, что в поле логина я вожу логин не @vik, а @cryptobank\
И саму транзакцию формирую так, будто ее отправляет криптобанк, а не я. Из своего я использую только ключ, он формирует подпись, которая будет добавлена в транзакцию.

В правой колонке у нас появилась транзакция с операциями и с важным атрибутом signatures (подписи)

![](http://telegra.ph//file/2c32e01307587c87998b3.gif)

Пока что там только одна подпись от аккаунта @vik

Обратите также внимание на срок действия транзакции - участники должны успеть подписать ее за час! (можно настроить иное значение, меньшее)

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

Копируем транзакцию и отправляем ее на подпись другому пользователю

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

## 📓 Подпись ранее созданной транзакции участниками мультисига

@vik передает транзакцию @vox\
Тот (как и остальные кроме автора транзакции) использует уже другую форму

[golos.cf/multisig/#step2](https://golos.cf/multisig/#step2)

**🖋 Подписать транзакцию как участник мультисига**

В эту форму нужно ввести ключ @vox, логин @cryptobank\
и полученную от @vik транзакцию.\
На кнопку подписать для удобства повешена сразу и функция отправки в блокчейн.\
Однако если веса не хватает, вы получите вот такую ошибку об авторити связанную с отправкой транзакции, с тем, что не хватает веса подписей.

![](http://telegra.ph//file/201d3ce0694425cf7686e.png)

А справа появится эта же транзакция, но с дополнительной подписью в атрибуте signatures , подписью от @vox в нашем случае.

@vox копирует дополненую транзакцию и отправляет ее полный текст следующему в списке, @robot или @dpos.\
Те в свою очередь проделывают тоже самое, подписывают и передают дальше транзакцию со своими подписями.

![](http://telegra.ph//file/8ebcfecdec650222854fb.png)

*(Следует понимать, что эти подписи динамические и завязаны на каждом байте транзакции, эта подпись подойдет только для этой транзакции, если кто-то попробует подписать вашей одноразовой подписью другую транзакцию - ничего не выйдет.)*

Когда сумма всех подписей достигла минимального порога в мультисиге - транзакция отправляется.

![](http://telegra.ph//file/b1b517f53941bf26a07b2.png)

**Важно замечание**

В примере выше у @cryptobank есть возможность самому потратить средства без оглядки на участников мультисига. Чтобы исключить такую возможность, для мультисига нужно создавать отдельный аккаунт и уже на этапе создания назначать ему минимальный вес больший его собственного веса, тогда он не сможет самостоятельно использовать свой активный ключ!

**Можно также добавить в существующий аккаунт мульти авторизацию для owner ключа, поскольку в неумелых руках это может "убить" аккаунт, такую форму я не публикую.**

📢**Фидбек**

Если у вас есть пожелания по странице [golos.cf/multisig](https://golos.cf/multisig) можете оставлять комментарии или писать в чат [t.me/chain\_cf](https://t.me/chain_cf)

⚗️**Исходный код и безопасность**

Код не минифицирован, полностью открытый client-side, это значит, что вы можете нажать CTRL+U скопировать исходный код в файл имя.html и использовать локально из папки на компьютере. Ваши приватные ключи никуда не передаются, они используются только для локальной подписи операций, передаются в блокчейн уже подписанные операции. Однако злоумышленники могут сделать копию формы и поменять в коде функции так, что ваши ключи будут отправлены им, поэтому всегда проверяйте адрес страницы. Или используйте локальную версию.

Простые примеры использования мультисига:

* Для голосования, определения консенсуса. Например, как сервис для делегатов, голосующих за/против ХФ или другие нововведения.
* Конкурс с призом. Пусть будет конкурс красоты с выбором самой красивой свинки пепы :) 10 конкурсанток, формируется для каждой транзакция на перевод призового фонда. Мультисигу переводится призовой фонд (на балансе должен быть только он и переводиться полностью). Добавляется 100 членов жюри в мультисиг с весом 1 (минимальный вес принятия 51) Членам жюри доставляют на подпись 10 транзакций, можно оформить в GUI в виде 10 карточек с фото куртизанок. Чью карточку-транзакцию в течении часа первой подпишут 51 член жюри - та конкурсантка и получит призовой фонд.
* Или так, публикация клятвы, что если 75 пользователей подпишуться под транзакцией, автор разместит клятву, что съест свое лицо. Выставлен минимальный вес для постинга 75 И 100 пользователей наделены весом 1 (или другим, пропорционально стеку, репутации и т.д.) Если минимум 75 пользователь подписал транзакцию - отправляется пост или custom\_json с какой-то клятвой манифестом :)
* Или пример сложнее, с параметризацией. Формируется транзакция в которую пакуется update witness для каждого делегата с параметром: плата за создание аккаунта, 1 GOLOS Дополнительно формируются еще несколько с платой 2, 3 и т.д. Какой вариант соберет больше всего подписей - столько массово, одномоментно и объявят делегаты.

По материалам [статьи](https://golos.id/@vik/multisigi-na-golose-12-09)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wiki.golos.id/developers/howto/multisig.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
