Плата за сохранение данных (долговечность)
Узлы 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, и должно указывать реальные высоту и размер цели. Это окно гарантирует, что каждый узел ещё хранит цель и может проверить заявление. Запоздавшее или неверное первое пополнение — оплаченная пустая операция: комиссия удерживается, и ничего не пополняется.
Последующее пополнение должно указывать тот же размер и может прийти в любой момент, пока запись жива. Его цена смешивается с ценой записи как взвешенное среднее.
Сколько это стоит
При открытии запись фиксирует размер цели и цену хранения за МиБ (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>.