**Motivations:** - Comprendre pourquoi Bloc Rewards affichent 4700, 4250... au lieu de 50 BTC - Ne pas masquer l'écart par un affichage forcé 50 🛡 **Root causes:** - Montants = listunspent (RPC) → fichier → UI ; aucune transformation - Si ≠ 50 BTC, cause en amont : subsidy signet custom ou bug nœud/config **Correctifs:** - Revert affichage "50 🛡 (n 🛡 avec frais)" pour Bloc Rewards - Doc fixKnowledge/bloc-rewards-amount-not-50-btc.md : chaîne de données, protocole 50 BTC, causes possibles, commandes de diagnostic **Evolutions:** - Aucune **Pages affectées:** - signet-dashboard/public/utxo-list.html - fixKnowledge/bloc-rewards-amount-not-50-btc.md
4.1 KiB
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)
- RPC :
listunspent(Bitcoin Core) retourne pour chaque UTXO un champamounten BTC. - bitcoin-rpc.js : on récupère
utxo.amount, on catégorise les coinbase enbloc_rewards, on écrit en fichieritem.amount. - Fichier :
utxo_list.txt, formatcategory;txid;vout;amount;confirmations;.... Le montant écrit = valeur RPC. - utxo-list.html : en chargement fichier, on parse
amountet on afficheMath.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
-
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. -
Miner / getblocktemplate
Le miner utilisegetblocktemplate. La coinbase est construite par le nœud. La valeur de l’output coinbase (donc ce quelistunspentvoit) vient du nœud, pas du scriptminerou deblocktools.create_coinbase. -
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 :
# 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) etvout[].value(getrawtransaction) aux montants affichés dans l’UI et dansutxo_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
- Ne pas forcer l’affichage à « 50 🛡 » : on affiche la donnée brute pour garder le problème visible et traçable.
- 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.
- 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: lectureutxo.amount(listunspent), écriture fichier.signet-dashboard/public/utxo-list.html: affichageMath.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.