|
|
@@ -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)
|
|
|
|