Cette modification ajoute une nouvelle commande rollback à geth qui permet de revenir en arrière dans la blockchain en supprimant un ou plusieurs blocs récents.
Ajouts :
- Nouvelle commande CLI
rollbackCommand(lignes 167-187) - Nouvelle fonction
rollback()(lignes 515-562)
Fonctionnalités :
- Permet de spécifier le nombre de blocs à revenir en arrière (par défaut : 1)
- Validation des entrées (nombre positif, ne pas dépasser le genesis)
- Utilisation de la méthode
SetHead()de la blockchain - Messages de log et affichage utilisateur
Modification :
- Ajout de
rollbackCommanddans la liste des commandes (ligne 220)
Ajout de la méthode publique WriteBlockMetadata() :
- Permet aux packages externes d'appeler la mise à jour du metadata.json
- Wrapper public de la méthode privée
writeBlockMetadata()
// 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)
}Documentation complète en français comprenant :
- Description détaillée
- Exemples d'utilisation
- Cas d'utilisation courants
- Avertissements et précautions
- Guide de dépannage
- Détails techniques
- Information sur la mise à jour du metadata.json
Documentation spécifique sur la mise à jour du metadata.json :
- Problème résolu
- Solution implémentée
- Exemples avant/après
- Vérification
Guide de référence rapide en anglais avec :
- Syntaxe de base
- Exemples pratiques
- Gestion des erreurs
- Références croisées
Script de test automatisé qui :
- Crée une blockchain de test
- Génère des blocs
- Teste le rollback d'un bloc
- Teste le rollback de plusieurs blocs
- Vérifie la gestion des erreurs
geth rollback [nombre_de_blocs]# Revenir d'un bloc en arrière
geth rollback
# Revenir de 5 blocs en arrière
geth rollback 5
# Avec un datadir personnalisé
geth rollback --datadir /path/to/data 3-
Vérification du bloc genesis
- Empêche le rollback du bloc 0
-
Validation du nombre de blocs
- Doit être > 0
- Ne peut pas dépasser le nombre de blocs existants
-
Vérification de l'état de la blockchain
- Détecte si la blockchain est vide
- Affiche le bloc actuel avant rollback
⭐ NOUVEAU : Lors d'un rollback, le fichier metadata.json est automatiquement mis à jour !
Avantages :
- ✅ Le fichier
metadata.jsonreste synchronisé avec l'état réel de la blockchain - ✅ Les scripts de monitoring fonctionnent correctement après un rollback
- ✅ Pas besoin de redémarrer geth pour mettre à jour les métadonnées
- ✅ Message de confirmation affiché dans la console
Implémentation :
// Après le rollback
newBlock := chain.CurrentBlock()
chain.WriteBlockMetadata(newBlock) // Mise à jour du metadata.jsonVérification :
geth rollback 3
cat ~/.ethereum/metadata.json | jq '.blockNumber'- Messages d'erreur clairs et informatifs
- Vérification de tous les paramètres avant exécution
- Utilisation de
utils.Fatalf()pour les erreurs critiques
- Log WARNING lors du début du rollback
- Log INFO après succès
- Affichage console avec les numéros de blocs avant/après
1. Parse arguments CLI
2. Initialize node config
3. Open blockchain database
4. Get current block number
5. Validate rollback parameters
6. Call blockchain.SetHead(target)
7. Verify new block number
8. Display results
utils.MakeChain(): Création de l'instance blockchainchain.CurrentBlock(): Obtenir le bloc actuelchain.SetHead(target): Effectuer le rollbackrawdb.*: Lectures de la base de données
github.com/ethereum/go-ethereum/core: Blockchain coregithub.com/ethereum/go-ethereum/core/rawdb: Raw database accessgithub.com/ethereum/go-ethereum/cmd/utils: CLI utilitiesgithub.com/urfave/cli/v2: CLI framework
go build -o build/bin/geth ./cmd/geth./build/bin/geth help | grep rollback
./build/bin/geth rollback --help./test_rollback.sh-
Validation stricte des paramètres
- Empêche les valeurs invalides
- Protège contre le rollback au-delà du genesis
-
Messages d'avertissement
- Documentation claire sur la nature destructive
- Recommandation de sauvegarde
-
Opérations atomiques
- Utilisation de
SetHead()qui gère les transactions
- Utilisation de
- Toujours sauvegarder avant un rollback
- Arrêter geth avant d'exécuter la commande
- Vérifier le numéro de bloc avant et après
- Comprendre les implications sur le réseau
- Revenir à un état antérieur pour tester
- Réinitialiser après des tests
- Supprimer un bloc corrompu
- Récupérer d'une synchronisation défaillante
- Réorganisation de la chaîne
- Migration de données
-
Mode interactif
- Confirmation avant rollback
- Affichage des blocs qui seront supprimés
-
Mode dry-run
- Simulation sans modification
- Estimation de l'impact
-
Sauvegarde automatique
- Backup avant rollback
- Option de restauration
-
Support des ranges
- Rollback jusqu'à un hash spécifique
- Rollback jusqu'à un timestamp
-
Statistiques détaillées
- Nombre de transactions affectées
- État des données supprimées
- ✅ Compatible avec toutes les versions de Geth basées sur cette structure
- ✅ Fonctionne avec tous les modes de sync (full, snap, light)
- ✅ Compatible avec les réseaux personnalisés
- ✅ Fonctionne avec ancient database
core/blockchain.go: MéthodeSetHead()core/headerchain.go: MéthodesetHead()core/rawdb/: Opérations sur la base de données
- Architecture de la blockchain
- Gestion de l'état
- Organisation des données
- Date : Novembre 2025
- Version de go-ethereum : Fork basé sur go-ethereum
- Fonctionnalité : Nouvelle commande CLI
rollback
Ce code est sous la même licence que go-ethereum (GNU General Public License v3.0).