Skip to content

Commit

Permalink
miner: ignore a tx's transactor after a gas limit has been returned
Browse files Browse the repository at this point in the history
When worker encounters a gas limit error, subsequent txs should be
ignored from that particular account. This will prevent:

1. Nonce errors been thrown all around
2. The "Known tx" error. Closes #719
3. Repeated contract address. Closes #731
  • Loading branch information
obscuren committed Apr 21, 2015
1 parent 79bef9e commit 1d6d429
Showing 1 changed file with 19 additions and 3 deletions.
22 changes: 19 additions & 3 deletions miner/worker.go
Original file line number Diff line number Diff line change
Expand Up @@ -253,26 +253,42 @@ func (self *worker) commitNewWork() {

// Keep track of transactions which return errors so they can be removed
var (
remove = set.New()
tcount = 0
remove = set.New()
tcount = 0
ignoredTransactors = set.New()
)
//gasLimit:
for _, tx := range transactions {
// We can skip err. It has already been validated in the tx pool
from, _ := tx.From()
// Move on to the next transaction when the transactor is in ignored transactions set
// This may occur when a transaction hits the gas limit. When a gas limit is hit and
// the transaction is processed (that could potentially be included in the block) it
// will throw a nonce error because the previous transaction hasn't been processed.
// Therefor we need to ignore any transaction after the ignored one.
if ignoredTransactors.Has(from) {
continue
}

self.current.state.StartRecord(tx.Hash(), common.Hash{}, 0)

err := self.commitTransaction(tx)
switch {
case core.IsNonceErr(err) || core.IsInvalidTxErr(err):
// Remove invalid transactions
from, _ := tx.From()

self.chain.TxState().RemoveNonce(from, tx.Nonce())
remove.Add(tx.Hash())

if glog.V(logger.Detail) {
glog.Infof("TX (%x) failed, will be removed: %v\n", tx.Hash().Bytes()[:4], err)
//glog.Infoln(tx)
}
case state.IsGasLimitErr(err):
from, _ := tx.From()
// ignore the transactor so no nonce errors will be thrown for this account
// next time the worker is run, they'll be picked up again.
ignoredTransactors.Add(from)
//glog.V(logger.Debug).Infof("Gas limit reached for block. %d TXs included in this block\n", i)
//break gasLimit
default:
Expand Down

0 comments on commit 1d6d429

Please sign in to comment.