cmd/geth: move blockchain commands to chaincmd.go
This commit is contained in:
parent
62671c93c4
commit
651030c98d
@ -12,7 +12,7 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/tests"
|
"github.com/ethereum/go-ethereum/tests"
|
||||||
)
|
)
|
||||||
|
|
||||||
var blocktestCmd = cli.Command{
|
var blocktestCommand = cli.Command{
|
||||||
Action: runBlockTest,
|
Action: runBlockTest,
|
||||||
Name: "blocktest",
|
Name: "blocktest",
|
||||||
Usage: `loads a block test file`,
|
Usage: `loads a block test file`,
|
159
cmd/geth/chaincmd.go
Normal file
159
cmd/geth/chaincmd.go
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/codegangsta/cli"
|
||||||
|
"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/logger/glog"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
importCommand = cli.Command{
|
||||||
|
Action: importChain,
|
||||||
|
Name: "import",
|
||||||
|
Usage: `import a blockchain file`,
|
||||||
|
}
|
||||||
|
exportCommand = cli.Command{
|
||||||
|
Action: exportChain,
|
||||||
|
Name: "export",
|
||||||
|
Usage: `export blockchain into file`,
|
||||||
|
}
|
||||||
|
upgradedbCommand = cli.Command{
|
||||||
|
Action: upgradeDB,
|
||||||
|
Name: "upgradedb",
|
||||||
|
Usage: "upgrade chainblock database",
|
||||||
|
}
|
||||||
|
removedbCommand = cli.Command{
|
||||||
|
Action: removeDB,
|
||||||
|
Name: "removedb",
|
||||||
|
Usage: "Remove blockchain and state databases",
|
||||||
|
}
|
||||||
|
dumpCommand = cli.Command{
|
||||||
|
Action: dump,
|
||||||
|
Name: "dump",
|
||||||
|
Usage: `dump a specific block from storage`,
|
||||||
|
Description: `
|
||||||
|
The arguments are interpreted as block numbers or hashes.
|
||||||
|
Use "ethereum dump 0" to dump the genesis block.
|
||||||
|
`,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func importChain(ctx *cli.Context) {
|
||||||
|
if len(ctx.Args()) != 1 {
|
||||||
|
utils.Fatalf("This command requires an argument.")
|
||||||
|
}
|
||||||
|
chain, blockDB, stateDB, extraDB := utils.GetChain(ctx)
|
||||||
|
start := time.Now()
|
||||||
|
if err := utils.ImportChain(chain, ctx.Args().First()); err != nil {
|
||||||
|
utils.Fatalf("Import error: %v\n", err)
|
||||||
|
}
|
||||||
|
flushAll(blockDB, stateDB, extraDB)
|
||||||
|
fmt.Printf("Import done in %v", time.Since(start))
|
||||||
|
}
|
||||||
|
|
||||||
|
func exportChain(ctx *cli.Context) {
|
||||||
|
if len(ctx.Args()) != 1 {
|
||||||
|
utils.Fatalf("This command requires an argument.")
|
||||||
|
}
|
||||||
|
chain, _, _, _ := utils.GetChain(ctx)
|
||||||
|
start := time.Now()
|
||||||
|
if err := utils.ExportChain(chain, ctx.Args().First()); err != nil {
|
||||||
|
utils.Fatalf("Export error: %v\n", err)
|
||||||
|
}
|
||||||
|
fmt.Printf("Export done in %v", time.Since(start))
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeDB(ctx *cli.Context) {
|
||||||
|
confirm, err := utils.PromptConfirm("Remove local databases?")
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if confirm {
|
||||||
|
fmt.Println("Removing chain and state databases...")
|
||||||
|
start := time.Now()
|
||||||
|
|
||||||
|
os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "blockchain"))
|
||||||
|
os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "state"))
|
||||||
|
|
||||||
|
fmt.Printf("Removed in %v\n", time.Since(start))
|
||||||
|
} else {
|
||||||
|
fmt.Println("Operation aborted")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func upgradeDB(ctx *cli.Context) {
|
||||||
|
glog.Infoln("Upgrading blockchain database")
|
||||||
|
|
||||||
|
chain, blockDB, stateDB, extraDB := utils.GetChain(ctx)
|
||||||
|
v, _ := blockDB.Get([]byte("BlockchainVersion"))
|
||||||
|
bcVersion := int(common.NewValue(v).Uint())
|
||||||
|
if bcVersion == 0 {
|
||||||
|
bcVersion = core.BlockChainVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
// Export the current chain.
|
||||||
|
filename := fmt.Sprintf("blockchain_%d_%s.chain", bcVersion, time.Now().Format("20060102_150405"))
|
||||||
|
exportFile := filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), filename)
|
||||||
|
if err := utils.ExportChain(chain, exportFile); err != nil {
|
||||||
|
utils.Fatalf("Unable to export chain for reimport %s\n", err)
|
||||||
|
}
|
||||||
|
flushAll(blockDB, stateDB, extraDB)
|
||||||
|
os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "blockchain"))
|
||||||
|
os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "state"))
|
||||||
|
|
||||||
|
// Import the chain file.
|
||||||
|
chain, blockDB, stateDB, extraDB = utils.GetChain(ctx)
|
||||||
|
blockDB.Put([]byte("BlockchainVersion"), common.NewValue(core.BlockChainVersion).Bytes())
|
||||||
|
err := utils.ImportChain(chain, exportFile)
|
||||||
|
flushAll(blockDB, stateDB, extraDB)
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("Import error %v (a backup is made in %s, use the import command to import it)\n", err, exportFile)
|
||||||
|
} else {
|
||||||
|
os.Remove(exportFile)
|
||||||
|
glog.Infoln("Import finished")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func dump(ctx *cli.Context) {
|
||||||
|
chain, _, stateDB, _ := utils.GetChain(ctx)
|
||||||
|
for _, arg := range ctx.Args() {
|
||||||
|
var block *types.Block
|
||||||
|
if hashish(arg) {
|
||||||
|
block = chain.GetBlock(common.HexToHash(arg))
|
||||||
|
} else {
|
||||||
|
num, _ := strconv.Atoi(arg)
|
||||||
|
block = chain.GetBlockByNumber(uint64(num))
|
||||||
|
}
|
||||||
|
if block == nil {
|
||||||
|
fmt.Println("{}")
|
||||||
|
utils.Fatalf("block not found")
|
||||||
|
} else {
|
||||||
|
state := state.New(block.Root(), stateDB)
|
||||||
|
fmt.Printf("%s\n", state.Dump())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// hashish returns true for strings that look like hashes.
|
||||||
|
func hashish(x string) bool {
|
||||||
|
_, err := strconv.Atoi(x)
|
||||||
|
return err != nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func flushAll(dbs ...common.Database) {
|
||||||
|
for _, db := range dbs {
|
||||||
|
db.Flush()
|
||||||
|
db.Close()
|
||||||
|
}
|
||||||
|
}
|
153
cmd/geth/main.go
153
cmd/geth/main.go
@ -24,28 +24,23 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
_ "net/http/pprof"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
"github.com/codegangsta/cli"
|
||||||
"github.com/ethereum/ethash"
|
"github.com/ethereum/ethash"
|
||||||
"github.com/ethereum/go-ethereum/accounts"
|
"github.com/ethereum/go-ethereum/accounts"
|
||||||
"github.com/ethereum/go-ethereum/cmd/utils"
|
"github.com/ethereum/go-ethereum/cmd/utils"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"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/eth"
|
||||||
"github.com/ethereum/go-ethereum/logger"
|
"github.com/ethereum/go-ethereum/logger"
|
||||||
"github.com/ethereum/go-ethereum/logger/glog"
|
|
||||||
"github.com/mattn/go-colorable"
|
"github.com/mattn/go-colorable"
|
||||||
"github.com/mattn/go-isatty"
|
"github.com/mattn/go-isatty"
|
||||||
)
|
)
|
||||||
import _ "net/http/pprof"
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
ClientIdentifier = "Geth"
|
ClientIdentifier = "Geth"
|
||||||
@ -69,7 +64,12 @@ func init() {
|
|||||||
app.Action = run
|
app.Action = run
|
||||||
app.HideVersion = true // we have a command to print the version
|
app.HideVersion = true // we have a command to print the version
|
||||||
app.Commands = []cli.Command{
|
app.Commands = []cli.Command{
|
||||||
blocktestCmd,
|
blocktestCommand,
|
||||||
|
importCommand,
|
||||||
|
exportCommand,
|
||||||
|
upgradedbCommand,
|
||||||
|
removedbCommand,
|
||||||
|
dumpCommand,
|
||||||
{
|
{
|
||||||
Action: makedag,
|
Action: makedag,
|
||||||
Name: "makedag",
|
Name: "makedag",
|
||||||
@ -194,15 +194,6 @@ nodes.
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
Action: dump,
|
|
||||||
Name: "dump",
|
|
||||||
Usage: `dump a specific block from storage`,
|
|
||||||
Description: `
|
|
||||||
The arguments are interpreted as block numbers or hashes.
|
|
||||||
Use "ethereum dump 0" to dump the genesis block.
|
|
||||||
`,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
Action: console,
|
Action: console,
|
||||||
Name: "console",
|
Name: "console",
|
||||||
@ -222,26 +213,6 @@ The JavaScript VM exposes a node admin interface as well as the Ðapp
|
|||||||
JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Console
|
JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Console
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
Action: importchain,
|
|
||||||
Name: "import",
|
|
||||||
Usage: `import a blockchain file`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Action: exportchain,
|
|
||||||
Name: "export",
|
|
||||||
Usage: `export blockchain into file`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Action: upgradeDb,
|
|
||||||
Name: "upgradedb",
|
|
||||||
Usage: "upgrade chainblock database",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Action: removeDb,
|
|
||||||
Name: "removedb",
|
|
||||||
Usage: "Remove blockchain and state databases",
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
app.Flags = []cli.Flag{
|
app.Flags = []cli.Flag{
|
||||||
utils.IdentityFlag,
|
utils.IdentityFlag,
|
||||||
@ -508,103 +479,6 @@ func accountImport(ctx *cli.Context) {
|
|||||||
fmt.Printf("Address: %x\n", acct)
|
fmt.Printf("Address: %x\n", acct)
|
||||||
}
|
}
|
||||||
|
|
||||||
func importchain(ctx *cli.Context) {
|
|
||||||
if len(ctx.Args()) != 1 {
|
|
||||||
utils.Fatalf("This command requires an argument.")
|
|
||||||
}
|
|
||||||
chain, blockDB, stateDB, extraDB := utils.GetChain(ctx)
|
|
||||||
start := time.Now()
|
|
||||||
if err := utils.ImportChain(chain, ctx.Args().First()); err != nil {
|
|
||||||
utils.Fatalf("Import error: %v\n", err)
|
|
||||||
}
|
|
||||||
flushAll(blockDB, stateDB, extraDB)
|
|
||||||
fmt.Printf("Import done in %v", time.Since(start))
|
|
||||||
}
|
|
||||||
|
|
||||||
func exportchain(ctx *cli.Context) {
|
|
||||||
if len(ctx.Args()) != 1 {
|
|
||||||
utils.Fatalf("This command requires an argument.")
|
|
||||||
}
|
|
||||||
chain, _, _, _ := utils.GetChain(ctx)
|
|
||||||
start := time.Now()
|
|
||||||
if err := utils.ExportChain(chain, ctx.Args().First()); err != nil {
|
|
||||||
utils.Fatalf("Export error: %v\n", err)
|
|
||||||
}
|
|
||||||
fmt.Printf("Export done in %v", time.Since(start))
|
|
||||||
}
|
|
||||||
|
|
||||||
func removeDb(ctx *cli.Context) {
|
|
||||||
confirm, err := utils.PromptConfirm("Remove local databases?")
|
|
||||||
if err != nil {
|
|
||||||
utils.Fatalf("%v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if confirm {
|
|
||||||
fmt.Println("Removing chain and state databases...")
|
|
||||||
start := time.Now()
|
|
||||||
|
|
||||||
os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "blockchain"))
|
|
||||||
os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "state"))
|
|
||||||
|
|
||||||
fmt.Printf("Removed in %v\n", time.Since(start))
|
|
||||||
} else {
|
|
||||||
fmt.Println("Operation aborted")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func upgradeDb(ctx *cli.Context) {
|
|
||||||
glog.Infoln("Upgrading blockchain database")
|
|
||||||
|
|
||||||
chain, blockDB, stateDB, extraDB := utils.GetChain(ctx)
|
|
||||||
v, _ := blockDB.Get([]byte("BlockchainVersion"))
|
|
||||||
bcVersion := int(common.NewValue(v).Uint())
|
|
||||||
if bcVersion == 0 {
|
|
||||||
bcVersion = core.BlockChainVersion
|
|
||||||
}
|
|
||||||
|
|
||||||
// Export the current chain.
|
|
||||||
filename := fmt.Sprintf("blockchain_%d_%s.chain", bcVersion, time.Now().Format("20060102_150405"))
|
|
||||||
exportFile := filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), filename)
|
|
||||||
if err := utils.ExportChain(chain, exportFile); err != nil {
|
|
||||||
utils.Fatalf("Unable to export chain for reimport %s\n", err)
|
|
||||||
}
|
|
||||||
flushAll(blockDB, stateDB, extraDB)
|
|
||||||
os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "blockchain"))
|
|
||||||
os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "state"))
|
|
||||||
|
|
||||||
// Import the chain file.
|
|
||||||
chain, blockDB, stateDB, extraDB = utils.GetChain(ctx)
|
|
||||||
blockDB.Put([]byte("BlockchainVersion"), common.NewValue(core.BlockChainVersion).Bytes())
|
|
||||||
err := utils.ImportChain(chain, exportFile)
|
|
||||||
flushAll(blockDB, stateDB, extraDB)
|
|
||||||
if err != nil {
|
|
||||||
utils.Fatalf("Import error %v (a backup is made in %s, use the import command to import it)\n", err, exportFile)
|
|
||||||
} else {
|
|
||||||
os.Remove(exportFile)
|
|
||||||
glog.Infoln("Import finished")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(ctx *cli.Context) {
|
|
||||||
chain, _, stateDB, _ := utils.GetChain(ctx)
|
|
||||||
for _, arg := range ctx.Args() {
|
|
||||||
var block *types.Block
|
|
||||||
if hashish(arg) {
|
|
||||||
block = chain.GetBlock(common.HexToHash(arg))
|
|
||||||
} else {
|
|
||||||
num, _ := strconv.Atoi(arg)
|
|
||||||
block = chain.GetBlockByNumber(uint64(num))
|
|
||||||
}
|
|
||||||
if block == nil {
|
|
||||||
fmt.Println("{}")
|
|
||||||
utils.Fatalf("block not found")
|
|
||||||
} else {
|
|
||||||
state := state.New(block.Root(), stateDB)
|
|
||||||
fmt.Printf("%s\n", state.Dump())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func makedag(ctx *cli.Context) {
|
func makedag(ctx *cli.Context) {
|
||||||
args := ctx.Args()
|
args := ctx.Args()
|
||||||
wrongArgs := func() {
|
wrongArgs := func() {
|
||||||
@ -647,16 +521,3 @@ func version(c *cli.Context) {
|
|||||||
fmt.Printf("GOPATH=%s\n", os.Getenv("GOPATH"))
|
fmt.Printf("GOPATH=%s\n", os.Getenv("GOPATH"))
|
||||||
fmt.Printf("GOROOT=%s\n", runtime.GOROOT())
|
fmt.Printf("GOROOT=%s\n", runtime.GOROOT())
|
||||||
}
|
}
|
||||||
|
|
||||||
// hashish returns true for strings that look like hashes.
|
|
||||||
func hashish(x string) bool {
|
|
||||||
_, err := strconv.Atoi(x)
|
|
||||||
return err != nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func flushAll(dbs ...common.Database) {
|
|
||||||
for _, db := range dbs {
|
|
||||||
db.Flush()
|
|
||||||
db.Close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user