Validate block header gas limit
* Add block header gas limit validation in ValidateBlock function, see eq 39 and 45 in yellow paper. Before it was calculated _for_ the block instead of validated. * Use the block header gas limit when setting the gas pool instead of calculating the value for the block.
This commit is contained in:
		@@ -62,7 +62,7 @@ func NewBlockProcessor(db ethutil.Database, txpool *TxPool, chainManager *ChainM
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (sm *BlockProcessor) TransitionState(statedb *state.StateDB, parent, block *types.Block, transientProcess bool) (receipts types.Receipts, err error) {
 | 
					func (sm *BlockProcessor) TransitionState(statedb *state.StateDB, parent, block *types.Block, transientProcess bool) (receipts types.Receipts, err error) {
 | 
				
			||||||
	coinbase := statedb.GetOrNewStateObject(block.Header().Coinbase)
 | 
						coinbase := statedb.GetOrNewStateObject(block.Header().Coinbase)
 | 
				
			||||||
	coinbase.SetGasPool(CalcGasLimit(parent, block))
 | 
						coinbase.SetGasPool(block.Header().GasLimit)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Process the transactions on to parent state
 | 
						// Process the transactions on to parent state
 | 
				
			||||||
	receipts, _, _, _, err = sm.ApplyTransactions(coinbase, statedb, block, block.Transactions(), transientProcess)
 | 
						receipts, _, _, _, err = sm.ApplyTransactions(coinbase, statedb, block, block.Transactions(), transientProcess)
 | 
				
			||||||
@@ -247,6 +247,11 @@ func (sm *BlockProcessor) ValidateBlock(block, parent *types.Block) error {
 | 
				
			|||||||
		return fmt.Errorf("Difficulty check failed for block %v, %v", block.Header().Difficulty, expd)
 | 
							return fmt.Errorf("Difficulty check failed for block %v, %v", block.Header().Difficulty, expd)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						expl := CalcGasLimit(parent, block)
 | 
				
			||||||
 | 
						if expl.Cmp(block.Header().GasLimit) != 0 {
 | 
				
			||||||
 | 
							return fmt.Errorf("GasLimit check failed for block %v, %v", block.Header().GasLimit, expl)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if block.Time() < parent.Time() {
 | 
						if block.Time() < parent.Time() {
 | 
				
			||||||
		return ValidationError("Block timestamp not after prev block (%v - %v)", block.Header().Time, parent.Header().Time)
 | 
							return ValidationError("Block timestamp not after prev block (%v - %v)", block.Header().Time, parent.Header().Time)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user