core: use headers only where blocks are unnecessary
This commit is contained in:
		@@ -77,7 +77,7 @@ func (v *BlockValidator) ValidateBody(block *types.Block) error {
 | 
				
			|||||||
// transition, such as amount of used gas, the receipt roots and the state root
 | 
					// transition, such as amount of used gas, the receipt roots and the state root
 | 
				
			||||||
// itself. ValidateState returns a database batch if the validation was a success
 | 
					// itself. ValidateState returns a database batch if the validation was a success
 | 
				
			||||||
// otherwise nil and an error is returned.
 | 
					// otherwise nil and an error is returned.
 | 
				
			||||||
func (v *BlockValidator) ValidateState(block, parent *types.Block, statedb *state.StateDB, receipts types.Receipts, usedGas uint64) error {
 | 
					func (v *BlockValidator) ValidateState(block *types.Block, statedb *state.StateDB, receipts types.Receipts, usedGas uint64) error {
 | 
				
			||||||
	header := block.Header()
 | 
						header := block.Header()
 | 
				
			||||||
	if block.GasUsed() != usedGas {
 | 
						if block.GasUsed() != usedGas {
 | 
				
			||||||
		return fmt.Errorf("invalid gas used (remote: %d local: %d)", block.GasUsed(), usedGas)
 | 
							return fmt.Errorf("invalid gas used (remote: %d local: %d)", block.GasUsed(), usedGas)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1221,9 +1221,9 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, []
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		parent := it.previous()
 | 
							parent := it.previous()
 | 
				
			||||||
		if parent == nil {
 | 
							if parent == nil {
 | 
				
			||||||
			parent = bc.GetBlock(block.ParentHash(), block.NumberU64()-1)
 | 
								parent = bc.GetHeader(block.ParentHash(), block.NumberU64()-1)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		state, err := state.New(parent.Root(), bc.stateCache)
 | 
							state, err := state.New(parent.Root, bc.stateCache)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return it.index, events, coalescedLogs, err
 | 
								return it.index, events, coalescedLogs, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -1236,7 +1236,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, []
 | 
				
			|||||||
			return it.index, events, coalescedLogs, err
 | 
								return it.index, events, coalescedLogs, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Validate the state using the default validator
 | 
							// Validate the state using the default validator
 | 
				
			||||||
		if err := bc.Validator().ValidateState(block, parent, state, receipts, usedGas); err != nil {
 | 
							if err := bc.Validator().ValidateState(block, state, receipts, usedGas); err != nil {
 | 
				
			||||||
			bc.reportBlock(block, receipts, err)
 | 
								bc.reportBlock(block, receipts, err)
 | 
				
			||||||
			return it.index, events, coalescedLogs, err
 | 
								return it.index, events, coalescedLogs, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -1368,7 +1368,7 @@ func (bc *BlockChain) insertSidechain(block *types.Block, it *insertIterator) (i
 | 
				
			|||||||
	// blocks to regenerate the required state
 | 
						// blocks to regenerate the required state
 | 
				
			||||||
	localTd := bc.GetTd(current.Hash(), current.NumberU64())
 | 
						localTd := bc.GetTd(current.Hash(), current.NumberU64())
 | 
				
			||||||
	if localTd.Cmp(externTd) > 0 {
 | 
						if localTd.Cmp(externTd) > 0 {
 | 
				
			||||||
		log.Info("Sidechain written to disk", "start", it.first().NumberU64(), "end", it.previous().NumberU64(), "sidetd", externTd, "localtd", localTd)
 | 
							log.Info("Sidechain written to disk", "start", it.first().NumberU64(), "end", it.previous().Number, "sidetd", externTd, "localtd", localTd)
 | 
				
			||||||
		return it.index, nil, nil, err
 | 
							return it.index, nil, nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Gather all the sidechain hashes (full blocks may be memory heavy)
 | 
						// Gather all the sidechain hashes (full blocks may be memory heavy)
 | 
				
			||||||
@@ -1376,7 +1376,7 @@ func (bc *BlockChain) insertSidechain(block *types.Block, it *insertIterator) (i
 | 
				
			|||||||
		hashes  []common.Hash
 | 
							hashes  []common.Hash
 | 
				
			||||||
		numbers []uint64
 | 
							numbers []uint64
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
	parent := bc.GetHeader(it.previous().Hash(), it.previous().NumberU64())
 | 
						parent := it.previous()
 | 
				
			||||||
	for parent != nil && !bc.HasState(parent.Root) {
 | 
						for parent != nil && !bc.HasState(parent.Root) {
 | 
				
			||||||
		hashes = append(hashes, parent.Hash())
 | 
							hashes = append(hashes, parent.Hash())
 | 
				
			||||||
		numbers = append(numbers, parent.Number.Uint64())
 | 
							numbers = append(numbers, parent.Number.Uint64())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -111,12 +111,12 @@ func (it *insertIterator) next() (*types.Block, error) {
 | 
				
			|||||||
	return it.chain[it.index], it.validator.ValidateBody(it.chain[it.index])
 | 
						return it.chain[it.index], it.validator.ValidateBody(it.chain[it.index])
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// previous returns the previous block was being processed, or nil
 | 
					// previous returns the previous header that was being processed, or nil.
 | 
				
			||||||
func (it *insertIterator) previous() *types.Block {
 | 
					func (it *insertIterator) previous() *types.Header {
 | 
				
			||||||
	if it.index < 1 {
 | 
						if it.index < 1 {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return it.chain[it.index-1]
 | 
						return it.chain[it.index-1].Header()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// first returns the first block in the it.
 | 
					// first returns the first block in the it.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -149,7 +149,7 @@ func testBlockChainImport(chain types.Blocks, blockchain *BlockChain) error {
 | 
				
			|||||||
			blockchain.reportBlock(block, receipts, err)
 | 
								blockchain.reportBlock(block, receipts, err)
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		err = blockchain.validator.ValidateState(block, blockchain.GetBlockByHash(block.ParentHash()), statedb, receipts, usedGas)
 | 
							err = blockchain.validator.ValidateState(block, statedb, receipts, usedGas)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			blockchain.reportBlock(block, receipts, err)
 | 
								blockchain.reportBlock(block, receipts, err)
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,7 +32,7 @@ type Validator interface {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// ValidateState validates the given statedb and optionally the receipts and
 | 
						// ValidateState validates the given statedb and optionally the receipts and
 | 
				
			||||||
	// gas used.
 | 
						// gas used.
 | 
				
			||||||
	ValidateState(block, parent *types.Block, state *state.StateDB, receipts types.Receipts, usedGas uint64) error
 | 
						ValidateState(block *types.Block, state *state.StateDB, receipts types.Receipts, usedGas uint64) error
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Processor is an interface for processing blocks using a given initial state.
 | 
					// Processor is an interface for processing blocks using a given initial state.
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user