Browse Source

Merge pull request #14889 from karalabe/ethash-cache-on-import

cmd: add makecache cmd, use caches during import cmd
Péter Szilágyi 8 years ago
parent
commit
8b84bd283f
3 changed files with 42 additions and 27 deletions
  1. 1 0
      cmd/geth/main.go
  2. 37 26
      cmd/geth/misccmd.go
  3. 4 1
      cmd/utils/flags.go

+ 1 - 0
cmd/geth/main.go

@@ -157,6 +157,7 @@ func init() {
 		attachCommand,
 		attachCommand,
 		javascriptCommand,
 		javascriptCommand,
 		// See misccmd.go:
 		// See misccmd.go:
+		makecacheCommand,
 		makedagCommand,
 		makedagCommand,
 		versionCommand,
 		versionCommand,
 		bugCommand,
 		bugCommand,

+ 37 - 26
cmd/geth/misccmd.go

@@ -18,9 +18,7 @@ package main
 
 
 import (
 import (
 	"fmt"
 	"fmt"
-	"io/ioutil"
 	"os"
 	"os"
-	"path/filepath"
 	"runtime"
 	"runtime"
 	"strconv"
 	"strconv"
 	"strings"
 	"strings"
@@ -33,14 +31,27 @@ import (
 )
 )
 
 
 var (
 var (
+	makecacheCommand = cli.Command{
+		Action:    utils.MigrateFlags(makecache),
+		Name:      "makecache",
+		Usage:     "Generate ethash verification cache (for testing)",
+		ArgsUsage: "<blockNum> <outputDir>",
+		Category:  "MISCELLANEOUS COMMANDS",
+		Description: `
+The makecache command generates an ethash cache in <outputDir>.
+
+This command exists to support the system testing project.
+Regular users do not need to execute it.
+`,
+	}
 	makedagCommand = cli.Command{
 	makedagCommand = cli.Command{
 		Action:    utils.MigrateFlags(makedag),
 		Action:    utils.MigrateFlags(makedag),
 		Name:      "makedag",
 		Name:      "makedag",
-		Usage:     "Generate ethash DAG (for testing)",
+		Usage:     "Generate ethash mining DAG (for testing)",
 		ArgsUsage: "<blockNum> <outputDir>",
 		ArgsUsage: "<blockNum> <outputDir>",
 		Category:  "MISCELLANEOUS COMMANDS",
 		Category:  "MISCELLANEOUS COMMANDS",
 		Description: `
 		Description: `
-The makedag command generates an ethash DAG in /tmp/dag.
+The makedag command generates an ethash DAG in <outputDir>.
 
 
 This command exists to support the system testing project.
 This command exists to support the system testing project.
 Regular users do not need to execute it.
 Regular users do not need to execute it.
@@ -65,33 +76,33 @@ The output of this command is supposed to be machine-readable.
 	}
 	}
 )
 )
 
 
+// makecache generates an ethash verification cache into the provided folder.
+func makecache(ctx *cli.Context) error {
+	args := ctx.Args()
+	if len(args) != 2 {
+		utils.Fatalf(`Usage: geth makecache <block number> <outputdir>`)
+	}
+	block, err := strconv.ParseUint(args[0], 0, 64)
+	if err != nil {
+		utils.Fatalf("Invalid block number: %v", err)
+	}
+	ethash.MakeCache(block, args[1])
+
+	return nil
+}
+
+// makedag generates an ethash mining DAG into the provided folder.
 func makedag(ctx *cli.Context) error {
 func makedag(ctx *cli.Context) error {
 	args := ctx.Args()
 	args := ctx.Args()
-	wrongArgs := func() {
+	if len(args) != 2 {
 		utils.Fatalf(`Usage: geth makedag <block number> <outputdir>`)
 		utils.Fatalf(`Usage: geth makedag <block number> <outputdir>`)
 	}
 	}
-	switch {
-	case len(args) == 2:
-		blockNum, err := strconv.ParseUint(args[0], 0, 64)
-		dir := args[1]
-		if err != nil {
-			wrongArgs()
-		} else {
-			dir = filepath.Clean(dir)
-			// seems to require a trailing slash
-			if !strings.HasSuffix(dir, "/") {
-				dir = dir + "/"
-			}
-			_, err = ioutil.ReadDir(dir)
-			if err != nil {
-				utils.Fatalf("Can't find dir")
-			}
-			fmt.Println("making DAG, this could take awhile...")
-			ethash.MakeDataset(blockNum, dir)
-		}
-	default:
-		wrongArgs()
+	block, err := strconv.ParseUint(args[0], 0, 64)
+	if err != nil {
+		utils.Fatalf("Invalid block number: %v", err)
 	}
 	}
+	ethash.MakeDataset(block, args[1])
+
 	return nil
 	return nil
 }
 }
 
 

+ 4 - 1
cmd/utils/flags.go

@@ -1093,7 +1093,10 @@ func MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chai
 
 
 	engine := ethash.NewFaker()
 	engine := ethash.NewFaker()
 	if !ctx.GlobalBool(FakePoWFlag.Name) {
 	if !ctx.GlobalBool(FakePoWFlag.Name) {
-		engine = ethash.New("", 1, 0, "", 1, 0)
+		engine = ethash.New(
+			stack.ResolvePath(eth.DefaultConfig.EthashCacheDir), eth.DefaultConfig.EthashCachesInMem, eth.DefaultConfig.EthashCachesOnDisk,
+			stack.ResolvePath(eth.DefaultConfig.EthashDatasetDir), eth.DefaultConfig.EthashDatasetsInMem, eth.DefaultConfig.EthashDatasetsOnDisk,
+		)
 	}
 	}
 	config, _, err := core.SetupGenesisBlock(chainDb, MakeGenesis(ctx))
 	config, _, err := core.SetupGenesisBlock(chainDb, MakeGenesis(ctx))
 	if err != nil {
 	if err != nil {