diff options
Diffstat (limited to 'miner/worker.go')
-rw-r--r-- | miner/worker.go | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/miner/worker.go b/miner/worker.go index e21765f9d..d96da9829 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -9,11 +9,11 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/pow" - "github.com/ethereum/go-ethereum/core/state" "gopkg.in/fatih/set.v0" ) @@ -199,6 +199,8 @@ func (self *worker) push() { func (self *worker) commitNewWork() { self.mu.Lock() defer self.mu.Unlock() + self.uncleMu.Lock() + defer self.uncleMu.Unlock() block := self.chain.NewBlock(self.coinbase) @@ -241,7 +243,10 @@ gasLimit: } self.eth.TxPool().RemoveSet(remove) - var uncles []*types.Header + var ( + uncles []*types.Header + badUncles []common.Hash + ) for hash, uncle := range self.possibleUncles { if len(uncles) == 2 { break @@ -250,12 +255,16 @@ gasLimit: if err := self.commitUncle(uncle.Header()); err != nil { minerlogger.Infof("Bad uncle found and will be removed (%x)\n", hash[:4]) minerlogger.Debugln(uncle) + badUncles = append(badUncles, hash) } else { minerlogger.Infof("commiting %x as uncle\n", hash[:4]) uncles = append(uncles, uncle.Header()) } } minerlogger.Infof("commit new work with %d txs & %d uncles\n", tcount, len(uncles)) + for _, hash := range badUncles { + delete(self.possibleUncles, hash) + } self.current.block.SetUncles(uncles) |