diff --git a/ethereum/javascript_runtime.go b/ethereum/javascript_runtime.go index 92d9c119f..a9b12629a 100644 --- a/ethereum/javascript_runtime.go +++ b/ethereum/javascript_runtime.go @@ -215,7 +215,7 @@ func (self *JSRE) execBlock(call otto.FunctionCall) otto.Value { return otto.UndefinedValue() } - err = self.ethereum.BlockDo(ethutil.FromHex(hash)) + err = utils.BlockDo(self.ethereum, ethutil.FromHex(hash)) if err != nil { fmt.Println(err) return otto.FalseValue() diff --git a/utils/cmd.go b/utils/cmd.go index e66bb2612..368f2381e 100644 --- a/utils/cmd.go +++ b/utils/cmd.go @@ -1,6 +1,7 @@ package utils import ( + "fmt" "github.com/ethereum/eth-go" "github.com/ethereum/eth-go/ethminer" "github.com/ethereum/eth-go/ethpub" @@ -74,3 +75,21 @@ func StartMining(ethereum *eth.Ethereum) bool { return false } + +// Replay block +func BlockDo(ethereum *eth.Ethereum, hash []byte) error { + block := ethereum.BlockChain().GetBlock(hash) + if block == nil { + return fmt.Errorf("unknown block %x", hash) + } + + parent := ethereum.BlockChain().GetBlock(block.PrevHash) + + _, err := ethereum.StateManager().ApplyDiff(parent.State(), parent, block) + if err != nil { + return err + } + + return nil + +}