Fixed competing block method

This commit is contained in:
obscuren 2014-05-21 11:42:20 +02:00
parent 734b2e4cf7
commit cbf221f6b7
3 changed files with 16 additions and 5 deletions

View File

@ -132,8 +132,19 @@ func (sm *StateManager) ApplyTransaction(state *State, block *Block, tx *Transac
} }
} }
func (sm *StateManager) Process(block *Block, dontReact bool) error {
if !sm.bc.HasBlock(block.PrevHash) {
return ParentError(block.PrevHash)
}
parent := sm.bc.GetBlock(block.PrevHash)
return sm.ProcessBlock(parent.State(), parent, block, dontReact)
}
// Block processing and validating with a given (temporarily) state // Block processing and validating with a given (temporarily) state
func (sm *StateManager) ProcessBlock(state *State, block *Block, dontReact bool) error { func (sm *StateManager) ProcessBlock(state *State, parent, block *Block, dontReact bool) error {
// Processing a blocks may never happen simultaneously // Processing a blocks may never happen simultaneously
sm.mutex.Lock() sm.mutex.Lock()
defer sm.mutex.Unlock() defer sm.mutex.Unlock()
@ -186,7 +197,7 @@ func (sm *StateManager) ProcessBlock(state *State, block *Block, dontReact bool)
sm.bc.Add(block) sm.bc.Add(block)
sm.notifyChanges(state) sm.notifyChanges(state)
ethutil.Config.Log.Infof("[STATE] Added block #%d (%x)\n", block.BlockInfo().Number, block.Hash()) ethutil.Config.Log.Infof("[STATE] Added block #%d (%x)\n", block.Number, block.Hash())
if dontReact == false { if dontReact == false {
sm.Ethereum.Reactor().Post("newBlock", block) sm.Ethereum.Reactor().Post("newBlock", block)

View File

@ -126,7 +126,7 @@ func (miner *Miner) listener() {
// Search the nonce // Search the nonce
miner.block.Nonce = miner.pow.Search(miner.block, miner.quitChan) miner.block.Nonce = miner.pow.Search(miner.block, miner.quitChan)
if miner.block.Nonce != nil { if miner.block.Nonce != nil {
err := miner.ethereum.StateManager().ProcessBlock(miner.ethereum.StateManager().CurrentState(), miner.block, true) err := miner.ethereum.StateManager().Process(miner.block, true)
if err != nil { if err != nil {
ethutil.Config.Log.Infoln(err) ethutil.Config.Log.Infoln(err)
miner.txs = []*ethchain.Transaction{} // Move this somewhere neat miner.txs = []*ethchain.Transaction{} // Move this somewhere neat

View File

@ -335,8 +335,8 @@ func (p *Peer) HandleInbound() {
block = ethchain.NewBlockFromRlpValue(msg.Data.Get(i)) block = ethchain.NewBlockFromRlpValue(msg.Data.Get(i))
//p.ethereum.StateManager().PrepareDefault(block) //p.ethereum.StateManager().PrepareDefault(block)
state := p.ethereum.StateManager().CurrentState() //state := p.ethereum.StateManager().CurrentState()
err = p.ethereum.StateManager().ProcessBlock(state, block, false) err = p.ethereum.StateManager().Process(block, false)
if err != nil { if err != nil {
if ethutil.Config.Debug { if ethutil.Config.Debug {