aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2015-03-23 23:47:05 +0800
committerobscuren <geffobscura@gmail.com>2015-03-23 23:47:05 +0800
commit211cb03f83c8bdfd29af31fd27dc531dfcb13630 (patch)
tree7c1296a6194db41a8d8b25a89dd7aa442d6b4fe5
parent253ecdc8bba1b522e80fdee69410854f19a5a972 (diff)
parent9562a9840f783e6252ebc6fb8da62b81004f62e8 (diff)
downloadgo-tangerine-211cb03f83c8bdfd29af31fd27dc531dfcb13630.tar
go-tangerine-211cb03f83c8bdfd29af31fd27dc531dfcb13630.tar.gz
go-tangerine-211cb03f83c8bdfd29af31fd27dc531dfcb13630.tar.bz2
go-tangerine-211cb03f83c8bdfd29af31fd27dc531dfcb13630.tar.lz
go-tangerine-211cb03f83c8bdfd29af31fd27dc531dfcb13630.tar.xz
go-tangerine-211cb03f83c8bdfd29af31fd27dc531dfcb13630.tar.zst
go-tangerine-211cb03f83c8bdfd29af31fd27dc531dfcb13630.zip
Merge branch 'develop' of github.com-obscure:ethereum/go-ethereum into develop
-rw-r--r--cmd/ethereum/blocktest.go28
-rw-r--r--cmd/ethtest/main.go2
-rw-r--r--cmd/utils/flags.go2
-rw-r--r--core/chain_manager.go6
-rw-r--r--rpc/args.go16
-rw-r--r--tests/blocktest.go33
-rw-r--r--xeth/xeth.go15
7 files changed, 78 insertions, 24 deletions
diff --git a/cmd/ethereum/blocktest.go b/cmd/ethereum/blocktest.go
index e6d701d2c..d9cdfa83f 100644
--- a/cmd/ethereum/blocktest.go
+++ b/cmd/ethereum/blocktest.go
@@ -5,9 +5,9 @@ import (
"github.com/codegangsta/cli"
"github.com/ethereum/go-ethereum/cmd/utils"
+ "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/eth"
"github.com/ethereum/go-ethereum/ethdb"
- "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/tests"
)
@@ -26,10 +26,10 @@ be able to interact with the chain defined by the test.
}
func runblocktest(ctx *cli.Context) {
- if len(ctx.Args()) != 2 {
- utils.Fatalf("This command requires two arguments.")
+ if len(ctx.Args()) != 3 {
+ utils.Fatalf("Usage: ethereum blocktest <path-to-test-file> <test-name> {rpc, norpc}")
}
- file, testname := ctx.Args()[0], ctx.Args()[1]
+ file, testname, startrpc := ctx.Args()[0], ctx.Args()[1], ctx.Args()[2]
bt, err := tests.LoadBlockTests(file)
if err != nil {
@@ -42,6 +42,7 @@ func runblocktest(ctx *cli.Context) {
cfg := utils.MakeEthConfig(ClientIdentifier, Version, ctx)
cfg.NewDB = func(path string) (common.Database, error) { return ethdb.NewMemDatabase() }
+ cfg.MaxPeers = 0 // disable network
ethereum, err := eth.New(cfg)
if err != nil {
utils.Fatalf("%v", err)
@@ -51,7 +52,8 @@ func runblocktest(ctx *cli.Context) {
ethereum.ResetWithGenesisBlock(test.Genesis)
// import pre accounts
- if err := test.InsertPreState(ethereum.StateDb()); err != nil {
+ statedb, err := test.InsertPreState(ethereum.StateDb())
+ if err != nil {
utils.Fatalf("could not insert genesis accounts: %v", err)
}
@@ -60,7 +62,19 @@ func runblocktest(ctx *cli.Context) {
if err := chain.InsertChain(test.Blocks); err != nil {
utils.Fatalf("Block Test load error: %v", err)
} else {
- fmt.Println("Block Test chain loaded, starting ethereum.")
+ fmt.Println("Block Test chain loaded")
+ }
+
+ if err := test.ValidatePostState(statedb); err != nil {
+ utils.Fatalf("post state validation failed: %v", err)
+ }
+ fmt.Println("Block Test post state validated, starting ethereum.")
+
+ if startrpc == "rpc" {
+ startEth(ctx, ethereum)
+ utils.StartRPC(ethereum, ctx)
+ ethereum.WaitForShutdown()
+ } else {
+ startEth(ctx, ethereum)
}
- startEth(ctx, ethereum)
}
diff --git a/cmd/ethtest/main.go b/cmd/ethtest/main.go
index f2f7d27f3..fdf573fd8 100644
--- a/cmd/ethtest/main.go
+++ b/cmd/ethtest/main.go
@@ -219,7 +219,7 @@ func RunVmTest(r io.Reader) (failed int) {
}
func main() {
- helper.Logger.SetLogLevel(5)
+ //helper.Logger.SetLogLevel(5)
vm.Debug = true
if len(os.Args) > 1 {
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index f87d25ce9..9a4ab5804 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -256,7 +256,7 @@ func StartRPC(eth *eth.Ethereum, ctx *cli.Context) {
addr := ctx.GlobalString(RPCListenAddrFlag.Name)
port := ctx.GlobalInt(RPCPortFlag.Name)
dataDir := ctx.GlobalString(DataDirFlag.Name)
-
+ fmt.Println("Starting RPC on port: ", port)
l, err := net.Listen("tcp", fmt.Sprintf("%s:%d", addr, port))
if err != nil {
Fatalf("Can't listen on %s:%d: %v", addr, port, err)
diff --git a/core/chain_manager.go b/core/chain_manager.go
index 192fa1df0..56ea4de9f 100644
--- a/core/chain_manager.go
+++ b/core/chain_manager.go
@@ -32,8 +32,10 @@ type StateQuery interface {
func CalcDifficulty(block, parent *types.Header) *big.Int {
diff := new(big.Int)
- min := big.NewInt(2048)
- adjust := new(big.Int).Div(parent.Difficulty, min)
+ diffBoundDiv := big.NewInt(2048)
+ min := big.NewInt(131072)
+
+ adjust := new(big.Int).Div(parent.Difficulty, diffBoundDiv)
if (block.Time - parent.Time) < 8 {
diff.Add(parent.Difficulty, adjust)
} else {
diff --git a/rpc/args.go b/rpc/args.go
index 06dab99bc..6e02b65ef 100644
--- a/rpc/args.go
+++ b/rpc/args.go
@@ -8,7 +8,7 @@ import (
"github.com/ethereum/go-ethereum/common"
)
-func blockAge(raw interface{}, number *int64) (err error) {
+func blockHeight(raw interface{}, number *int64) (err error) {
// Parse as integer
num, ok := raw.(float64)
if ok {
@@ -26,7 +26,7 @@ func blockAge(raw interface{}, number *int64) (err error) {
case "latest":
*number = -1
case "pending":
- *number = 0
+ *number = -2
default:
*number = common.String2Big(str).Int64()
}
@@ -137,7 +137,7 @@ func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) {
return NewDecodeParamError(err.Error())
}
- if err := blockAge(raw, &args.BlockNumber); err != nil {
+ if err := blockHeight(raw, &args.BlockNumber); err != nil {
return err
}
}
@@ -174,7 +174,7 @@ func (args *GetStorageArgs) UnmarshalJSON(b []byte) (err error) {
args.Address = addstr
if len(obj) > 1 {
- if err := blockAge(obj[1], &args.BlockNumber); err != nil {
+ if err := blockHeight(obj[1], &args.BlockNumber); err != nil {
return err
}
}
@@ -218,7 +218,7 @@ func (args *GetStorageAtArgs) UnmarshalJSON(b []byte) (err error) {
args.Key = keystr
if len(obj) > 2 {
- if err := blockAge(obj[2], &args.BlockNumber); err != nil {
+ if err := blockHeight(obj[2], &args.BlockNumber); err != nil {
return err
}
}
@@ -259,7 +259,7 @@ func (args *GetTxCountArgs) UnmarshalJSON(b []byte) (err error) {
args.Address = addstr
if len(obj) > 1 {
- if err := blockAge(obj[1], &args.BlockNumber); err != nil {
+ if err := blockHeight(obj[1], &args.BlockNumber); err != nil {
return err
}
}
@@ -296,7 +296,7 @@ func (args *GetBalanceArgs) UnmarshalJSON(b []byte) (err error) {
args.Address = addstr
if len(obj) > 1 {
- if err := blockAge(obj[1], &args.BlockNumber); err != nil {
+ if err := blockHeight(obj[1], &args.BlockNumber); err != nil {
return err
}
}
@@ -333,7 +333,7 @@ func (args *GetDataArgs) UnmarshalJSON(b []byte) (err error) {
args.Address = addstr
if len(obj) > 1 {
- if err := blockAge(obj[1], &args.BlockNumber); err != nil {
+ if err := blockHeight(obj[1], &args.BlockNumber); err != nil {
return err
}
}
diff --git a/tests/blocktest.go b/tests/blocktest.go
index 44b459c8d..5719a835b 100644
--- a/tests/blocktest.go
+++ b/tests/blocktest.go
@@ -19,11 +19,11 @@ import (
)
// Block Test JSON Format
-
type btJSON struct {
Blocks []btBlock
GenesisBlockHeader btHeader
Pre map[string]btAccount
+ PostState map[string]btAccount
}
type btAccount struct {
@@ -97,7 +97,7 @@ func LoadBlockTests(file string) (map[string]*BlockTest, error) {
// InsertPreState populates the given database with the genesis
// accounts defined by the test.
-func (t *BlockTest) InsertPreState(db common.Database) error {
+func (t *BlockTest) InsertPreState(db common.Database) (*state.StateDB, error) {
statedb := state.New(common.Hash{}, db)
for addrString, acct := range t.preAccounts {
// XXX: is is worth it checking for errors here?
@@ -119,8 +119,33 @@ func (t *BlockTest) InsertPreState(db common.Database) error {
// sync trie to disk
statedb.Sync()
- if t.Genesis.Root() != statedb.Root() {
- return errors.New("computed state root does not match genesis block")
+ if !bytes.Equal(t.Genesis.Root().Bytes(), statedb.Root().Bytes()) {
+ return nil, errors.New("computed state root does not match genesis block")
+ }
+ return statedb, nil
+}
+
+func (t *BlockTest) ValidatePostState(statedb *state.StateDB) error {
+ for addrString, acct := range t.preAccounts {
+ // XXX: is is worth it checking for errors here?
+ addr, _ := hex.DecodeString(addrString)
+ code, _ := hex.DecodeString(strings.TrimPrefix(acct.Code, "0x"))
+ balance, _ := new(big.Int).SetString(acct.Balance, 0)
+ nonce, _ := strconv.ParseUint(acct.Nonce, 16, 64)
+
+ // address is indirectly verified by the other fields, as it's the db key
+ code2 := statedb.GetCode(common.BytesToAddress(addr))
+ balance2 := statedb.GetBalance(common.BytesToAddress(addr))
+ nonce2 := statedb.GetNonce(common.BytesToAddress(addr))
+ if !bytes.Equal(code2, code) {
+ return fmt.Errorf("account code mismatch, addr, found, expected: ", addrString, hex.EncodeToString(code2), hex.EncodeToString(code))
+ }
+ if balance2.Cmp(balance) != 0 {
+ return fmt.Errorf("account balance mismatch, addr, found, expected: ", addrString, balance2, balance)
+ }
+ if nonce2 != nonce {
+ return fmt.Errorf("account nonce mismatch, addr, found, expected: ", addrString, nonce2, nonce)
+ }
}
return nil
}
diff --git a/xeth/xeth.go b/xeth/xeth.go
index 23e523980..f7f4ce0cf 100644
--- a/xeth/xeth.go
+++ b/xeth/xeth.go
@@ -176,9 +176,12 @@ func (self *XEth) AtStateNum(num int64) *XEth {
chain := self.Backend().ChainManager()
var block *types.Block
+ // -1 generally means "latest"
+ // -2 means "pending", which has no blocknum
if num < 0 {
- num = chain.CurrentBlock().Number().Int64() + num + 1
+ num = chain.CurrentBlock().Number().Int64()
}
+
block = chain.GetBlockByNumber(uint64(num))
var st *state.StateDB
@@ -229,6 +232,11 @@ func (self *XEth) EthTransactionByHash(hash string) *types.Transaction {
}
func (self *XEth) BlockByNumber(num int64) *Block {
+ if num == -2 {
+ // "pending" is non-existant
+ return &Block{}
+ }
+
if num == -1 {
return NewBlock(self.chainManager.CurrentBlock())
}
@@ -237,6 +245,11 @@ func (self *XEth) BlockByNumber(num int64) *Block {
}
func (self *XEth) EthBlockByNumber(num int64) *types.Block {
+ if num == -2 {
+ // "pending" is non-existant
+ return &types.Block{}
+ }
+
if num == -1 {
return self.chainManager.CurrentBlock()
}