Rewards: miner + validator
Două tipuri de actori câștigă OMBRA post-fork: mineri (procesează task-uri AI) și validatori (semnează blocuri produse de proposer).
Reward miner (PoATU)
reward_miner_tokens = (outputTokens + thinkingTokens) / 1,000,000 OMBRA
PLUS share din fee-ul user-ului care a submitat task-ul:
reward_miner_fee = 70% × fee_task
Total miner per task: reward_miner_tokens + reward_miner_fee
Reward validator
Per attestare (semnătură pe un bloc):
reward_validator = (VALIDATOR_BASE_REWARD + 5% × total_fees_in_block) / numValidators
unde VALIDATOR_BASE_REWARD = 0.0001 OMBRA (100 micro).
Pentru un bloc cu 1 task fee 0.5 OMBRA și 1 validator:
reward = (0.0001 + 5% × 0.5) / 1 = 0.0001 + 0.025 = 0.0251 OMBRA
Calculator interactiv
Calculator reward
Exemple comparative
| Task | Tokens out | Tokens thinking | Fee | Miner total | Validator | Burn proposer | Net supply |
|---|---|---|---|---|---|---|---|
| Chat scurt | 5K | 0 | 0.01 | 0.012 | 0.00060 | 0.00001 | +0.012 |
| Chat tipic | 100K | 200K | 0.5 | 0.650 | 0.02510 | 0.00003 | +0.550 |
| Code simple | 50K | 50K | 0.3 | 0.310 | 0.01510 | 0.00001 | +0.265 |
| Code agentic | 500K | 1.5M | 2.0 | 3.400 | 0.10010 | 0.00020 | +3.000 |
| Long analysis | 1M | 3M | 5.0 | 7.500 | 0.25010 | 0.00040 | +6.500 |
(Net supply = miner + validator − burn_fee − burn_proposer)
Mecanica plății
Pentru miner
Reward-ul nu vine direct ca tx separat. Apare în:
TASK_REWARDtx după validare —rewards: [{address: miner, amount: X, reason: "miner"}]- Aplicate la
applyTaskReward()— incremente balance miner
Pentru validator
Validator-ul nu primește tx explicită. Reward-ul e distribuit automat în distributeValidatorRewards() apelat din applyBlockTransactions() post-fork:
const rewardPerValidator = calculateValidatorReward(totalFeesInBlock, numValidators);
for (const att of block.attestations) {
const acc = await db.getAccount(att.validatorAddress);
await db.putAccount({ ...acc, balance: acc.balance + rewardPerValidator });
}
Asta evită spam de tx-uri ATTESTATION_REWARD în mempool (deși tipul există, e rezervat pentru rare cazuri de payout explicit).
Cod sursă
packages/core/src/consensus/reward.ts:
export function calculateMinerReward(outputTokens: number, thinkingTokens: number): bigint {
const totalTokens = BigInt(outputTokens + thinkingTokens);
return (totalTokens * 1_000_000n) / TOKENS_PER_OMBRA;
}
export function calculateValidatorReward(totalFeesInBlock: bigint, numValidators: number): bigint {
if (numValidators <= 0) return 0n;
const feeShare = (totalFeesInBlock * FEE_SPLIT_V2.validator) / 100n;
return VALIDATOR_BASE_REWARD + feeShare / BigInt(numValidators);
}