aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-08-06 15:53:12 +0800
committerobscuren <geffobscura@gmail.com>2014-08-06 15:53:12 +0800
commit852d1ee395feabaa0e72265106374a0df197db9a (patch)
tree2700d53ad6d5d415e2d91c7b71b1e23ba95e4602
parent3c319f93f2a0e66bc131cfa1e81be840b3242182 (diff)
downloaddexon-852d1ee395feabaa0e72265106374a0df197db9a.tar.gz
dexon-852d1ee395feabaa0e72265106374a0df197db9a.tar.zst
dexon-852d1ee395feabaa0e72265106374a0df197db9a.zip
State dumps
-rw-r--r--ethereum/flags.go10
-rw-r--r--ethereum/main.go31
-rw-r--r--ethereum/repl/javascript_runtime.go41
3 files changed, 76 insertions, 6 deletions
diff --git a/ethereum/flags.go b/ethereum/flags.go
index 4f59ddf06..5ed208411 100644
--- a/ethereum/flags.go
+++ b/ethereum/flags.go
@@ -3,10 +3,11 @@ package main
import (
"flag"
"fmt"
- "github.com/ethereum/eth-go/ethlog"
"os"
"os/user"
"path"
+
+ "github.com/ethereum/eth-go/ethlog"
)
var Identifier string
@@ -31,6 +32,9 @@ var LogFile string
var ConfigFile string
var DebugFile string
var LogLevel int
+var Dump bool
+var DumpHash string
+var DumpNumber int
// flags specific to cli client
var StartMining bool
@@ -71,6 +75,10 @@ func Init() {
flag.BoolVar(&DiffTool, "difftool", false, "creates output for diff'ing. Sets LogLevel=0")
flag.StringVar(&DiffType, "diff", "all", "sets the level of diff output [vm, all]. Has no effect if difftool=false")
+ flag.BoolVar(&Dump, "dump", false, "output the ethereum state in JSON format. Sub args [number, hash]")
+ flag.StringVar(&DumpHash, "hash", "", "specify arg in hex")
+ flag.IntVar(&DumpNumber, "number", -1, "specify arg in number")
+
flag.BoolVar(&StartMining, "mine", false, "start dagger mining")
flag.BoolVar(&StartJsConsole, "js", false, "launches javascript console")
diff --git a/ethereum/main.go b/ethereum/main.go
index 9ece8133d..17838997c 100644
--- a/ethereum/main.go
+++ b/ethereum/main.go
@@ -1,8 +1,11 @@
package main
import (
+ "fmt"
+ "os"
"runtime"
+ "github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/go-ethereum/utils"
@@ -24,7 +27,7 @@ func main() {
Init() // parsing command line
// If the difftool option is selected ignore all other log output
- if DiffTool {
+ if DiffTool || Dump {
LogLevel = 0
}
@@ -47,6 +50,32 @@ func main() {
ethereum := utils.NewEthereum(db, clientIdentity, keyManager, UseUPnP, OutboundPort, MaxPeer)
+ if Dump {
+ var block *ethchain.Block
+
+ if len(DumpHash) == 0 && DumpNumber == -1 {
+ block = ethereum.BlockChain().CurrentBlock
+ } else if len(DumpHash) > 0 {
+ block = ethereum.BlockChain().GetBlock(ethutil.Hex2Bytes(DumpHash))
+ } else {
+ block = ethereum.BlockChain().GetBlockByNumber(uint64(DumpNumber))
+ }
+
+ if block == nil {
+ fmt.Fprintln(os.Stderr, "block not found")
+
+ // We want to output valid JSON
+ fmt.Println("{}")
+
+ os.Exit(1)
+ }
+
+ // Leave the Println. This needs clean output for piping
+ fmt.Println(block.State().Dump())
+
+ os.Exit(0)
+ }
+
if ShowGenesis {
utils.ShowGenesis(ethereum)
}
diff --git a/ethereum/repl/javascript_runtime.go b/ethereum/repl/javascript_runtime.go
index f5aea2dd9..29b5f442f 100644
--- a/ethereum/repl/javascript_runtime.go
+++ b/ethereum/repl/javascript_runtime.go
@@ -2,6 +2,11 @@ package ethrepl
import (
"fmt"
+ "io/ioutil"
+ "os"
+ "path"
+ "path/filepath"
+
"github.com/ethereum/eth-go"
"github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethlog"
@@ -11,10 +16,6 @@ import (
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/go-ethereum/utils"
"github.com/obscuren/otto"
- "io/ioutil"
- "os"
- "path"
- "path/filepath"
)
var jsrelogger = ethlog.NewLogger("JSRE")
@@ -147,12 +148,44 @@ func (self *JSRE) initStdFuncs() {
eth.Set("stopMining", self.stopMining)
eth.Set("startMining", self.startMining)
eth.Set("execBlock", self.execBlock)
+ eth.Set("dump", self.dump)
}
/*
* The following methods are natively implemented javascript functions
*/
+func (self *JSRE) dump(call otto.FunctionCall) otto.Value {
+ var state *ethstate.State
+
+ if len(call.ArgumentList) > 0 {
+ var block *ethchain.Block
+ if call.Argument(0).IsNumber() {
+ num, _ := call.Argument(0).ToInteger()
+ block = self.ethereum.BlockChain().GetBlockByNumber(uint64(num))
+ } else if call.Argument(0).IsString() {
+ hash, _ := call.Argument(0).ToString()
+ block = self.ethereum.BlockChain().GetBlock(ethutil.Hex2Bytes(hash))
+ } else {
+ fmt.Println("invalid argument for dump. Either hex string or number")
+ }
+
+ if block == nil {
+ fmt.Println("block not found")
+
+ return otto.UndefinedValue()
+ }
+
+ state = block.State()
+ } else {
+ state = self.ethereum.StateManager().CurrentState()
+ }
+
+ fmt.Println(state.Dump())
+
+ return otto.UndefinedValue()
+}
+
func (self *JSRE) stopMining(call otto.FunctionCall) otto.Value {
v, _ := self.vm.ToValue(utils.StopMining(self.ethereum))
return v