# Bloc Rewards : montants affichés ≠ 50 BTC (4 premières années) **Auteur** : Équipe 4NK **Date** : 2026-01-26 **Version** : 1.0 ## Problème En UTXO-list, section **Bloc Rewards (Récompenses de minage)** : - **Attendu** : 50 🛡 par bloc (récompense de base des 4 premières années, protocole Bitcoin). - **Observé** : 4 700 🛡, 4 250 🛡, 4 100 🛡, etc. (ex. `utxo_list.txt`). ## Chaîne de données (origine des montants) 1. **RPC** : `listunspent` (Bitcoin Core) retourne pour chaque UTXO un champ `amount` en **BTC**. 2. **bitcoin-rpc.js** : on récupère `utxo.amount`, on catégorise les coinbase en `bloc_rewards`, on écrit en fichier `item.amount`. 3. **Fichier** : `utxo_list.txt`, format `category;txid;vout;amount;confirmations;...`. Le montant écrit = valeur RPC. 4. **utxo-list.html** : en chargement fichier, on parse `amount` et on affiche `Math.round(utxo.amount)` 🛡. Donc **on affiche strictement ce que le nœud fournit** via `listunspent`. Aucune transformation (sats→BTC, somme, etc.) côté dashboard. ## Récompense de bloc côté protocole - **Coinbase** : 1 output = **subsidy** (récompense de base) + **frais** des transactions du bloc. - **4 premières années** (blocs 0–209 999) : subsidy = **50 BTC** (mainnet / signet standard). - Les frais sont en général bien plus petits que 50 BTC. Si on voit **4 700 BTC** par bloc, ce n’est pas « 50 + frais » dans un cadre standard. ## Causes possibles 1. **Subsidy custom (signet)** Le signet peut utiliser des paramètres de chaîne différents (ex. autre courbe de subsidy). La récompense de bloc est définie dans les chain params du nœud, pas dans le miner. 2. **Miner / getblocktemplate** Le miner utilise `getblocktemplate`. La **coinbase** est construite par le **nœud**. La valeur de l’output coinbase (donc ce que `listunspent` voit) vient du nœud, pas du script `miner` ou de `blocktools.create_coinbase`. 3. **Bug en amont** Moins probable, mais possible : bug ou config spéciale du nœud / du wallet (autre unité, autre agrégation). ## Comment vérifier (diagnostic) À lancer sur la machine où tourne le nœud / le wallet utilisé par le dashboard : ```bash # 1. Montants listunspent (ex. wallet custom_signet) bitcoin-cli -rpcwallet=custom_signet listunspent 1 | jq '.[] | select(.txid) | {txid, vout, amount, confirmations}' # 2. Détail d’une coinbase particulière (ex. premier bloc rewards du fichier) TXID="d7696ca795fe16dfa8516f5267d476c755a8f2bdb93f5ff0dc14a2599c070cce" bitcoin-cli getrawtransaction "$TXID" 1 | jq '{txid, vout: [.vout[] | {n, value}], blockhash, blockheight}' ``` - Comparer `amount` (listunspent) et `vout[].value` (getrawtransaction) aux montants affichés dans l’UI et dans `utxo_list.txt`. - Vérifier **blockheight** : si height < 210 000, la subsidy standard est 50 BTC. Ensuite, côté **nœud** : - Config signet (fichier conf, `signetchallenge`, etc.). - Si possible, source des chain params (subsidy, halving) pour ce signet custom (ex. fork Easepay ou autre). ## Actions recommandées 1. **Ne pas forcer l’affichage à « 50 🛡 »** : on affiche la donnée brute pour garder le problème visible et traçable. 2. **Identifier la source** : - soit subsidy custom du signet → documenter la règle (ex. « X BTC par bloc pour ce signet ») et adapter l’affichage / les explications si besoin ; - soit anomalie (config, bug) → corriger côté nœud / chain params. 3. **Documenter** : une fois la règle connue, mettre à jour ce doc (et éventuellement l’UI) pour indiquer la récompense de bloc **réelle** pour ce signet. ## Pages / composants affectés - `signet-dashboard/src/bitcoin-rpc.js` : lecture `utxo.amount` (listunspent), écriture fichier. - `signet-dashboard/public/utxo-list.html` : affichage `Math.round(utxo.amount)` pour Bloc Rewards. - `utxo_list.txt` : reflet des montants RPC. ## Références - Bitcoin Core RPC : `listunspent` (amount en BTC), `getrawtransaction` (vout[].value). - `miner_imports/test_framework/blocktools.py` : `create_coinbase(height, nValue=50)` — utilisé par les tests, **pas** par le miner en production pour ce signet ; la coinbase réelle vient du nœud.