# Объекты и структуры

Рассматривая GOLOS необходимо разделять объекты и структуры протокола (операция, транзакция, блок, ассет, версия, полномочия) от объектов и структур которые существуют непосредственно в блокчейне (на которые влияют те или иные операции).

## Список объектов и структур протокола

Все, что касается протокола находится [в каталоге /libraries/protocol](https://github.com/golos-blockchain/golos/tree/master/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](https://github.com/golos-blockchain/golos/tree/master/libraries/chain/include/golos/chain) содержатся как объекты и структуры данных, так и внутреннее устройство блокчейна (evaluator, block\_log, dynamic\_global\_property\_object, [типы объектов](https://github.com/golos-blockchain/golos/blob/master/libraries/chain/include/golos/chain/steem_object_types.hpp)).

Состояние системы состоит из объектов:

* **dynamic\_global\_property\_object** — основной объект содержащий данные о текущем состоянии экономики и состоянии ноды (например, номер необратимого блока);
* **account\_object** — записи аккаунтов;
* **account\_authority\_object** — записи полномочий для аккаунтов;
* **witness\_object** — записи делегатов;
* **transaction\_object** — используется для транзакций в очереди (это позволяет проверять отсутствии дублей у новых транзакций и удалять транзакции из очереди, если она не выполнилась до срока истечения expire);
* **block\_summary\_object** — используется для индексации блоков и их hash, [для проверки TaPoS](https://wiki.golos.id/developers/basics/state) (транзакция должна ссылаться на прошлый блок, проверка происходит как раз по индексу, построенному из объектов `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`).
