Хранение и режимы чтения
Платформа 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 или раньше.
Режим head¶
Клиенты (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.