Объекты и структуры
Рассматривая GOLOS необходимо разделять объекты и структуры протокола (операция, транзакция, блок, ассет, версия, полномочия) от объектов и структур которые существуют непосредственно в блокчейне (на которые влияют те или иные операции).
Список объектов и структур протокола
Все, что касается протокола находится в каталоге /libraries/protocol исходного кода C++ ноды блокчейна GOLOS.
types / типы данных в протоколе
operations / proposal_operations / chain_operations / chain_virtual_operations / операция — все что связано с операциями и их обработкой;
transaction / транзакция — все что связано с транзакцией (id, список операций, к какому блоку она ссылается);
block_header / block / блок — содержит транзакции, ссылается на предыдущий блок, содержит extensions который может использовать делегат для инициации голосования за переход на новую версию хардфорка;
asset / ассет — структура токенов (отношение ассетов разного разряда друг к другу);
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 операций;
и другие...
Объекты и структуры в API плагинах
Плагины предоставляющие API могут возвращать объекты как из блокчейна, так и собственные. Простые запросы с получением объекта по id отдают данные как есть, часто пропуская объект из блокчейна через конструктор аналогичного для API, чтобы скопировать состояние и отдать его пользователю, например: плагин witness_api
использует отдельный объект witness_api_object
. А плагин database_api
использует account_api_object
, который дополняет стандартный объект блокчейна аккаунт типами доступа копируя туда актуальные полномочия из индекса.
Если плагин расширяет стандартные таблицы индексов и объекты, то он создает новую структуру, отдельно ведет учет операций и заполняет индекс. Например, так поступает плагин private_message
, обрабатывая custom операции (создавая объекты message_object
, наполняющие индекс message_index
).
Last updated