From 4b4332755835d1a3e1b2d67bf2ef06b6b8f1423f Mon Sep 17 00:00:00 2001 From: Egor Lysenko Date: Tue, 30 Mar 2021 00:17:42 +0700 Subject: [PATCH] add command to export evm storage --- cmd/lachesis/chaincmd.go | 14 ++++++ cmd/lachesis/export_evm_history.go | 69 ++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 cmd/lachesis/export_evm_history.go diff --git a/cmd/lachesis/chaincmd.go b/cmd/lachesis/chaincmd.go index a1942c5c8..fcd63820e 100644 --- a/cmd/lachesis/chaincmd.go +++ b/cmd/lachesis/chaincmd.go @@ -77,6 +77,20 @@ be gzipped lachesis export state Exports blockchain state into a file. +`, + }, + { + Name: "evm", + Usage: "Export EVM storage", + ArgsUsage: "", + Action: utils.MigrateFlags(exportEvmStorage), + Flags: []cli.Flag{ + DataDirFlag, + }, + Description: ` + lachesis export evm + +Exports EVM storage into a file. `, }, }, diff --git a/cmd/lachesis/export_evm_history.go b/cmd/lachesis/export_evm_history.go new file mode 100644 index 000000000..257671124 --- /dev/null +++ b/cmd/lachesis/export_evm_history.go @@ -0,0 +1,69 @@ +package main + +import ( + "compress/gzip" + "io" + "os" + "strings" + + "github.com/Fantom-foundation/lachesis-base/common/bigendian" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "gopkg.in/urfave/cli.v1" +) + +func WriteDB(writer io.Writer, db ethdb.Iteratee) error { + it := db.NewIterator(nil, nil) + defer it.Release() + for it.Next() { + _, err := writer.Write(bigendian.Uint32ToBytes(uint32(len(it.Key())))) + if err != nil { + return err + } + _, err = writer.Write(it.Key()) + if err != nil { + return err + } + _, err = writer.Write(bigendian.Uint32ToBytes(uint32(len(it.Value())))) + if err != nil { + return err + } + _, err = writer.Write(it.Value()) + if err != nil { + return err + } + } + return nil +} + +func exportEvmStorage(ctx *cli.Context) error { + if len(ctx.Args()) != 1 { + utils.Fatalf("This command requires one argument.") + } + + cfg := makeAllConfigs(ctx) + + gdb, _ := makeStores(cfg.Node.DataDir, &cfg.Lachesis) + defer gdb.Close() + + fn := ctx.Args().First() + + // Open the file handle and potentially wrap with a gzip stream + fh, err := os.OpenFile(fn, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) + if err != nil { + return err + } + defer fh.Close() + + var writer io.Writer = fh + if strings.HasSuffix(fn, ".gz") { + writer = gzip.NewWriter(writer) + defer writer.(*gzip.Writer).Close() + } + + log.Info("Exporting EVM storage to file", "file", fn) + defer log.Info("Exported EVM storage to file", "file", fn) + + return WriteDB(writer, gdb.App().EvmTable()) +}