forked from cerc-io/plugeth
Don't mine transactions if they would go over the GasLimit implements ethereum/go-ethereum#77 further.
This commit is contained in:
parent
69044fe577
commit
bdc206885a
@ -2,6 +2,7 @@ package ethchain
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/big"
|
||||
)
|
||||
|
||||
// Parent error. In case a parent is unknown this error will be thrown
|
||||
@ -43,6 +44,23 @@ func IsValidationErr(err error) bool {
|
||||
return ok
|
||||
}
|
||||
|
||||
type GasLimitErr struct {
|
||||
Message string
|
||||
Is, Max *big.Int
|
||||
}
|
||||
|
||||
func IsGasLimitErr(err error) bool {
|
||||
_, ok := err.(*GasLimitErr)
|
||||
|
||||
return ok
|
||||
}
|
||||
func (err *GasLimitErr) Error() string {
|
||||
return err.Message
|
||||
}
|
||||
func GasLimitError(is, max *big.Int) *GasLimitErr {
|
||||
return &GasLimitErr{Message: fmt.Sprintf("GasLimit error. Max %s, transaction would take it to %s", max, is), Is: is, Max: max}
|
||||
}
|
||||
|
||||
type NonceErr struct {
|
||||
Message string
|
||||
Is, Exp uint64
|
||||
|
@ -114,6 +114,8 @@ func (sm *StateManager) ApplyTransactions(state *State, block *Block, txs []*Tra
|
||||
// Process each transaction/contract
|
||||
var receipts []*Receipt
|
||||
var validTxs []*Transaction
|
||||
var ignoredTxs []*Transaction // Transactions which go over the gasLimit
|
||||
|
||||
totalUsedGas := big.NewInt(0)
|
||||
for _, tx := range txs {
|
||||
usedGas, err := sm.ApplyTransaction(state, block, tx)
|
||||
@ -121,6 +123,12 @@ func (sm *StateManager) ApplyTransactions(state *State, block *Block, txs []*Tra
|
||||
if IsNonceErr(err) {
|
||||
continue
|
||||
}
|
||||
if IsGasLimitErr(err) {
|
||||
ignoredTxs = append(ignoredTxs, tx)
|
||||
// We need to figure out if we want to do something with thse txes
|
||||
ethutil.Config.Log.Debugln("Gastlimit:", err)
|
||||
continue
|
||||
}
|
||||
|
||||
ethutil.Config.Log.Infoln(err)
|
||||
}
|
||||
@ -151,6 +159,7 @@ func (sm *StateManager) ApplyTransaction(state *State, block *Block, tx *Transac
|
||||
script []byte
|
||||
)
|
||||
totalGasUsed = big.NewInt(0)
|
||||
snapshot := state.Snapshot()
|
||||
|
||||
// Apply the transaction to the current state
|
||||
gas, err = sm.Ethereum.TxPool().ProcessTransaction(tx, state, false)
|
||||
@ -190,6 +199,14 @@ func (sm *StateManager) ApplyTransaction(state *State, block *Block, tx *Transac
|
||||
}
|
||||
}
|
||||
|
||||
parent := sm.bc.GetBlock(block.PrevHash)
|
||||
total := new(big.Int).Add(block.GasUsed, totalGasUsed)
|
||||
limit := block.CalcGasLimit(parent)
|
||||
if total.Cmp(limit) > 0 {
|
||||
state.Revert(snapshot)
|
||||
err = GasLimitError(total, limit)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user