From 89c1c16a46ce6390d53f8d17cd56caca9c2b15ac Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 17 Apr 2026 03:53:00 +0200 Subject: [PATCH] cmd/geth: add code exporter for db export (#34696) Adds a 'code' exporter to 'geth db export' that iterates over all contract bytecode entries (CodePrefix + code_hash -> bytecode). Usage: geth --datadir db export code code.rlp This enables exporting contract bytecode. --- cmd/geth/dbcmd.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/cmd/geth/dbcmd.go b/cmd/geth/dbcmd.go index 455dd05aca..173fc97def 100644 --- a/cmd/geth/dbcmd.go +++ b/cmd/geth/dbcmd.go @@ -806,6 +806,24 @@ func (iter *snapshotIterator) Release() { iter.storage.Release() } +type codeIterator struct { + iter ethdb.Iterator +} + +func (iter *codeIterator) Next() (byte, []byte, []byte, bool) { + for iter.iter.Next() { + key := iter.iter.Key() + if bytes.HasPrefix(key, rawdb.CodePrefix) && len(key) == (len(rawdb.CodePrefix)+common.HashLength) { + return utils.OpBatchAdd, key, iter.iter.Value(), true + } + } + return 0, nil, nil, false +} + +func (iter *codeIterator) Release() { + iter.iter.Release() +} + // chainExporters defines the export scheme for all exportable chain data. var chainExporters = map[string]func(db ethdb.Database) utils.ChainDataIterator{ "preimage": func(db ethdb.Database) utils.ChainDataIterator { @@ -817,6 +835,10 @@ var chainExporters = map[string]func(db ethdb.Database) utils.ChainDataIterator{ storage := db.NewIterator(rawdb.SnapshotStoragePrefix, nil) return &snapshotIterator{account: account, storage: storage} }, + "code": func(db ethdb.Database) utils.ChainDataIterator { + iter := db.NewIterator(rawdb.CodePrefix, nil) + return &codeIterator{iter: iter} + }, } func exportChaindata(ctx *cli.Context) error {