diff options
author | obscuren <geffobscura@gmail.com> | 2014-06-30 19:09:04 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-06-30 19:09:04 +0800 |
commit | 8ddd4c4c52eef9f382a321fa880adba4a1e35ee2 (patch) | |
tree | 0d9940dc0d58bad1a07e5bb41a69c3aedd6b199b /ethchain | |
parent | 5a86892ecbd68c3d466cb1ef282c4cb81300abce (diff) | |
download | dexon-8ddd4c4c52eef9f382a321fa880adba4a1e35ee2.tar.gz dexon-8ddd4c4c52eef9f382a321fa880adba4a1e35ee2.tar.zst dexon-8ddd4c4c52eef9f382a321fa880adba4a1e35ee2.zip |
wip
Diffstat (limited to 'ethchain')
-rw-r--r-- | ethchain/state_manager.go | 3 | ||||
-rw-r--r-- | ethchain/state_object.go | 5 | ||||
-rw-r--r-- | ethchain/state_transition.go | 45 |
3 files changed, 51 insertions, 2 deletions
diff --git a/ethchain/state_manager.go b/ethchain/state_manager.go index 312ba3084..48c6401e3 100644 --- a/ethchain/state_manager.go +++ b/ethchain/state_manager.go @@ -3,6 +3,7 @@ package ethchain import ( "bytes" "container/list" + "fmt" "github.com/ethereum/eth-go/ethlog" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethwire" @@ -200,7 +201,7 @@ func (sm *StateManager) Process(block *Block, dontReact bool) (err error) { } if !block.State().Cmp(state) { - statelogger.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 } diff --git a/ethchain/state_object.go b/ethchain/state_object.go index 480b4055d..edac4f6dc 100644 --- a/ethchain/state_object.go +++ b/ethchain/state_object.go @@ -48,7 +48,10 @@ func MakeContract(tx *Transaction, state *State) *StateObject { } func NewStateObject(addr []byte) *StateObject { - return &StateObject{address: addr, Amount: new(big.Int), gasPool: new(big.Int)} + object := &StateObject{address: addr, Amount: new(big.Int), gasPool: new(big.Int)} + object.state = NewState(ethutil.NewTrie(ethutil.Config.Db, "")) + + return object } func NewContract(address []byte, Amount *big.Int, root []byte) *StateObject { diff --git a/ethchain/state_transition.go b/ethchain/state_transition.go index f84c3486b..4b4cbeb51 100644 --- a/ethchain/state_transition.go +++ b/ethchain/state_transition.go @@ -1,7 +1,9 @@ package ethchain import ( + "bytes" "fmt" + "github.com/ethereum/eth-go/ethutil" "math/big" ) @@ -236,6 +238,8 @@ func (self *StateTransition) transferValue(sender, receiver *StateObject) error return nil } +var testAddr = ethutil.FromHex("ec4f34c97e43fbb2816cfd95e388353c7181dab1") + func (self *StateTransition) Eval(script []byte, context *StateObject) (ret []byte, err error, deepErr bool) { var ( block = self.block @@ -258,5 +262,46 @@ func (self *StateTransition) Eval(script []byte, context *StateObject) (ret []by ret, _, err = closure.Call(vm, self.data, nil) deepErr = vm.err != nil + /* + if bytes.Compare(testAddr, context.Address()) == 0 { + trie := context.state.trie + trie.NewIterator().Each(func(key string, v *ethutil.Value) { + v.Decode() + fmt.Printf("%x : %x\n", key, v.Str()) + }) + fmt.Println("\n\n") + } + */ + + Paranoia := true + if Paranoia { + var ( + trie = context.state.trie + trie2 = ethutil.NewTrie(ethutil.Config.Db, "") + ) + + trie.NewIterator().Each(func(key string, v *ethutil.Value) { + trie2.Update(key, v.Str()) + }) + + a := ethutil.NewValue(trie2.Root).Bytes() + b := ethutil.NewValue(context.state.trie.Root).Bytes() + if bytes.Compare(a, b) != 0 { + fmt.Printf("original: %x\n", trie.Root) + trie.NewIterator().Each(func(key string, v *ethutil.Value) { + v.Decode() + fmt.Printf("%x : %x\n", key, v.Str()) + }) + + fmt.Printf("new: %x\n", trie2.Root) + trie2.NewIterator().Each(func(key string, v *ethutil.Value) { + v.Decode() + fmt.Printf("%x : %x\n", key, v.Str()) + }) + + return nil, fmt.Errorf("PARANOIA: Different state object roots during copy"), false + } + } + return } |