From 2c3a014f03390628d329167109f90a30e3c4e4c3 Mon Sep 17 00:00:00 2001 From: obscuren Date: Sun, 15 Feb 2015 16:16:27 +0100 Subject: Resolved some bugs in the miner * TODO nonce error sometimes persists * Fixed mining on wrong blocks * Fixed state error & receipt fail --- miner/worker.go | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) (limited to 'miner') diff --git a/miner/worker.go b/miner/worker.go index 96c8bdd39..2b64f3210 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -4,6 +4,7 @@ import ( "fmt" "math/big" "sort" + "sync" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" @@ -55,6 +56,7 @@ type Agent interface { } type worker struct { + mu sync.Mutex agents []Agent recv chan Work mux *event.TypeMux @@ -115,9 +117,7 @@ out: select { case event := <-events.Chan(): switch event.(type) { - case core.ChainEvent: - self.commitNewWork() - case core.TxPreEvent: + case core.ChainEvent, core.TxPreEvent: self.commitNewWork() } case <-self.quit: @@ -163,6 +163,9 @@ func (self *worker) push() { } func (self *worker) commitNewWork() { + self.mu.Lock() + defer self.mu.Unlock() + self.current = env(self.chain.NewBlock(self.coinbase), self.eth) parent := self.chain.GetBlock(self.current.block.ParentHash()) self.current.coinbase.SetGasPool(core.CalcGasLimit(parent, self.current.block)) @@ -176,12 +179,11 @@ func (self *worker) commitNewWork() { err := self.commitTransaction(tx) switch { case core.IsNonceErr(err): + // Remove invalid transactions remove = append(remove, tx) case core.IsGasLimitErr(err): // Break on gas limit break - default: - remove = append(remove, tx) } if err != nil { @@ -227,16 +229,13 @@ func (self *worker) commitUncle(uncle *types.Header) error { func (self *worker) commitTransaction(tx *types.Transaction) error { snapshot := self.current.state.Copy() - receipt, txGas, err := self.proc.ApplyTransaction(self.current.coinbase, self.current.state, self.current.block, tx, self.current.totalUsedGas, true) - if err != nil { - if core.IsNonceErr(err) || core.IsGasLimitErr(err) { - self.current.state.Set(snapshot) - } + receipt, _, err := self.proc.ApplyTransaction(self.current.coinbase, self.current.state, self.current.block, tx, self.current.totalUsedGas, true) + if err != nil && (core.IsNonceErr(err) || core.IsGasLimitErr(err)) { + self.current.state.Set(snapshot) return err } - self.current.totalUsedGas.Add(self.current.totalUsedGas, txGas) self.current.block.AddTransaction(tx) self.current.block.AddReceipt(receipt) -- cgit v1.2.3