Перейти к содержанию

Хранение и режимы чтения

Платформа COOPOS хранит данные блокчейна в разных структурах на этапах жизненного цикла транзакции. Ниже — часть из них. Производящий узел — это экземпляр nodeos у того продюсера, который сейчас создаёт блоки (роль меняется примерно каждые 6 секунд: 12 блоков подряд, затем другой продюсер.)

Состояние блокчейна и хранение

Каждый nodeos создаёт внутренние файлы для учёта состояния цепочки. Они лежат в каталоге установки ~/eosio/nodeos/data; назначение:

  • blocks.log — только дописываемый журнал необратимых блоков с финальными подтверждёнными транзакциями.
  • reversible_blocks — memory-mapped файл с блоками, уже записанными в цепочку, но ещё не необратимыми; в них — валидные транзакции, ожидающие финализации по консенсусу. Head block — последний записанный блок, хранится в reversible_blocks.
  • chain state / chain database — в memory-mapped файле кэшируется состояние цепочки по блокам: аккаунты, отложенные транзакции, данные multi_index смарт-контрактов. Кэшируются ID последних 65 536 блоков для TaPOS. ID транзакции и срок действия кэшируются до истечения транзакции.

  • pending block — блок в памяти с транзакциями по мере обработки; он станет или может стать head block. Если этот nodeos — производящий узел, pending block рассылается другим экземплярам nodeos.

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

Интерфейсы COOPOS

COOPOS даёт сервисы и интерфейсы, чтобы контракты сохраняли состояние между действиями и транзакциями. Например, контракт eosio.token хранит балансы в базе состояния цепочки. Каждый nodeos держит БД в памяти, поэтому чтение/запись в контрактах просты.

HTTP RPC API nodeos

Через HTTP RPC API сервис nodeos отдаёт запросы к базе состояния цепочки.

Режимы чтения nodeos

nodeos можно запускать в разных режимах «чтения». Они влияют на обработку блоков и транзакций:

  • head: учитываются только побочные эффекты подтверждённых транзакций; необработанные транзакции обрабатываются, но в состояние не включаются.
  • irreversible: только подтверждённые транзакции до последнего необратимого блока включительно.
  • speculative: побочные эффекты подтверждённых и неподтверждённых транзакций.

Транзакция считается подтверждённой, когда nodeos принял её, обработал и записал в блок цепочки — она в head block или раньше.

Клиенты (cleos, RPC API) видят состояние БД на текущий head block. Head ещё не необратим, возможны короткие форки — при переключении на лучшую ветку прочитанное состояние может устареть.

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

Режим irreversible

nodeos по-прежнему отслеживает актуальные блоки в fork database, но отображаемое состояние отстаёт от «головы» форка (fork DB head) и соответствует последнему необратимому блоку.

Клиенты (cleos, RPC API) видят состояние БД по последнему необратимому блоку и не включают изменения от транзакций, известных узлу, но ещё не попавших в цепочку (в т.ч. неподтверждённых).

Режим speculative (устарел)

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

Низкая задержка, но хрупко: нет гарантии, что эти транзакции попадут в цепочку или в том же порядке, что подразумевает видимое состояние.

Минимальная задержка при максимальной непоследовательности.

В speculative режиме nodeos может выполнять транзакции с TaPoS на любой валидный блок лучшей ветки.

Как задать режим чтения

Режим задаётся опцией --read-mode плагина eosio::chain_plugin.