Учёт вознаграждений (нормативный)
5.7 Учёт вознаграждений (нормативный)
Учёт bINT событийный. Его несут три семейства записей:
contribution_point_events— append-only строки событий. Каждое зачисление записывается как событие с его источником (receipt, реферал, квест, ...), id исходной записи, суммой и меткой времени создания. Балансы выводятся из событий; события никогда не редактируются на месте.receipt_rewards— запись вознаграждения по чеку: что заработал конкретный верифицированный чек и как была составлена сумма (состав хранится как разбивка рядом с суммой).- Баланс пользователя — текущий баланс, показываемый в продукте, выводится из истории событий.
// строка 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 читаются из листьев запечатанной эпохи.
Снимок эпохи — а не цепочка по каждой записи — является единицей аудита: листья, корень и метод верификации опубликованной эпохи позволяют любому пересчитать обязательство и проверить, что запечатанный корень соответствует записям. Исправления после запечатывания оформляются как новые записи в более поздней эпохе; запечатанная история никогда не переписывается.