|
|
|
@ -34,11 +34,13 @@ import ( |
|
|
|
|
"github.com/ethereum/go-ethereum/accounts" |
|
|
|
|
"github.com/ethereum/go-ethereum/cmd/utils" |
|
|
|
|
"github.com/ethereum/go-ethereum/common" |
|
|
|
|
"github.com/ethereum/go-ethereum/core" |
|
|
|
|
"github.com/ethereum/go-ethereum/core/state" |
|
|
|
|
"github.com/ethereum/go-ethereum/core/types" |
|
|
|
|
"github.com/ethereum/go-ethereum/eth" |
|
|
|
|
"github.com/ethereum/go-ethereum/logger" |
|
|
|
|
"github.com/peterh/liner" |
|
|
|
|
"path" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
const ( |
|
|
|
@ -205,12 +207,18 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso |
|
|
|
|
Name: "export", |
|
|
|
|
Usage: `export blockchain into file`, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
Action: upgradeDb, |
|
|
|
|
Name: "upgradedb", |
|
|
|
|
Usage: "upgrade chainblock database", |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
app.Flags = []cli.Flag{ |
|
|
|
|
utils.UnlockedAccountFlag, |
|
|
|
|
utils.PasswordFileFlag, |
|
|
|
|
utils.BootnodesFlag, |
|
|
|
|
utils.DataDirFlag, |
|
|
|
|
utils.BlockchainVersionFlag, |
|
|
|
|
utils.JSpathFlag, |
|
|
|
|
utils.ListenPortFlag, |
|
|
|
|
utils.MaxPeersFlag, |
|
|
|
@ -429,13 +437,29 @@ func importchain(ctx *cli.Context) { |
|
|
|
|
if len(ctx.Args()) != 1 { |
|
|
|
|
utils.Fatalf("This command requires an argument.") |
|
|
|
|
} |
|
|
|
|
chainmgr, _, _ := utils.GetChain(ctx) |
|
|
|
|
|
|
|
|
|
cfg := utils.MakeEthConfig(ClientIdentifier, Version, ctx) |
|
|
|
|
cfg.SkipBcVersionCheck = true |
|
|
|
|
|
|
|
|
|
ethereum, err := eth.New(cfg) |
|
|
|
|
if err != nil { |
|
|
|
|
utils.Fatalf("%v\n", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
chainmgr := ethereum.ChainManager() |
|
|
|
|
start := time.Now() |
|
|
|
|
err := utils.ImportChain(chainmgr, ctx.Args().First()) |
|
|
|
|
err = utils.ImportChain(chainmgr, ctx.Args().First()) |
|
|
|
|
if err != nil { |
|
|
|
|
utils.Fatalf("Import error: %v\n", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// force database flush
|
|
|
|
|
ethereum.BlockDb().Close() |
|
|
|
|
ethereum.StateDb().Close() |
|
|
|
|
ethereum.ExtraDb().Close() |
|
|
|
|
|
|
|
|
|
fmt.Printf("Import done in %v", time.Since(start)) |
|
|
|
|
|
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -443,9 +467,18 @@ func exportchain(ctx *cli.Context) { |
|
|
|
|
if len(ctx.Args()) != 1 { |
|
|
|
|
utils.Fatalf("This command requires an argument.") |
|
|
|
|
} |
|
|
|
|
chainmgr, _, _ := utils.GetChain(ctx) |
|
|
|
|
|
|
|
|
|
cfg := utils.MakeEthConfig(ClientIdentifier, Version, ctx) |
|
|
|
|
cfg.SkipBcVersionCheck = true |
|
|
|
|
|
|
|
|
|
ethereum, err := eth.New(cfg) |
|
|
|
|
if err != nil { |
|
|
|
|
utils.Fatalf("%v\n", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
chainmgr := ethereum.ChainManager() |
|
|
|
|
start := time.Now() |
|
|
|
|
err := utils.ExportChain(chainmgr, ctx.Args().First()) |
|
|
|
|
err = utils.ExportChain(chainmgr, ctx.Args().First()) |
|
|
|
|
if err != nil { |
|
|
|
|
utils.Fatalf("Export error: %v\n", err) |
|
|
|
|
} |
|
|
|
@ -453,6 +486,60 @@ func exportchain(ctx *cli.Context) { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func upgradeDb(ctx *cli.Context) { |
|
|
|
|
fmt.Println("Upgrade blockchain DB") |
|
|
|
|
|
|
|
|
|
cfg := utils.MakeEthConfig(ClientIdentifier, Version, ctx) |
|
|
|
|
cfg.SkipBcVersionCheck = true |
|
|
|
|
|
|
|
|
|
ethereum, err := eth.New(cfg) |
|
|
|
|
if err != nil { |
|
|
|
|
utils.Fatalf("%v\n", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
v, _ := ethereum.BlockDb().Get([]byte("BlockchainVersion")) |
|
|
|
|
bcVersion := int(common.NewValue(v).Uint()) |
|
|
|
|
|
|
|
|
|
if bcVersion == 0 { |
|
|
|
|
bcVersion = core.BlockChainVersion |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
filename := fmt.Sprintf("blockchain_%d_%s.chain", bcVersion, time.Now().Format("2006-01-02_15:04:05")) |
|
|
|
|
exportFile := path.Join(ctx.GlobalString(utils.DataDirFlag.Name), filename) |
|
|
|
|
|
|
|
|
|
err = utils.ExportChain(ethereum.ChainManager(), exportFile) |
|
|
|
|
if err != nil { |
|
|
|
|
utils.Fatalf("Unable to export chain for reimport %s\n", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ethereum.BlockDb().Close() |
|
|
|
|
ethereum.StateDb().Close() |
|
|
|
|
ethereum.ExtraDb().Close() |
|
|
|
|
|
|
|
|
|
os.RemoveAll(path.Join(ctx.GlobalString(utils.DataDirFlag.Name), "blockchain")) |
|
|
|
|
|
|
|
|
|
ethereum, err = eth.New(cfg) |
|
|
|
|
if err != nil { |
|
|
|
|
utils.Fatalf("%v\n", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ethereum.BlockDb().Put([]byte("BlockchainVersion"), common.NewValue(core.BlockChainVersion).Bytes()) |
|
|
|
|
|
|
|
|
|
err = utils.ImportChain(ethereum.ChainManager(), exportFile) |
|
|
|
|
if err != nil { |
|
|
|
|
utils.Fatalf("Import error %v (a backup is made in %s, use the import command to import it)\n", err, exportFile) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// force database flush
|
|
|
|
|
ethereum.BlockDb().Close() |
|
|
|
|
ethereum.StateDb().Close() |
|
|
|
|
ethereum.ExtraDb().Close() |
|
|
|
|
|
|
|
|
|
os.Remove(exportFile) |
|
|
|
|
|
|
|
|
|
fmt.Println("Import finished") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func dump(ctx *cli.Context) { |
|
|
|
|
chainmgr, _, stateDb := utils.GetChain(ctx) |
|
|
|
|
for _, arg := range ctx.Args() { |
|
|
|
|