From cc054c89048e1195b757f0906fb52a85537a5fad Mon Sep 17 00:00:00 2001 From: ncantu Date: Mon, 26 Jan 2026 01:52:22 +0100 Subject: [PATCH] Revert 50 BTC display hack, document Bloc Rewards amount analysis MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **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 --- .../bloc-rewards-amount-not-50-btc.md | 78 +++++++++++++++++++ signet-dashboard/public/utxo-list.html | 10 +-- 2 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 fixKnowledge/bloc-rewards-amount-not-50-btc.md diff --git a/fixKnowledge/bloc-rewards-amount-not-50-btc.md b/fixKnowledge/bloc-rewards-amount-not-50-btc.md new file mode 100644 index 0000000..f50689a --- /dev/null +++ b/fixKnowledge/bloc-rewards-amount-not-50-btc.md @@ -0,0 +1,78 @@ +# 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. diff --git a/signet-dashboard/public/utxo-list.html b/signet-dashboard/public/utxo-list.html index af01dd5..263c24b 100644 --- a/signet-dashboard/public/utxo-list.html +++ b/signet-dashboard/public/utxo-list.html @@ -514,15 +514,7 @@ tableHTML += '-'; } } else if (isBlocRewards) { - // Récompense de bloc de base : 50 BTC pour les 4 premières années (hauteur < 210000) - // Le montant réel peut inclure les frais de transaction - const baseReward = 50; - const displayAmount = baseReward; - const hasFees = Math.abs(utxo.amount - baseReward) > 0.001; - const amountDisplay = hasFees - ? `${displayAmount.toLocaleString('fr-FR')} 🛡 (${amountBTC.toLocaleString('fr-FR')} 🛡 avec frais)` - : `${displayAmount.toLocaleString('fr-FR')} 🛡`; - tableHTML += `${amountDisplay}`; + tableHTML += `${amountBTC.toLocaleString('fr-FR')} 🛡`; if (utxo.blockTime) { const date = new Date(utxo.blockTime * 1000); tableHTML += `${date.toLocaleString('fr-FR', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' })}`;