🔑Сложные мультисиги с распределением уровня доступа + простой смартконтракт на голосе. Без хардфорка, штатными средствами!


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

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

GOLOS.CF/MULTISIG

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

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

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

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

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

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

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

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

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

Создание мультисига успешно, проверяем в golosd

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

Аккаунт мультисиг уже есть - @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

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

golos.cf/multisig/#step2

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

В эту форму нужно ввести ключ @vox, логин @cryptobank

и полученную от @vik транзакцию.

На кнопку подписать для удобства повешена сразу и функция отправки в блокчейн.

Однако если веса не хватает, вы получите вот такую ошибку об авторити связанную с отправкой транзакции, с тем, что не хватает веса подписей.

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

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

Те в свою очередь проделывают тоже самое, подписывают и передают дальше транзакцию со своими подписями.

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

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

В форме показываетя кликабельный вывод с ID транзакции


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

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

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

📢 Фидбек

Если у вас есть пожелания по странице golos.cf/multisig можете оставлять комментарии или писать в чат t.me/chain_cf

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

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


Comments 43


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

09.12.2017 18:26
0

Да, это можно реализовать тем, что при создании операции - отправлять ее в custom_json с указанием участников мультисига.

Далее слушающий блоки бот ловит такой json, проверяет санкционирован ли он и отправляет raw транзакции участникам.
Добавлю позднее

09.12.2017 18:34
0

А чем принципиальное отличие того, что есть сейчас от того, что делают в ХФ?

09.12.2017 18:37
0

Насколько знаю, будут добавлены proposal (Предложение транзакций)
Возможно @nemo1369 поможет с ликбезом

09.12.2017 18:41
0

@vik Совершенно верно, с хардфорком к нам приходят предложения транзакций с плоской моделью подписи. Иерархический донесем к следующей версии.

09.12.2017 18:51
0

если на пальцах, что такое плоская?

09.12.2017 19:36
0

@t3ran13 Одноуровневая модель подписи транзакций на примерах. Пусть есть транзакция А, которую должны подписать Alice (weight := 20%), Bob (weight := 80%). Вес их голоса не зависит ни от чего извне.

Иерархическая модель подписи транзакций на примерах.
Пусть есть транзакция А, которую должны подписать Alice (weight := 20%), Bob (weight := 80%). Но теперь вес голоса Bob зависит от того, как за эту транзакцию проголосуют пользователи Charlie (weight := 50% от Bob.weight) и пользователь Nagibator228 (weight := 50% от Bob.weight).

Более подробно очень неплохо расписано в документации к BitShares: https://bitshares.org/technology/dynamic-account-permissions/

09.12.2017 19:51
0

@nemo1369
спасибо!

09.12.2017 20:25
0

только один вопрос - почему Nagibator228 а не Delta?

09.12.2017 21:27
0

В rudex есть такое вот. Это оно, proposal?

10.12.2017 08:36
0

@vadbars Так точно.

11.12.2017 19:16
0

Иерархическая модель подписи транзакций на примерах.
Пусть есть транзакция А, которую должны подписать Alice (weight := 20%), Bob (weight := 80%). Но теперь вес голоса Bob зависит от того, как за эту транзакцию проголосуют пользователи Charlie (weight := 50% от Bob.weight) и пользователь Nagibator228 (weight := 50% от Bob.weight).

Это типа "смарт-контракты"? Или там ещё больше наворотов?))

11.12.2017 13:02
0

@html Ни в коем случае. Это просто сложнопараметризуемые предложения транзакций. "Смарт-контракты" - совсем другая история.

11.12.2017 19:16
0

@nemo1369
Ясненько. Просто где-то писали, мол будут у нас тут после ХФ "Смарт-контракты" и ассеты. Но походу первые будут не после этого ХФ, а когда-то в будущем))

11.12.2017 22:10
0

Отличие в том, что не будет ХардФорка... Сколько раз надо тебе это сказать?

10.12.2017 05:41
0

И что же ему помешает?

10.12.2017 07:40
0

Просто прими факт о том, что "разработчики" Голоса - куча наркоманов. Нельзя постоянно доверять и утешать гопников и думать, что гопник вдруг превратится в Дональда Трампа в плане бизнеса.

10.12.2017 11:00
0

🤨🤔😅🤦‍♂️

10.12.2017 11:04
0

Сопутствующий вопрос: получается, в одну транзакцию можно пихать несколько операций transfer? Это классно.

09.12.2017 18:44
0

Да, разумеется. Множество!
Естественно есть защита от двойной траты, в остальном ограничений нет.

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

09.12.2017 18:54
0

Сейчас есть проблема, что много транзакций упираются в bandwidth. Возможно, оформление нескольких трансферов в одну транзакцию должно помочь решить эту проблему. Надо покопаться в коде. Там на использование bandwidth ещё размер собственно транзакции влияет, не совсем понятно, будет ли экономия.

09.12.2017 18:59
0

слушай, а что на уровне серелизации? там указывается число операций, потом пакуется каждая по порядку и на все операции 1 подпись?

а если операции от разных владельцев(не связанные), я могу запоковать в 1 транзакцию?

09.12.2017 19:38
0

от разных владельцев

Если у тебя есть права на подпись операции нескольких владельцев, то их всех можешь добавить.

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

Но подписывать транзакции от имени пользователя который тебе это не разрешил предварительно - естественно невозможно.

и все подписать своим постинг ключем

Еще может быть проблема в том, что ты спотыкнешься об один аккаунт, например с севшим bandwidth и все сто запорятся.

09.12.2017 19:48
0

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

09.12.2017 20:26
0

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

Да, от разных аков и даже разные операции. И все в рамках одной транзакции.

Подписать транзакцию нужно ключами аккаунтов или одним ключем (при условии, что он добавлен каждому такому аккаунту в авторизацию)

10.12.2017 11:07
0

То есть оно bandwidth будет брать не у подписавшего, а у всех участвующих акков?

11.12.2017 13:06
0

круто, молодец! сервис бы с приятной мордой) я не собираюсь юзать, но иметь такое полезно)

09.12.2017 19:32
0

vik vs. Наркоманов.

Vik выигрывал)

10.12.2017 05:42
0

Правильно я понимаю, что это можно использовать для голосования, определения консенсуса? Например, как сервис для делегатов, голосующих за/против ХФ или другие нововведения.

10.12.2017 07:37
0

для голосования, определения консенсуса

В принципе да. Хоть это и будет немного нестандартно, но придумать можно многое.

Простые примеры:
Конкурс с призом. Пусть будет конкурс красоты с выбором самой красивой свинки пепы :)

10 конкурсанток, формируется для каждой транзакция на перевод призового фонда.
Мультисигу переводится призовой фонд (на балансе должен быть только он и переводиться полностью).
Добавляется 100 членов жюри в мультисиг с весом 1 (минимальный вес принятия 51)
Членам жюри доставляют на подпись 10 транзакций, можно оформить в GUI в виде 10 карточек с фото куртизанок. Чью карточку-транзакцию в течении часа первой подпишут 51 член жюри - та конкурсантка и получит призовой фонд.

Или так, публикация клятвы, что если 75 пользователей подпишуться под транзакцией, автор разместит клятву, что съест свое лицо.
Выставлен минимальный вес для постинга 75
И 100 пользователей наделены весом 1 (или другим, пропорционально стеку, репутации и т.д.)
Если минимум 75 пользователь подписал транзакцию - отправляется пост или custom_json с какой-то клятвой манифестом :)

Или пример сложнее, с параметризацией.
Формируется транзакция в которую пакуется update witness для каждого делегата с параметром: плата за создание аккаунта, 1 GOLOS
Дополнительно формируются еще несколько с платой 2, 3 и т.д.

Какой вариант соберет больше всего подписей - столько массово, одномоментно и объявят делегаты.


Но это все походит на deprecated подход. Через жопу иными словами :)
Когда работать-то будет, но разумно сделать отдельные функции в блокчейн.
Но как материал для @goloswiki - работа с мультисигом должна быть освещена, это же как минимум маркетинг для площадки, а то возможностей много, но никто о них не знает :)

10.12.2017 08:05
0

Ваше предложение о размещении материала в Вики Голоса принято к рассмотрению. Спасибо!

10.12.2017 08:12
0

"Через жопу" - это перефразированное выражение "в порядке, обратном привычному"? )

А что ты понимаешь под "сделать отдельные функции в блокчейн"? Что-то надо добавить в API или прикрутить эту возможность в клиенты?

10.12.2017 08:15
0

Я про кодовую базу конечно. В принципе это вопрос времени, смартконтракты обещаны, сейчас вероятно в research стадии.

10.12.2017 08:34
0

@vik Ваше приложение добавлено в ChainStore.io - магазин и каталог для медиаблокчейна Голос:
http://chainstore.io/product/multisig/

10.12.2017 07:50
0

@vik, Поздравляю!
Ваш пост был упомянут в моем хит-параде в следующей категории:

  • Выплаты - 1 позицию - 5545,5220 GBG
11.12.2017 06:22
0

Круть! Въехать ещё бы во всё это)))

А как подписи определяют, кто их подписал? - там же логина не видно

11.12.2017 13:00
0

Не очень понимаю пока все эти схемы, но лайк за старания)
Кстати, https://golos.cf/multisig - не открывается страничка.

14.12.2017 11:13
0

Открывается на любом современном устройстве.
На уязвимых не открывается.

14.12.2017 11:14
0

Хотите сказать, что мои браузеры ФФ 56.01 и Опера 49.0.2725.47 (версии для ПК) - уязвимые? с чего бы это?) Вирусов нету в них, лишних дополнений (расширений) - тоже. Я в вопросах интернет безопасно и браузерах шарю довольно хорошо.
Все остальные сайты открываются прекрасно, кроме тех, которые заблокированы по решению РКН.

14.12.2017 11:22
0

Если сайт не открывается - это сопровождается какой-то ошибкой. Вот наименование этой ошибки и сообщите.

Я в вопросах интернет безопасно и браузерах шарю довольно хорошо.

Вероятно не очень. У вас пк не поддерживает SNI сертификаты скорее всего. Какая OS?

14.12.2017 11:41
0

@vik , в том то и дело, что никакой ошибки даже не вылазит. Просто не удаётся подключиться к сайту. Скрин:
https://imgur.com/a/jtZFk

Дело не в ОС и не в браузере, скорее всего. У меня стоит программа-блокировщик рекламы Адгуард, у него свои сертификаты и он фильтрует весь интернет трафик во всех браузерах. Возможно проблема в этом, хотя - для меня это не проблема, все остальные сайты работают хорошо и рекламы я не вижу вообще, и всплывающих окон со всякой рекламно-вирусной шнягой тоже не вижу :)

14.12.2017 11:58
0

@vik Ваша статья размещена в Вики Голоса - https://wiki.golos.io/3-guides/stati/slozhnie-multisigi.html

17.12.2017 09:20
0