Рассматривая VIZ необходимо разделять объекты и структуры протокола (операция, транзакция, блок, ассет, версия, полномочия) от объектов и структур которые существуют непосредственно в блокчейне (на которые влияют те или иные операции).
Все, что касается протокола находится в каталоге /libraries/protocol исходного кода C++ ноды блокчейна VIZ.
- types / типы данных в протоколе
- operations / proposal_operations / chain_operations / chain_virtual_operations / операция — все что связано с операциями и их обработкой;
- transaction / транзакция — все что связано с транзакцией (id, список операций, к какому блоку она ссылается);
- block_header / block / блок — содержит транзакции, ссылается на предыдущий блок, содержит extensions который может использовать делегат для инициации голосования за переход на новую версию хардфорка;
- asset / ассет — структура токенов в VIZ (VIZ и SHARES, отношение ассетов разного разряда друг к другу);
- base / version / версия — структура, описывающая версию протокола сети, голос и время за переход на новую версию;
- authority / полномочия — структура, описывающая связку ключей для определенного типа доступа аккаунта;
- sign_state / состояние подписи — помощник по проверке подписей (или наличия ключа, который может ее сгенерировать).
Именно из объектов и структур самого блокчейна состоит состояния системы (стэйт). Каждый блок, содержащий операции, обрабатывается основным модулем database, который просчитывает все изменения и принимает решения по отложенным действиям. В каталоге /libraries/chain/include/graphene/chain содержатся как объекты и структуры данных, так и внутреннее устройство блокчейна (evaluator, block_log, dynamic_global_property_object, типы объектов).
Состояние системы состоит из объектов:
- dynamic_global_property_object — основной объект, содержащий данные о текущем состоянии экономики и состоянии ноды (например, номер необратимого блока);
- account_object — записи аккаунтов;
- account_authority_object — записи полномочий для аккаунтов;
- witness_object — записи делегатов;
- transaction_object — используется для транзакций в очереди (это позволяет проверять отсутствии дублей у новых транзакций и удалять транзакции из очереди, если она не выполнилась до срока истечения expire);
- block_summary_object — используется для индексации блоков и их hash, для проверки TaPoS (транзакция должна ссылаться на прошлый блок, проверка происходит как раз по индексу, построенному из объектов
block_summary_object
); - witness_schedule_object — состояние очереди делегатов;
- witness_vote_object — записи голосов за делегатов;
- hardfork_property_object — записи о текущем хардфорке сети;
- withdraw_vesting_route_object — записи о маршруте распределения токенов при конвертации доли;
- master_authority_history_object — записи изменений мастер полномочий;
- account_recovery_request_object — запросы на восстановление аккаунта;
- change_recovery_account_request_object — запросы на смену доверенного аккаунта для восстановления доступа;
- escrow_object — записи о трехсторонних сделках;
- vesting_delegation_object — записи о делегированной доли;
- vesting_delegation_expiration_object — записи о возвращаемой делегированной доли после отмены делегирования;
- account_metadata_object — отдельные записи с мета-данными аккаунта;
- proposal_object — записи proposal операций;
- required_approval_object — записи требуемых подтверждений для proposal операций;
- committee_request_object — записи заявок в комитет;
- committee_vote_object — записи голосов по заявкам в комитете;
- invite_object — записи всех инвайтов;
- award_shares_expire_object — записи наград, которые должны понизить конкуренцию по истечению срока;
- paid_subscription_object — информация о платных подписках;
- paid_subscribe_object — записи оформленных платных подписок;
- witness_penalty_expire_object — записи штрафов делегатам, пропустившим блок.
Плагины, предоставляющие API, могут возвращать объекты как из блокчейна, так и собственные. Простые запросы с получением объекта по id отдают данные как есть, часто пропуская объект из блокчейна через конструктор аналогичного для API, чтобы скопировать состояние и отдать пользователю его, например: плагин witness_api
использует отдельный объект witness_api_object
. А плагин database_api
использует account_api_object
, который дополняет стандартный объект блокчейна аккаунт типами доступа копируя туда актуальные полномочия из индекса.
Если плагин расширяет стандартные таблицы индексов и объекты, то он создает новую структуру, отдельно ведет учет операций и заполняет индекс. Например, так поступает плагин private_message
, обрабатывая custom операции (создавая объекты message_object
, наполняющие индекс message_index
).
Делегаты транслируют свою позицию по голосуемым параметрам сети. Блокчейн система каждый цикл очереди делегатов (21 блок) вычисляет медианные значения голосуемых параметров и фиксирует их на этот цикл. Описание параметров (в скобках указаны медианные значения на момент написания данного раздела):
- account_creation_fee — передаваемая комиссия при создании аккаунта (1.000 VIZ);
- create_account_delegation_ratio — коэффициент наценки делегирования при создании аккаунта (x10);
- create_account_delegation_time — время делегирования при создании аккаунта (2592000 секунд);
- bandwidth_reserve_percent — доля сети, выделяемая для резервной пропускной способности (0.01%);
- bandwidth_reserve_below — резервная пропускная способность действует для аккаунтов с долей сети до порога (1.000000 SHARES);
- committee_request_approve_min_percent — минимальный процент доли сети голосующих, необходимый для принятия решения по заявке в комитете (10%);
- min_delegation — минимальное количество токенов при делегировании (1.000 VIZ);
- vote_accounting_min_rshares — минимальный вес голоса для учёта при награждении (5000000 rshares);
- maximum_block_size — максимальный размер блока в сети (65536 байт);
- inflation_witness_percent — доля инфляции для награды делегатам (20%);
- inflation_ratio_committee_vs_reward_fund — соотношение разделения остатка инфляции между комитетом и фондом наград (75%);
- inflation_recalc_period — количество блоков между пересчётом инфляционной модели (806400);
- data_operations_cost_additional_bandwidth — дополнительная наценка пропускной способности за каждую data операцию в транзакции (0% от размера транзакции);
- witness_miss_penalty_percent — штраф делегату за пропуск блока в процентах от суммарного веса голосов (1%);
- witness_miss_penalty_duration — длительность штрафа делегату за пропуск блока в секундах (86400 секунд);
- create_invite_min_balance — минимальная сумма чека (10.000 VIZ);
- committee_create_request_fee — плата за создание заявки в Фонд ДАО (100.000 VIZ);
- create_paid_subscription_fee — плата за создание платной подписки (100.000 VIZ);
- account_on_sale_fee — плата за выставление аккаунта на продажу (10.000 VIZ);
- subaccount_on_sale_fee — плата за выставление субаккаунтов на продажу (100.000 VIZ);
- witness_declaration_fee — плата за объявление аккаунта делегатом (10.000 VIZ);
- withdraw_intervals — количество периодов (дней) уменьшения капитала (28).
В VIZ существуют служебные аккаунты, которые имеют заложенные в конфигурационном файле ключи доступа к определенным полномочиям:
- null — специализированный аккаунт, который сжигает полученные токены. Имеет пустые полномочия, механизм сжигания токенов заложен в исходный код блокчейна.
- committee — специализированный аккаунт, который все полученные токены переводит в фонд комитета, позволяя таким образом жертвовать токены на развитие экосистемы. Имеет пустые полномочия. Также служит инициатором сети, для анонимного генезиса блокчейна (когда ключ подписи блоков от аккаунта committee доступен всем в конфигурационном файле). Ключ подписи сформирован из строки конкатенации строк
committee
,viz
,sign
, что соответствует5Hw9YPABaFxa2LooiANLrhUK5TPryy8f7v9Y1rk923PuYqbYdfC
. После запуска сети и подключения к ней других делегатов аноним может прекратить подпись аккаунтомcommittee
и ключ подписи обнуляется до значенияVIZ1111111111111111111111111111111114T1Anm
. - anonymous — специализированный аккаунт, который при получении токенов с указанным ключом (и логином, при желании) создает анонимный аккаунт (анонимность обеспечивается возможным переводом с шлюзов - как биржевых, так и социальных, custody сервисов). Имеет пустые полномочия. Формат заметки
memo
для регистрации анонимного аккаунта:login:public_key
, гдеlogin
- это желаемый логин для нового аккаунта, аpublic_key
— единый публичный ключ для всех типов полномочий. Если логин не указан, а в заметке толькоpublic_key
, то создается анонимный сабаккаунт форматаnX.anonymous
, где X — инкрементация номера, указанного вjson_metadata
аккаунтаanonymous
. Внимание! Если заметка не указана, средства будут сожжены аналогично переводу на аккаунтnull
. - invite — специализированный аккаунт для возможности анонимно, не имея аккаунта в блокчейне, активировать инвайт коды. Активный ключ доступен всем в конфигурационном файле, сформирован из строки конкатенации строк
invite
,viz
,active
, что соответствует5KcfoRuDfkhrLCxVcE9x51J6KN9aM9fpb78tLrvvFckxVV6FyFW
. Изначально не имеет какой-либо доли для осуществления транзакций, что может быть исправлено путем делегирования или включения системы резервной пропускной способности делегатами. - viz — аккаунт инициатор цепочки в генезис блоке, приватный ключ
5JabcrvaLnBTCkCVFX5r4rmeGGfuJuVp4NAKRNLTey6pxhRQmf4
, был сброшен на пустой после предустановки продажи субаккаунтов за 10 000 VIZ (получательcommittee
).