diff options
Diffstat (limited to 'ethchain/state_manager.go')
-rw-r--r-- | ethchain/state_manager.go | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/ethchain/state_manager.go b/ethchain/state_manager.go index b759ae94e..0fe7001c6 100644 --- a/ethchain/state_manager.go +++ b/ethchain/state_manager.go @@ -101,7 +101,7 @@ func (self *StateManager) Stop() { func (self *StateManager) updateThread() { for ev := range self.events.Chan() { for _, block := range ev.(Blocks) { - err := self.Process(block, false) + err := self.Process(block) if err != nil { statelogger.Infoln(err) statelogger.Debugf("Block #%v failed (%x...)\n", block.Number, block.Hash()[0:4]) @@ -173,8 +173,9 @@ done: state.Update() txGas.Sub(txGas, st.gas) - accumelative := new(big.Int).Set(totalUsedGas.Add(totalUsedGas, txGas)) - receipt := &Receipt{tx, ethutil.CopyBytes(state.Root().([]byte)), accumelative} + cumulative := new(big.Int).Set(totalUsedGas.Add(totalUsedGas, txGas)) + //receipt := &Receipt{tx, ethutil.CopyBytes(state.Root().([]byte)), accumelative} + receipt := &Receipt{ethutil.CopyBytes(state.Root().([]byte)), cumulative, LogsBloom(tx.logs).Bytes(), tx.logs} if i < len(block.Receipts()) { original := block.Receipts()[i] @@ -183,7 +184,7 @@ done: os.Exit(1) } - err := fmt.Errorf("#%d receipt failed (r) %v ~ %x <=> (c) %v ~ %x (%x...)", i+1, original.CumulativeGasUsed, original.PostState[0:4], receipt.CumulativeGasUsed, receipt.PostState[0:4], receipt.Tx.Hash()[0:4]) + err := fmt.Errorf("#%d receipt failed (r) %v ~ %x <=> (c) %v ~ %x (%x...)", i+1, original.CumulativeGasUsed, original.PostState[0:4], receipt.CumulativeGasUsed, receipt.PostState[0:4], tx.Hash()[0:4]) return nil, nil, nil, nil, err } @@ -205,7 +206,7 @@ done: return receipts, handled, unhandled, erroneous, err } -func (sm *StateManager) Process(block *Block, dontReact bool) (err error) { +func (sm *StateManager) Process(block *Block) (err error) { // Processing a blocks may never happen simultaneously sm.mutex.Lock() defer sm.mutex.Unlock() @@ -235,14 +236,19 @@ func (sm *StateManager) Process(block *Block, dontReact bool) (err error) { fmt.Printf("## %x %x ##\n", block.Hash(), block.Number) } + txSha := DeriveSha(block.transactions) + if bytes.Compare(txSha, block.TxSha) != 0 { + return fmt.Errorf("Error validating transaction sha. Received %x, got %x", block.ReceiptSha, txSha) + } + receipts, err := sm.ApplyDiff(state, parent, block) if err != nil { return err } - txSha := CreateTxSha(receipts) - if bytes.Compare(txSha, block.TxSha) != 0 { - return fmt.Errorf("Error validating tx sha. Received %x, got %x", block.TxSha, txSha) + receiptSha := DeriveSha(receipts) + if bytes.Compare(receiptSha, block.ReceiptSha) != 0 { + return fmt.Errorf("Error validating receipt sha. Received %x, got %x", block.ReceiptSha, receiptSha) } // Block validation @@ -271,20 +277,13 @@ func (sm *StateManager) Process(block *Block, dontReact bool) (err error) { // Add the block to the chain sm.bc.Add(block) - sm.transState = state.Copy() + // TODO at this point we should also insert LOGS in to a database - // Create a bloom bin for this block - filter := sm.createBloomFilter(state) - // Persist the data - fk := append([]byte("bloom"), block.Hash()...) - sm.eth.Db().Put(fk, filter.Bin()) + sm.transState = state.Copy() statelogger.Infof("Imported block #%d (%x...)\n", block.Number, block.Hash()[0:4]) - if dontReact == false { - sm.eth.EventMux().Post(NewBlockEvent{block}) - state.Manifest().Reset() - } + state.Manifest().Reset() sm.eth.TxPool().RemoveSet(block.Transactions()) } else { |