Golos Blockchain
  • База знаний Golos
  • ПОЛЬЗОВАТЕЛЯМ
    • Способы регистрации
    • Старт на Golos Блоги
      • Кошелёк
    • Вопросы и ответы
    • Полезные статьи
    • Обновления на Голосе
  • Разработчикам
    • Основы
      • Операции и их типы
      • Объекты и структуры
      • Состояние (стэйт) системы
      • Плагины и их API
      • Библиотеки для работы
      • Примеры кода
      • Формирование транзакций
      • Пропускная способность
      • Тестнет (ноды для тестов)
    • API-документация
      • API part 1
      • API part 2
      • API part 3
      • API part 4
      • Cli-wallet API
    • Обновления (HardForks)
      • HF18: Данные по установке
      • HF18: Новые возможности
      • HF18: Изменения в API
      • HF18: Изменения в cli_wallet
      • SF18.4: Новые функции
      • HF19: Новые возможности
      • HF20: Устранение бага
      • HF22: Новые возможности
      • HF23: Новые возможности
      • HF24: Новые возможности
      • HF25: Новые возможности
      • HF26: Новые возможности
      • HF27: Новые возможности
      • HF28: Новые возможности
    • Руководства (HowTo)
      • Скрипт регистрации аккаунтов
      • Операции на бирже
      • Как использовать мультиподписи
      • Как объединять операции в одну транзакцию
      • Пример запуска тестнета
  • Делегатам
    • Делегатство и роли нод
    • Установка ноды
      • Гайд для witness/seed ноды
      • Настройка для API-ноды
      • Настройка ноды для бирж
      • Настройка ElasticSearch
      • Нода с отладкой GDB
    • Медианные параметры
    • Скрипты для price feed
Powered by GitBook
On this page
  • 🔑 Создание мультисиг-аккаунта для своего DAO
  • Создание мультисига golos.cf/multisig/#step4
  • 📓 Создание мультиподписной транзакции
  • 📓 Подпись ранее созданной транзакции участниками мультисига
  1. Разработчикам
  2. Руководства (HowTo)

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

PreviousОперации на биржеNextКак объединять операции в одну транзакцию

Last updated 4 years ago

Автор

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

Для удобства я создал отдельный сервис

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

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

Примечательно, что этот функционал есть в блокчейне голоса (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 согласны - суперкит голосует за некий пост. И это абсолютно безопасно - ключи остаются при ките.

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

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

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

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

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

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

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

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

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

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

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

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

["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 (подписи)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

📢Фидбек

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

Код не минифицирован, полностью открытый 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 и т.д. Какой вариант соберет больше всего подписей - столько массово, одномоментно и объявят делегаты.

Создание мультисига

Если у вас есть пожелания по странице можете оставлять комментарии или писать в чат

По материалам

golos.cf/multisig/#step4
golos.cf/multisig/#step2
golos.cf/multisig
t.me/chain_cf
статьи
@vik
GOLOS.CF/MULTISIG