diff --git a/l2geth/miner/worker.go b/l2geth/miner/worker.go index bb70addfe87160bb27063eff0f1944751743dd7b..18446a70c4b2c3835f71144c9c89d6c346fa3b24 100644 --- a/l2geth/miner/worker.go +++ b/l2geth/miner/worker.go @@ -77,6 +77,16 @@ const ( staleThreshold = 7 ) +var ( + // ErrCannotCommitTxn signals that the transaction execution failed + // when attempting to mine a transaction. + // + // NOTE: This error is not expected to occur in regular operation of + // l2geth, rather the actual execution error should be returned to the + // user. + ErrCannotCommitTxn = errors.New("Cannot commit transaction in miner") +) + // environment is the worker's current environment and holds all of the current state information. type environment struct { signer types.Signer @@ -773,9 +783,13 @@ func (w *worker) commitTransaction(tx *types.Transaction, coinbase common.Addres } func (w *worker) commitTransactions(txs *types.TransactionsByPriceAndNonce, coinbase common.Address, interrupt *int32) bool { + return w.commitTransactionsWithError(txs, coinbase, interrupt) != nil +} + +func (w *worker) commitTransactionsWithError(txs *types.TransactionsByPriceAndNonce, coinbase common.Address, interrupt *int32) error { // Short circuit if current is nil if w.current == nil { - return true + return ErrCannotCommitTxn } if w.current.gasPool == nil { @@ -803,7 +817,11 @@ func (w *worker) commitTransactions(txs *types.TransactionsByPriceAndNonce, coin inc: true, } } - return w.current.tcount == 0 || atomic.LoadInt32(interrupt) == commitInterruptNewHead + if w.current.tcount == 0 || + atomic.LoadInt32(interrupt) == commitInterruptNewHead { + return ErrCannotCommitTxn + } + return nil } // If we don't have enough gas for any further transactions then we're done if w.current.gasPool.Gas() < params.TxGas { @@ -883,7 +901,10 @@ func (w *worker) commitTransactions(txs *types.TransactionsByPriceAndNonce, coin if interrupt != nil { w.resubmitAdjustCh <- &intervalAdjust{inc: false} } - return w.current.tcount == 0 + if w.current.tcount == 0 { + return ErrCannotCommitTxn + } + return nil } // commitNewTx is an OVM addition that mines a block with a single tx in it. @@ -945,8 +966,8 @@ func (w *worker) commitNewTx(tx *types.Transaction) error { acc, _ := types.Sender(w.current.signer, tx) transactions[acc] = types.Transactions{tx} txs := types.NewTransactionsByPriceAndNonce(w.current.signer, transactions) - if w.commitTransactions(txs, w.coinbase, nil) { - return errors.New("Cannot commit transaction in miner") + if err := w.commitTransactionsWithError(txs, w.coinbase, nil); err != nil { + return err } return w.commit(nil, w.fullTaskHook, tstart) }