Précédemment, lors d'un rollback de la blockchain avec la commande geth rollback, le fichier metadata.json n'était pas mis à jour et conservait les informations de l'ancien bloc (avant le rollback).
// WriteBlockMetadata is a public wrapper for writeBlockMetadata
// It allows external packages to update the metadata.json file
func (bc *BlockChain) WriteBlockMetadata(block *types.Block) {
bc.writeBlockMetadata(block)
}Cette méthode publique permet aux packages externes (comme cmd/geth) d'appeler la fonction de mise à jour du metadata.json.
La fonction rollback a été modifiée pour appeler WriteBlockMetadata après le SetHead :
newBlock := chain.CurrentBlock()
// Update metadata.json file with the new head block
chain.WriteBlockMetadata(newBlock)
log.Info("Rollback successful", "current_block", newBlock.NumberU64(), "current_hash", newBlock.Hash())
fmt.Printf("Successfully rolled back from block #%d to block #%d (%d blocks)\n", currentNumber, newBlock.NumberU64(), blocksToRollback)
fmt.Printf("metadata.json updated with new head block #%d\n", newBlock.NumberU64())Après un rollback, le fichier metadata.json sera automatiquement mis à jour avec les informations du nouveau bloc courant.
Avant le rollback (bloc #1000) :
{
"blockNumber": 1000,
"blockHash": "0xabc123...",
"parentHash": "0xdef456...",
"timestamp": 1699876543,
"gasUsed": 12345678,
"gasLimit": 30000000,
"difficulty": "12345678901234567890",
"miner": "0x1234567890abcdef1234567890abcdef12345678",
"txCount": 150
}Commande :
geth rollback 5Après le rollback (bloc #995) :
{
"blockNumber": 995,
"blockHash": "0xghi789...",
"parentHash": "0xjkl012...",
"timestamp": 1699876000,
"gasUsed": 11234567,
"gasLimit": 30000000,
"difficulty": "12345678901234567890",
"miner": "0xabcdef1234567890abcdef1234567890abcdef12",
"txCount": 145
}Sortie de la commande :
Successfully rolled back from block #1000 to block #995 (5 blocks)
metadata.json updated with new head block #995
Pour vérifier que le metadata.json a bien été mis à jour après un rollback :
# Effectuer un rollback
geth rollback 3
# Vérifier le contenu du metadata.json
cat ~/.ethereum/metadata.json | jq '.blockNumber'
# Ou voir toutes les infos
cat ~/.ethereum/metadata.json | jq '.'-
core/blockchain.go- Ajout de la méthode publique
WriteBlockMetadata()(ligne ~908-912)
- Ajout de la méthode publique
-
cmd/geth/chaincmd.go- Ajout de l'appel à
chain.WriteBlockMetadata(newBlock)après le rollback (ligne ~560-561) - Ajout d'un message de confirmation (ligne ~565)
- Ajout de l'appel à
- ✅ Le fichier
metadata.jsonreste toujours synchronisé avec l'état réel de la blockchain - ✅ Les scripts de monitoring peuvent faire confiance aux données du metadata.json même après un rollback
- ✅ Pas besoin de redémarrer geth pour que le metadata.json soit mis à jour
- ✅ Message de confirmation dans la sortie de la commande
Cette modification est rétrocompatible :
- La méthode
WriteBlockMetadata()est un simple wrapper public - La méthode privée
writeBlockMetadata()n'a pas changé - Aucun impact sur le comportement normal de la blockchain
- Aucun impact sur les performances
Pour tester la fonctionnalité :
# 1. Vérifier le bloc actuel
cat ~/.ethereum/metadata.json | jq '.blockNumber'
# 2. Effectuer un rollback
geth rollback 2
# 3. Vérifier que le metadata.json a été mis à jour
cat ~/.ethereum/metadata.json | jq '.blockNumber'
# Devrait afficher blockNumber - 2Le fichier metadata.json est maintenant correctement mis à jour lors d'un rollback, garantissant que les informations affichées correspondent toujours à l'état réel de la blockchain.