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

Архив и чтение прошлого

Обычные узлы ZooBC хранят только недавнюю историю: блоки за 30–60 дней и три самых новых снимка. Архив отвечает на вопросы о далёком прошлом, например каким был баланс аккаунта три года назад: каждый снимок начиная с блока 0, распределённый по децентрализованному хранилищу, а не хранящийся на одной машине, и проверяемый байт за байтом по spine-цепочке.

Что хранит каждый узел

Каждые 172 800 блоков (около 30 дней) в mainnet каждый узел записывает снимок: всё состояние цепочки, каждый баланс, место реестра и запись, на момент на 760 блоков ниже этой высоты. Узлы разносят эту работу во времени, но байты у каждого узла одинаковы. Снимок — это один документ CBOR, разрезанный на чанки по 102 400 байт, которые называются своими хешами SHA3-256. Его манифест — с хешем всего файла, хешем каждого чанка и опорной высотой — публикуется в блоке spine-цепочки, медленной цепочки суточных блоков, соподписанных двумя третями зарегистрированных мест.

Ничто в снимке не подписано. Его подлинность обеспечивает соподписанный spine-блок, который его называет, поэтому снимок подлинный, кто бы его ни отдавал, если только его байты совпадают с хешами манифеста. Снимки — это ещё и способ быстро подключить новый узел (снимки и быстрая синхронизация).

Каждый узел хранит на своём диске только три самых новых поколения снимков. Это всё, что нужно узлу, чтобы помогать подключаться другим, а хранение каждого когда-либо сделанного снимка на каждом узле каждый месяц обходилось бы каждому оператору всё большим объёмом диска. Старые блоки тоже обрезаются (обрезка истории).

Архив

Начиная с версии 0.5.8 все снимки от блока 0 хранит децентрализованное хранилище, а не каждый узел. Чанки каждого снимка хранят пять зарегистрированных узлов, выбранных жеребьёвкой (storage_replication), как и фрагменты любого хранимого файла (пул децентрализованного хранения). Каждый узел хранит только свои последние три снимка; ни один узел не хранит их все.

Ни одна машина не держит историю целиком, поэтому ни один оператор не может её потерять или утаить. Архивный сервер, которым управляет одна организация, даже ZooBC Foundation, был бы именно такой единой точкой. Ничего и не выбрасывается: архив уходит к самому первому снимку.

Хранить чанки архива — часть обязанности зарегистрированного узла по хранению. Каждую эпоху хранения 10 % пула долголетия выплачиваются равными частями узлам, которые доказывают хранение отобранных для проверки чанков (пулы).

Один узел хранит свои последние три снимка; архив хранит каждый снимок начиная с блока 0, каждый чанк — на пяти узлах, выбранных жеребьёвкой.
Один узел хранит свои последние три снимка; архив хранит каждый снимок начиная с блока 0, каждый чанк — на пяти узлах, выбранных жеребьёвкой.

Читатель, которому нужно состояние на прошлый момент, проходит по spine-цепочке назад до снимка, сделанного в то время, и читает его манифест. Он загружает чанки снимка у их хранителей и сверяет каждый с его хешем в манифесте, поэтому хранитель не может подсунуть ложный чанк. Затем он собирает снимок заново, проверяет хеш целого и восстанавливает состояние на этой высоте: каждый баланс, место и запись того момента. Ни один узел не держит историю целиком, и архивный узел не нужен.

Пройти по spine-цепочке, прочитать манифест, загрузить и проверить чанки, восстановить состояние.
Пройти по spine-цепочке, прочитать манифест, загрузить и проверить чанки, восстановить состояние.

Проверки не требуют доверия к хранителям: spine-цепочку соподписывают места, а её манифесты фиксируют хеш каждого чанка, поэтому ложный чанк обнаруживается сразу.

Другие способы увидеть прошлое

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

См. также