diff options
author | Jeffrey Wilcke <geffobscura@gmail.com> | 2015-10-19 22:08:17 +0800 |
---|---|---|
committer | Jeffrey Wilcke <geffobscura@gmail.com> | 2015-11-18 21:24:42 +0800 |
commit | a1d9ef48c505ab4314ca8e3ee1fc272032da3034 (patch) | |
tree | 032db4314c562459e1f1298b6b80eed57a219af2 /rpc | |
parent | 9422eec55460aaca300cabd52124ed0cbd8dedd3 (diff) | |
download | dexon-a1d9ef48c505ab4314ca8e3ee1fc272032da3034.tar.gz dexon-a1d9ef48c505ab4314ca8e3ee1fc272032da3034.tar.zst dexon-a1d9ef48c505ab4314ca8e3ee1fc272032da3034.zip |
core, eth, rpc: split out block validator and state processor
This removes the burden on a single object to take care of all
validation and state processing. Now instead the validation is done by
the `core.BlockValidator` (`types.Validator`) that takes care of both
header and uncle validation through the `ValidateBlock` method and state
validation through the `ValidateState` method. The state processing is
done by a new object `core.StateProcessor` (`types.Processor`) and
accepts a new state as input and uses that to process the given block's
transactions (and uncles for rewords) to calculate the state root for
the next block (P_n + 1).
Diffstat (limited to 'rpc')
-rw-r--r-- | rpc/api/debug.go | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/rpc/api/debug.go b/rpc/api/debug.go index d2cbc7f19..a6faa335e 100644 --- a/rpc/api/debug.go +++ b/rpc/api/debug.go @@ -22,6 +22,7 @@ import ( "time" "github.com/ethereum/ethash" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth" @@ -166,11 +167,30 @@ func (self *debugApi) ProcessBlock(req *shared.Request) (interface{}, error) { defer func() { vm.Debug = old }() vm.Debug = true - _, err := self.ethereum.BlockProcessor().RetryProcess(block) - if err == nil { - return true, nil + var ( + blockchain = self.ethereum.BlockChain() + validator = blockchain.Validator() + processor = blockchain.Processor() + ) + + err := core.ValidateHeader(blockchain.AuxValidator(), block.Header(), blockchain.GetHeader(block.ParentHash()), true, false) + if err != nil { + return false, err } - return false, err + statedb, err := state.New(blockchain.GetBlock(block.ParentHash()).Root(), self.ethereum.ChainDb()) + if err != nil { + return false, err + } + receipts, _, usedGas, err := processor.Process(block, statedb) + if err != nil { + return false, err + } + err = validator.ValidateState(block, blockchain.GetBlock(block.ParentHash()), statedb, receipts, usedGas) + if err != nil { + return false, err + } + + return true, nil } func (self *debugApi) SeedHash(req *shared.Request) (interface{}, error) { |