Вики ZooBC
Данные и хранение

Обрезка истории

Цепочка, которая вечно хранит каждый блок, заставляет каждый узел платить за хранение всей её истории. Узлы ZooBC вместо этого обрезают историю: ниже горизонта, привязанного к снимкам, они удаляют старые блоки, транзакции, строки реестра движений, квитанции и устаревшие версии записей. Текущее состояние, например балансы, места реестра и строки наборов данных, так не обрезается; обрезается только старая история. Работающий узел в mainnet хранит блоки за 30–60 дней.

Горизонт

Каждые 172 800 блоков (около 30 дней) в mainnet каждый узел записывает снимок состояния (снимки и быстрая синхронизация). Горизонт обрезки — более старая из двух последних опорных высот снимков. Если снимок только один, это его высота минус один интервал, и пока не существует манифеста снимка, ничего не обрезается. Начиная с версии 0.5.8 горизонт никогда не может опережать чистую формулу, общую для всех узлов:

horizon(h) = floor(h ÷ interval) × interval − interval

При интервале 172 800 блоков горизонт отстаёт от вершины на один–два интервала. Например, на высоте 500 000 горизонт не выше 172 800, поэтому узел хранит не меньше 327 200 самых новых блоков — около 57 дней. После следующего снимка, на 518 400, горизонт сдвигается вверх на один интервал, и остаётся около 30 дней.

Ещё два ограничения делают обрезку щадящей. Самые новые 1 440 блоков (6 часов) никогда не обрезаются, что бы ни говорил горизонт, а узел удаляет не больше 500 строк на таблицу за блок, так что работа распределяется во времени.

Что остаётся ниже горизонта

Некоторые блоки сохраняются независимо от возраста:

  • блок 0;
  • каждый блок, несущий транзакцию, чья запись долговечности всё ещё содержит деньги, — вместе с этой транзакцией;
  • транзакции, оплаченные на момент самого нового снимка, — они хранятся на один интервал дольше, чтобы снимок мог их нести.

Снимки несут эти оплаченные транзакции и заголовки их блоков, поэтому узел, присоединяющийся со снимка, тоже их хранит.

Сохраняются: последние 30–60 дней, самые новые 1 440 блоков, блок 0 и каждая оплаченная транзакция.
Сохраняются: последние 30–60 дней, самые новые 1 440 блоков, блок 0 и каждая оплаченная транзакция.

Другие часы

Обрезка — не единственное правило с временным промежутком, и числа легко перепутать:

ЧтоКак долго, в mainnet
Блоки на работающем узле30–60 дней (один–два интервала снимков)
Блоки, которые никогда не обрезаютсясамые новые 1 440 (6 часов)
Квитанции518 400 блоков, около 90 дней (квитанции и топология сети)
Идентификаторы транзакцийне меньше 25 часов, дольше самого длинного окна срока действия в сутки (срок действия и метки времени)
Предел отката720 блоков, 3 часа (финальность и откат)

Предел отката говорит, насколько далеко назад цепочка может реорганизоваться; он ничего не удаляет.

Как хранить больше

  • Оператор может задать keep_all_history в node.conf, чтобы хранить обрезанную историю локально. Это локальный выбор, а не поведение по умолчанию.
  • Любой может заплатить за сохранение одной транзакции депозитом долговечности.
  • Архивные узлы запускают рядом с узлом сервис индексирования и обслуживают обозреватель (обозреватель и архивные узлы).
  • Децентрализованное хранилище хранит каждый снимок начиная с блока 0, причём чанки каждого снимка лежат на пяти зарегистрированных узлах, выбранных жеребьёвкой, так что состояние на момент любого прошлого снимка можно восстановить, не требуя от какого-либо узла хранить все блоки (архив и чтение прошлого).

Состояние сокращается арендой

Обрезка истории не трогает текущее состояние. Состояние сокращается иначе — через аренду. Аккаунт, который не может заплатить аренду аккаунта, удаляется, строки наборов данных с неоплаченной арендой деактивируются, а хранимый файл, у которого закончился депозит, удаляется. В каждом случае оставшиеся деньги уходят в пул долголетия, и ни один ZBC не теряется.

См. также