Обозреватель и архивные узлы
Обозреватель ZooBC позволяет любому просматривать блоки, транзакции, аккаунты и узлы, искать по сообщениям старых транзакций и читать ежедневную статистику. Большая часть этого исходит не от обычного узла, а от архивного сервиса — отдельной программы, которая работает рядом с зарегистрированным узлом и ведёт индекс истории цепочки с возможностью поиска.
Что хранит обычный узел
Обычный узел хранит текущее состояние (балансы, записи, реестр) и недавнее окно блоков: один–два периода снимков, что в mainnet составляет 30–60 дней. Этого достаточно, чтобы проверять цепочку и помогать новым узлам подключаться со снимка (снимки и быстрая синхронизация). Более старые блоки, транзакции и квитанции обрезаются (обрезка истории), что сохраняет узлы лёгкими. Оператор, который хочет хранить обрезанную историю локально, может задать keep_all_history в node.conf.
Следствие: сам по себе узел не может ответить на запрос «каждая транзакция начиная с блока 0», как и выполнить полнотекстовый поиск по сообщениям.
Архивный сервис
Этот пробел закрывает архивный сервис, zoobc-archival-api. Узел, оператор которого задаёт archival_node = true, запускает его и следит за ним. Сервис читает собственную базу данных SQLite узла и ведёт индекс блоков и транзакций в хранилище MySQL, поэтому может отвечать на запросы об истории, хронологии аккаунтов, статистике и на поисковые запросы. Помимо архивных вариантов обычных маршрутов, он обслуживает собственные:
| Маршрут | На что отвечает | |
|---|---|---|
/search/transactions | поиск по транзакциям, включая их сообщения | |
/stats/… | статистика сети | |
/spine/blocks | блоки [[spine-chain | spine-цепочки]] |
/network/map | карта сети | |
/archive/stats | статистика самого архива |
Одна деталь важна для разработчиков, сравнивающих ответы: архивный сервис пишет шестнадцатеричные значения в верхнем регистре, а узел — в нижнем.
Объявление в цепочке
Владелец зарегистрированного узла объявляет архивный сервис транзакцией RegisterArchival (тип 46). Названный ключ узла должен принадлежать зарегистрированному узлу, которым владеет отправитель. Стейк не блокируется, а UnregisterArchival (тип 47) отзывает запись. Любой может получить список объявленных сервисов по адресу GET /api/v1/registry/archivals, а веб-кошелёк читает этот список, когда его шлюз отказывает.
Обозреватель
Обозреватель — веб-страница, которую отдают шлюзы. Он построен на архивных маршрутах: блоки, транзакции, аккаунты, узлы, spine-цепочка, статистика и поиск. Шлюз отправляет каждый запрос на чтение к API сначала своему архивному сервису, а для маршрутов, которых у архивного сервиса нет, переходит к узлу. Обозреватель также показывает версию программы каждого узла, так что операторы и наблюдатели могут видеть, кто обновился (релизы и обновления).
Всё это — публичные данные цепочки: ключ нужен, чтобы действовать в цепочке, но никогда — чтобы на неё смотреть (API узла).
Не единственный способ прочитать прошлое
Архивный сервис — это удобство, а не память цепочки.
Каждый снимок начиная с блока 0 хранит децентрализованное хранилище, а не каждый узел, чтобы любой мог пройти по spine-цепочке назад до снимка нужного времени и восстановить состояние таким, каким оно было, не опираясь ни на какой архивный узел (архив и чтение прошлого).
Чего архивные сервисы не делают: они не создают блоков — это делают только зарегистрированные узлы, — и нет никакой центральной базы данных ZooBC Foundation, которой отчитываются узлы. Ретрансляторы передают звонки между кошельками, а не транзакции (ретрансляторы).