Proof of Token Used (PoTU)
PoTU = mecanism de deflație controlată: proposer-ul fiecărui bloc arde OMBRA ca "energy cost". Scalat cu munca AI din bloc — blocuri goale ard minim, blocuri cu task-uri mari ard proporțional.
Formula
burn_proposer = MAX(0.00001, total_block_tokens / 10,000,000) OMBRA
În micro-OMBRA:
burn_micro = MAX(10, totalTokens × 1_000_000 / 10_000_000)
= MAX(10, totalTokens / 10)
Constantele (din packages/core/src/transactions/types.ts):
MIN_BURN_PER_BLOCK = 10n(10 micro = 0.00001 OMBRA)BURN_TOKEN_DIVISOR = 10_000_000n
Exemple
| Scenariu | Tokens AI total | Burn |
|---|---|---|
| Bloc gol (heartbeat) | 0 | 0.00001 OMBRA |
| Task chat scurt | 50K | 0.00005 OMBRA |
| Task chat tipic | 300K | 0.00003 OMBRA |
| Task code agentic | 2M | 0.0003 OMBRA |
| Bloc cu 10M tokens (multi-task) | 10M | 0.001 OMBRA |
| Bloc 100M tokens (heavy) | 100M | 0.01 OMBRA |
De ce burn (nu stake/pay)?
| Opțiune | Pro | Con |
|---|---|---|
| Burn (ales) | Deflație reală, supply scade. Costul e pierderea, nu transfer. | Tokens dispar definitiv |
| Stake/lock | Posibil unlock, mai prietenos | Nu rezolvă supply problem |
| Pay-to-validators | Redistribuie, fără pierdere | Nu deflation, doar rotație |
Confirmat de spec: vrem emisiune redusă + deflație activă scalată cu activitate.
Heartbeat block
Bloc gol (fără task-uri) NU e gratis — proposer-ul tot arde MIN_BURN = 0.00001 OMBRA. Asta înseamnă:
- 5760 blocuri/zi × 0.00001 = 0.0576 OMBRA/zi ars în heartbeat
- Acoperire cost minimal "I'm alive" + protecție contra spam-ului de blocuri goale
Verificare
În chain.validateBlockV2Consensus(), fiecare bloc post-fork e verificat că:
- Conține o
BurnTxsemnată deblock.proposer burnTx.amount === calculateBurnAmount(totalBlockTokens)(deterministic)block.tokensConsumed === totalBlockTokens(header match)block.tokensBurned === burnTx.amount.toString()(header match)
Dacă oricare nu match → blocul e respins de toate peers la sync.
Tx type nou: BURN
interface BurnTx extends BaseTx {
type: "BURN";
amount: bigint; // micro-OMBRA arși
reason: "block_energy";
blockIndex: number; // index blocul pentru care e burn
tokensConsumed: number; // total tokens AI (verificabil)
}
Builder: buildBurnTx în core.
Apply în chain: scade tx.amount din block.proposer.balance, nu adaugă la nicio destinație.
Trade-off-uri
De ce divisor 10M (NU 1M)?
- 1M ar însemna
burn = tokens / 1M, adică proposer arde la fel de mult cât primește miner-ul — too aggressive - 10M =
1/10din miner reward — cost notabil dar nu confiscator
De ce MIN 0.00001 (NU 0)?
- Heartbeat — proposer trebuie să fie incentivat să nu producă blocuri goale doar pentru sync
- Permite future spam-protection (blocurile goale ard mai mult cu modificare formula)