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

Плата за сохранение данных (долговечность)

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

Открытие записи

Открыть запись можно двумя способами.

  • Поле survival. Транзакция версии 2 или 3 несёт поле survival — собственный депозит отправителя, либо 0, либо не меньше 0,1 ZBC (10 000 000 атомарных единиц). Депозит в этом поле открывает запись для этой же транзакции (конверт транзакции).
  • FundLongevity (тип 52). Любой аккаунт может пополнить запись для любой транзакции. Тело занимает ровно 28 байт: идентификатор целевой транзакции (8 байт), сумма (8), высота блока, содержащего цель (4), и размер цели (8) — её тело плюс сообщение. Сумма должна быть не меньше 0,1 ZBC.

Первое пополнение должно поступить, пока цели меньше одного интервала снимков, 172 800 блоков (около 30 дней) в mainnet, и должно указывать реальные высоту и размер цели. Это окно гарантирует, что каждый узел ещё хранит цель и может проверить заявление. Запоздавшее или неверное первое пополнение — оплаченная пустая операция: комиссия удерживается, и ничего не пополняется.

Последующее пополнение должно указывать тот же размер и может прийти в любой момент, пока запись жива. Его цена смешивается с ценой записи как взвешенное среднее.

28-байтовое тело FundLongevity, окно первого пополнения и два бесплатных интервала.
28-байтовое тело FundLongevity, окно первого пополнения и два бесплатных интервала.

Сколько это стоит

При открытии запись фиксирует размер цели и цену хранения за МиБ (0,05 ZBC в начале). Она ничего не платит до истечения двух интервалов снимков после блока цели, потому что столько узлы хранят транзакцию в любом случае. После этого — раз в период:

rent = ceil(payload bytes × locked price ÷ 1,048,576), at least 1 unit

Аренда берётся из депозита и зачисляется в пул долголетия, который в каждом блоке выплачивает узлам долю через лотерею coinbase. По начальной цене полезная нагрузка в 16 байт платит 77 единиц за период, а в 1 000 байт — 4 769 единиц, так что для большей из них минимальный депозит 0,1 ZBC покрывает больше 2 000 периодов. Когда деньги записи доходят до нуля, запись освобождается, и её транзакцию снова можно обрезать.

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

Завершение записи

Аренда списывается с денег плательщиков по принципу «первым пришёл — первым ушёл»: самый старый депозит расходуется полностью, прежде чем затрагивается следующий. Запись живёт, пока кто-то ещё платит.

Чтобы завершить её досрочно, каждый плательщик, чьи деньги ещё не израсходованы, голосует обычной транзакцией CloseLongevity (тип 309). Когда проголосовал последний из них, запись закрывается, а её остаток уходит в пул долголетия.

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

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

Депозиты плательщиков расходуются начиная с самого старого; запись закрывается, как только проголосовали все плательщики, у которых остались деньги.
Депозиты плательщиков расходуются начиная с самого старого; запись закрывается, как только проголосовали все плательщики, у которых остались деньги.

Чтение записей

У API узла есть маршруты для записей и цен: /longevity, /longevity/quote, /accounts/<address>/survival, /accounts/<address>/objects и /objects/<id>.

См. также