Technical Paper

Учёт вознаграждений (нормативный)

5.7 Учёт вознаграждений (нормативный)

Учёт bINT событийный. Его несут три семейства записей:

  • contribution_point_events — append-only строки событий. Каждое зачисление записывается как событие с его источником (receipt, реферал, квест, ...), id исходной записи, суммой и меткой времени создания. Балансы выводятся из событий; события никогда не редактируются на месте.
  • receipt_rewards — запись вознаграждения по чеку: что заработал конкретный верифицированный чек и как была составлена сумма (состав хранится как разбивка рядом с суммой).
  • Баланс пользователя — текущий баланс, показываемый в продукте, выводится из истории событий.
text
// строка contribution_point_events (репрезентативная)
id:          184223            // serial
user_id:     9c41...-...       // id аккаунта
source:      receipt
source_id:   6f2b...-...       // UUID чека
amount:      125.00            // decimal
created_at:  2026-05-17T14:23:12Z

Расчёт: снимки эпох

Расчёт периодический. Движок эпох строит снимок накопленного баланса каждого пригодного аккаунта за период, записывает его как reward_epochs + reward_epoch_leaves (один лист на аккаунт), сворачивает листья в Merkle-корень и выполняет независимый шаг верификации, который пересчитывает корень из сохранённых листьев до одобрения эпохи. Одобренный корень запечатывается в блокчейне транзакцией memo, а права на получение INT читаются из листьев запечатанной эпохи.

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