diff options
author | Maran <maran.hidskes@gmail.com> | 2014-06-10 23:23:32 +0800 |
---|---|---|
committer | Maran <maran.hidskes@gmail.com> | 2014-06-10 23:23:32 +0800 |
commit | bdc206885a1d9c730464f60ec65557403720be1e (patch) | |
tree | 2686f3c960f6f2966f44d014e4143fa41eb84edd | |
parent | 69044fe5774840a49de3f881a490db52e907affb (diff) | |
download | go-tangerine-bdc206885a1d9c730464f60ec65557403720be1e.tar go-tangerine-bdc206885a1d9c730464f60ec65557403720be1e.tar.gz go-tangerine-bdc206885a1d9c730464f60ec65557403720be1e.tar.bz2 go-tangerine-bdc206885a1d9c730464f60ec65557403720be1e.tar.lz go-tangerine-bdc206885a1d9c730464f60ec65557403720be1e.tar.xz go-tangerine-bdc206885a1d9c730464f60ec65557403720be1e.tar.zst go-tangerine-bdc206885a1d9c730464f60ec65557403720be1e.zip |
Don't mine transactions if they would go over the GasLimit implements ethereum/go-ethereum#77 further.
-rw-r--r-- | ethchain/error.go | 18 | ||||
-rw-r--r-- | ethchain/state_manager.go | 17 |
2 files changed, 35 insertions, 0 deletions
diff --git a/ethchain/error.go b/ethchain/error.go index 8d37b0208..29896bc59 100644 --- a/ethchain/error.go +++ b/ethchain/error.go @@ -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 diff --git a/ethchain/state_manager.go b/ethchain/state_manager.go index f1c09b819..aea5433ff 100644 --- a/ethchain/state_manager.go +++ b/ethchain/state_manager.go @@ -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 } |