Paranoia check

This commit is contained in:
obscuren 2014-07-02 17:48:10 +02:00
parent 2f9bc2ab75
commit 35ae9e3aa8
2 changed files with 13 additions and 12 deletions

View File

@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"github.com/ethereum/eth-go/ethcrypto" "github.com/ethereum/eth-go/ethcrypto"
"github.com/ethereum/eth-go/ethlog" "github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethtrie"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethwire" "github.com/ethereum/eth-go/ethwire"
"math/big" "math/big"
@ -204,7 +205,15 @@ func (sm *StateManager) Process(block *Block, dontReact bool) (err error) {
return err return err
} }
if ethutil.Config.Paranoia {
valid, _ := ethtrie.ParanoiaCheck(state.trie)
if !valid {
err = fmt.Errorf("PARANOIA: World state trie comparison failed")
}
}
if !block.State().Cmp(state) { if !block.State().Cmp(state) {
err = fmt.Errorf("Invalid merkle root.\nrec: %x\nis: %x", block.State().trie.Root, state.trie.Root) err = fmt.Errorf("Invalid merkle root.\nrec: %x\nis: %x", block.State().trie.Root, state.trie.Root)
return return
} }

View File

@ -1,7 +1,6 @@
package ethchain package ethchain
import ( import (
"bytes"
"fmt" "fmt"
"github.com/ethereum/eth-go/ethtrie" "github.com/ethereum/eth-go/ethtrie"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethutil"
@ -264,23 +263,16 @@ func Call(vm *Vm, closure *Closure, data []byte) (ret []byte, err error, deepErr
ret, _, err = closure.Call(vm, data) ret, _, err = closure.Call(vm, data)
deepErr = vm.err != nil deepErr = vm.err != nil
Paranoia := ethutil.Config.Paranoia if ethutil.Config.Paranoia {
if Paranoia {
var ( var (
context = closure.object context = closure.object
trie = context.state.trie trie = context.state.trie
trie2 = ethtrie.NewTrie(ethutil.Config.Db, "")
) )
trie.NewIterator().Each(func(key string, v *ethutil.Value) { valid, t2 := ethtrie.ParanoiaCheck(trie)
trie2.Update(key, v.Str()) if !valid {
})
a := ethutil.NewValue(trie2.Root).Bytes()
b := ethutil.NewValue(context.state.trie.Root).Bytes()
if bytes.Compare(a, b) != 0 {
// TODO FIXME ASAP // TODO FIXME ASAP
context.state.trie = trie2 context.state.trie = t2
/* /*
statelogger.Debugf("(o): %x\n", trie.Root) statelogger.Debugf("(o): %x\n", trie.Root)
trie.NewIterator().Each(func(key string, v *ethutil.Value) { trie.NewIterator().Each(func(key string, v *ethutil.Value) {