# Аккаунты и разрешения

Аккаунт - это учётная запись участника или группы участников ДАО VIZ, с помощью которой совершаются операции в блокчейне VIZ.

При создании аккаунта, в качестве идентификатора ему присваивается выбранное участником уникальное имя длиной от 2 (opens new window) до 25 (opens new window) символов латинского алфавита. Двухсимвольные аккаунты зарезервированы за самыми первыми участниками VIZ и больше не присваиваются. Изменить имя аккаунта после создания невозможно.

Владельцы аккаунтов могут создавать аккаунты «второго уровня», а те, в свою очередь - третьего и т.д.. «Уровни» отделяются друг от друга символом «.». Например, аккаунт @name (и только он) может создать аккаунт @subname.name. А тот, в свою очередь, @subsubname.subname.name и т.д.

Аккаунт имеет четыре пары ключей (публичный и приватный):

  • главный ключ,
  • активный ключ,
  • регулярный ключ,
  • коммуникативный ключ.

Каждый публичный ключ должен быть создан из разных приватных ключей с использованием алгоритма на базе эллиптической криптографии для кривой secp256k1 (opens new window). Такая же кривая используется в Bitcoin.

Ниже в таблице приведены параметры для secp256k1

Параметр Значение
p 0xffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f
a 0
b 7
Gx 0x79be667e f9dcbbac 55a06295 ce870b07 029bfcdb 2dce28d9 59f2815b 16f81798
Gy 0x483ada77 26a3c465 5da4fbfc 0e1108a8 fd17b448 a6855419 9c47d08f fb10d4b8
n 0xffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141
h 1

Каждый раз при отправке транзакции от имени аккаунта пользователь должен подписать её по алгоритму ECDSA (opens new window) одним из трёх приватных ключей. Эти ключи имеют разный уровень решений и полномочий. Кроме того, существует коммуникативный memo ключ, который, однако, не может использоваться для отправки транзакций. Вместо этого, он используется для шифрования сообщений: например, в заметке с переводом токенов. При подписании транзакции всегда нужно учитывать уровень доступа ключа и тип транзакций, за которые он отвечает:

Ключ Разрешения
Регулярный (regular) Отправка custom-транзакций, награждение пользователей, изменение метаданных аккаунта, любые действия с комитетом.
Активный (active) Всё, что можно делать с помощью регулярного ключа, а также операции с активами и голосование за делегатов.
Главный (master) Всё, что можно делать с помощью регулярного и активного ключей, а также замена всех ключей.
Коммуникативный (memo) Не позволяет подписывать транзакции. Но с его помощью можно засекречивать сообщения: например, шифровать при помощи алгоритма ECDH (opens new window) заметки при переводе токенов.

# Аккаунт с несколькими пользователями

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

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

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

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

# Мультиподпись

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

# Примеры мультиподписи

Пусть в аккаунте с весовым порогом 100 прописано три пользователя: Алиса, Макс и Боб. У Боба вес 25, у Макса также 25, а у Алисы - 50. В этом случае Бобу для отправки транзакции нужны ещё подписи Алисы и Макса, ведь только в этом случае суммарный вес подписавшихся окажется равен весовому порогу аккаунта 100. Аналогично нужно будет поступить Максу или Алисе, если они захотят отправить транзакцию от имени аккаунта. Таким образом, получается, что никто не сможет отправить транзакцию без согласия всех участников. Это позволяет избежать злоупотребления полномочиями со стороны любого из пользователей.

Если при аналогичном распределении весов участников мультиподписи весовой порог транзакции установлен на уровне 75, то для проведения транзакции достаточно будет подписи Алисы (вес 50) и подписи любого из других участников мультиподписи (с весом 25). При этом, Макс (вес 25) и Боб (вес 25), даже объединившись, всё равно не смогут подписать транзакцию без участия Алисы (вес 50).

# Регистрация

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

  • имя нового аккаунта (name);
  • имя аккаунта-рефера (referrer) - опционально;
  • метаданные аккаунта (json_metadata) - опционально;
  • четыре публичных ключа: главный (master_authority), активный (active_authority), регулярный (regular_authority), коммуникативный (memo).

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

Отправитель транзакции должен заплатить за создание аккаунта сумму, не меньшую, чем указали делегаты. Все ликвидные токены, которые заплатит регистратор, будут конвертированы в shares нового аккаунта.

Кроме прямого перевода ликвидных токенов, есть ещё два способа создания аккаунта: регистрация через делегирование доли и создание аккаунта через инвайт-код.

# Регистрация через делегирование доли

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

Стоимость всех делегированных shares в viz должна быть не меньше, чем указали делегаты.

Вместе с делегированием регистратор может потратить и ликвидные токены. Они будут конвертированы в shares нового аккаунта, но на цену транзакции не повлияют. Аккаунт будет создан или за viz, или за shares.

Если количества переведённых viz будет достаточно для регистрации за ликвидные токены, то аккаунт будет создан за viz. А если не будет достаточно, то за делегированные shares. Если количества делегированных shares также будет недостаточно, то аккаунт не будет создан.

Отозвать делегированные токены регистратор сможет по умолчанию через 28 дней или через другой срок, который укажут делегаты.

Если регистратор попробует отозвать shares раньше указанного срока, то они спишутся со счета нового аккаунта. При этом, они будут заморожены до тех пор, пока не пройдёт 28 дней с момента регистрации. В случае заморозки ни регистратор, ни созданный аккаунт не смогут пользоваться долевыми токенами .

# Регистрация с помощью чека на предъявителя

Подробнее про чеки читайте в разделе: Чеки на предъявителя.

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

Обладатель чека с помощью приложения или напрямую отправляет в блокчейн специальную транзакцию (invite_registration) с указанием приватного ключа чека и публичного главного ключа будущего аккаунта. Эта транзакция зарегистрирует новый аккаунт, потратив токены из чека. Все токены из чека будут конвертированы в shares нового аккаунта.

Если у человека уже есть аккаунт, то он может подписать транзакцию, используя свою учетную запись и её приватный активный ключ. Если у него нет аккаунта, то он может отправить транзакцию, используя аккаунт @invite, принадлежащий блокчейну, подписав её приватным ключом 5KcfoRuDfkhrLCxVcE9x51J6KN9aM9fpb78tLrvvFckxVV6FyFW.

# Анонимные аккаунты

Для создания анонимных аккаунтов в блокчейн был встроен специальный аккаунт @anonymous. Чтобы зарегистрировать аккаунт, надо перевести ему токены viz объемом не менее, чем указали делегаты. К переводу следует прикрепить заметку с именем нового аккаунта и его публичным ключом. При этом, приватный ключ нужно сохранить в надежном месте и никому не передавать. Заметка должна соответствовать формату

login:key,

где login - имя нового аккаунта, key - его ключ. Публичный ключ, в свою очередь, будет прописан как главный, активный, регулярный и коммуникативный.

Другой способ создания анонимного аккаунта — указать только публичный ключ для нового аккаунта без двоеточия(:). Когда @anonymous получит перевод, он создаст новый аккаунт по схеме @nX.anonymous, где X — номер анонимного аккаунта. Номер @anonymous приписывает сам, каждый раз прибавляя единицу к количеству уже созданных анонимных аккаунтов.

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

# Энергия

У каждого аккаунта в блокчейне есть запас энергии, измеряемый в процентах. Максимальное значение энергии равно 100%, минимальное может быть -100%, то есть меньше 0%.

Энергия нужна для того, чтобы отправлять награды другим пользователям. Если энергия равна или меньше 0%, то аккаунт вообще не сможет отправить награду. Однако, он по-прежнему сможет совершать другие операции в блокчейне: например, переводить токены между аккаунтами, голосовать за делегатов и делать всё, что мог со 100% энергии. Подробнее про награды читайте в разделе Награды за деятельность.

Энергия тратится в двух случаях. Первый - это когда аккаунт награждает участника. В этом случае пользователь сам указывает, какое количество энергии он хочет потратить. Чем большая энергия тратится, тем большую награду получит награждаемый. Второй случай - когда аккаунт делегирует shares другому пользователю.

Делегировать энергию можно двумя способами: при регистрации аккаунта через делегирование и при делегировании доли уже существующему аккаунту. При любом варианте делегирования инициатор не может сам указать количество энергии, которое будет затрачено. Но оно прямо пропорционально количеству shares, которое будет отправлено. Чем больше shares будет делегировано, тем больше будет затрачено энергии.

Блокчейн рассчитывает количество энергии, которое будет затрачено, по формуле делегировано shares / эффективные shares * 100%.

Тратится энергия моментально, а восстанавливается только с течением времени: 20% от максимума за 24 часа, 1% за 1 час 12 минут (за 1 секунду восстанавливается всего 0,01% энергии).

# Данные аккаунтов

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

Для начала, ознакомьтесь с таблицей типов информации, используемых в блокчейне:

Тип Пример Диапазон Описание
VIZ актив "1.000 VIZ" от 0.001 VIZ Количество ликвидных токенов. Строка с десятичным числом с не более чем 3 цифрами после точки и обязательной припиской VIZ через пробел.
Пример: "1.123 VIZ"
SHARES актив "1.000000 SHARES" от 0.000001 SHARES Количество долевых токенов. Строка с десятичным числом с не более чем 6 цифрами после точки и обязательной припиской SHARES через пробел.
Пример: "1.123456 SHARES"
µShares 1000000 от 1 Количество микродолевых токенов. 1 = 0.000001 SHARES; 1000000 = 1.000000 SHARES. Целое число.
Процент 1000 от 0 до 10000 Процент в целом числовом формате. 0.01% = 1; 1% = 100; 100% = 10000;
Целое 1 Целое число. Слишком большие числа могут быть представлены строковым типом.
Байт 1 Количество байт в целом числовом формате. Слишком большие значения записаны в виде строк.
мкБайт Количество микробайт в целом числовом формате. Слишком большие значения записаны в виде строк.
1 Байт = 1000000 мкБайт
Время "2018-09-30T05:58:57" Строковый тип времени в формате "YYYY-MM-DDThh:mm:ss".
JSON "{"param1":"value"}" Строка в формате JSON
Аккаунт "example" Имя аккаунта в строковом формате.
Ключ "VIZ8XwKjAkG5...." Публичный ключ в строковом формате с приставкой "VIZ".

# average_bandwidth

Добавлено: 1.0.0

Формат: мкБайт

Значение скользящей средней для затраченной пропускной способности на момент последней транзакции.

# lifetime_bandwidth

Добавлено: 1.0.0

Формат: мкБайт

Количество мкБайт, использованных аккаунтом за всё время с момента своего создания.

# balance

Добавлено: 1.0.0

Формат: VIZ актив

Количество viz на балансе аккаунта.

# vesting_shares

Добавлено: 1.0.0

Формат: SHARES актив

Количество чистых Shares аккаунта.

# delegated_vesting_shares

Добавлено: 1.0.0

Формат: SHARES актив

Количество Shares, которые аккаунт делегировал другим пользователям.

# received_vesting_shares

Добавлено: 1.0.0

Формат: SHARES актив

Количество Shares, полученных путем делегирования.

# next_vesting_withdrawal

Добавлено: 1.0.0

Формат: Время

Время, когда произойдёт следующее списание на vesting_withdraw_rate при включённом понижении доли.

# to_withdraw

Добавлено: 1.0.0

Формат: µShares

Количество Shares, которое аккаунт запросил для понижения доли.

# withdraw_routes

Добавлено: 1.0.0

Формат: µShares

Количество аккаунтов, с которыми аккаунт может поделить Shares во время понижения доли. Максимальное количество - 10.

# vesting_withdraw_rate

Добавлено: 1.0.0

Формат: SHARES актив

Количество Shares, которое будет списываться каждый день при включённом понижении доли.

# benefactor_awards

Добавлено: 2.0.0

Формат: µShares

Количество µShares(мкShares), полученных аккаунтом в качестве бенефициарских выплат с наград за всё время.

# receiver_awards

Добавлено: 2.0.0

Формат: µShares

Количество µShares (мкShares), полученных аккаунтом в качестве наград за всё время.

# vote_count

Добавлено: 1.0.0

Формат: Целое

Количество наград, отправленных аккаунтом. До 4 хардфорка этот параметр показывал количество голосов, которые аккаунт поставил разным постам.

# created

Добавлено: 1.0.0

Формат: Время

Время, когда был создан аккаунт.

# custom_sequence

Добавлено: 2.0.0

Формат: Число

Количество custom-транзакций, отправленных пользователем с момента 4 хардфорка.

# custom_sequence_block_num

Добавлено: 2.0.0

Формат: Число

Номер последнего блока, в который была помещена последняя custom-транзакция аккаунта.

# energy

Добавлено: 1.0.0

Формат: Процент

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

# id

Добавлено: 1.0.0

Формат: Целое

Цифровой уникальный идентификатор пользователя в системе.

# name

Добавлено: 1.0.0

Формат: Аккаунт

Имя аккаунта.

# json_metadata

Добавлено: 1.0.0

Формат: JSON

Метаданные аккаунта в формате JSON. В них можно, например, хранить информацию о профиле пользователя: имя, фамилия, сайт, социальные сети, пол, должность, место работы. У аккаунта @anonymous вместо JSON строки хранится количество анонимных аккаунтов. Параметр также может быть пустой строкой.

# last_account_recovery

Добавлено: 1.0.0

Формат: Время

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

# recovery_account

Добавлено: 1.0.0

Формат: Строка

Имя аккаунта, который может восстановить учетную запись пользователя. Если поле пусто, то доступ к аккаунту не сможет восстановить никто.

# referrer

Добавлено: 1.0.0

Формат: Аккаунт

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

# last_account_update

Добавлено: 1.0.0

Формат: Время

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

# last_owner_update

Добавлено: 1.0.0

Формат: Время

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

# last_owner_update

Добавлено: 1.0.0

Формат: Время

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

# witness_votes

Добавлено: 1.0.0

Формат: Массив аккаунтов

Список делегатов, за которых проголосовал пользователь.

# witnesses_voted_for

Добавлено: 1.0.0

Формат: µShares

Количество делегатов, за которое проголосовал аккаунт.

# witnesses_vote_weight

Добавлено: 2.0.0

Формат: µShares

Количество голосов, отданных пользователем за каждого делегата. Рассчитывается по формуле: (чистые s=Shares + Shares прокси-аккаунта) / witnesses_voted_for.

# proxied_vsf_votes

Добавлено: 1.0.0

Формат: Массив µShares из 4 элементов

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

# proxy

Добавлено: 1.0.0

Формат: Аккаунт

Имя прокси-аккаунта, которому пользователь доверил свои голоса за делегатов.

# master_authority

Добавлено: 1.0.0

Формат: Массив

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

Содержит в себе account_auths и key_auths.

# active_authority

Добавлено: 1.0.0

Формат: Массив

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

Содержит в себе account_auths и key_auths.

# regular_authority

Добавлено: 1.0.0

Формат: Массив

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

Содержит в себе account_auths и key_auths.


account_auths и key_auths входят в состав параметров *_authority.

# account_auths

Добавлено: 1.0.0

Формат: Массив массивов аккаунтов и их весов.

Список привязанных к роли аккаунтов и их весов.

Пример: account_auths: [['example', 20], ['owner', 50]]

# key_auths

Добавлено: 1.0.0

Формат: Массив массивов ключей и их весов.

Список ключей и их весов.

Пример: key_auths: [['VIZ6cMf37KNdYiqXNfaCf7VFQDuPUWE6z5dw9LYLbSSGg5kAN1RMi', 20], ['VIZ6cMf38KNeYiqXNfsCf7VFQDuPUUE6z5dw9LYLbSSGg6kAN1RMi', 50]]


# memo_key

Добавлено: 1.0.0

Формат: Ключ

Коммуникативный ключ аккаунта

# awarded_rshares

Устарело: 2.0.0

Добавлено: 1.0.0

Формат: µShares

Количество rShares, которое могло участвовать в пуле конкуренции без затраты энергии вплоть до 4 хардфорка. Устарело из-за ухода от прежней экономической модели - позиционирования как блог-платформа.

# curation_rewards

Устарело: 2.0.0

Добавлено: 1.0.0

Формат: µShares

Количество µShares(мкShares), полученных аккаунтом в качестве бенефициарских выплат с курируемых постов до 4 хардфорка. Устарело из-за ухода от прежней экономической модели - позиционирования как блог-платформа.

# posting_rewards

Устарело: 2.0.0

Добавлено: 1.0.0

Формат: µShares

Количество µShares(мкShares), полученных аккаунтом за свои посты вплоть до 4 хардфорка. Устарело из-за ухода от прежней экономической модели - позиционирования как блог-платформа.

# last_post

Устарело: 2.0.0

Добавлено: 1.0.0

Формат: Время

Время отправки последнего поста или комментария. Устарело из-за ухода от прежней экономической модели - позиционирования как блог-платформа.

# last_root_post

Устарело: 2.0.0

Добавлено: 1.0.0

Формат: Время

Время отправки последнего поста. Устарело из-за ухода от прежней экономической модели - позиционирования как блог-платформа.

# last_vote_time

Устарело: 2.0.0

Добавлено: 1.0.0

Формат: Время

Время голосования за последний пост. Устарело из-за ухода от прежней экономической модели - позиционирования как блог-платформа.

# content_count

Устарело: 2.0.0

Добавлено: 1.0.0

Формат: Целое

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

# subcontent_count

Устарело: 2.0.0

Добавлено: 1.0.0

Формат: Целое

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