Пример #1
0
// Execute the block to mutate State.
// Also, execute txs on the proxyAppCtx and validate apphash
// Rolls back before executing transactions.
// Rolls back if invalid, but never commits.
func (s *State) ExecBlock(proxyAppCtx proxy.AppContext, block *types.Block, blockPartsHeader types.PartSetHeader) error {

	// Validate the block.
	err := s.validateBlock(block)
	if err != nil {
		return err
	}

	// Update the validator set
	valSet := s.Validators.Copy()
	// Update valSet with signatures from block.
	updateValidatorsWithBlock(s.LastValidators, valSet, block)
	// TODO: Update the validator set (e.g. block.Data.ValidatorUpdates?)
	nextValSet := valSet.Copy()

	// First, rollback.
	proxyAppCtx.RollbackSync()

	// Execute, or rollback. (Does not commit)
	err = s.execBlockOnProxyApp(proxyAppCtx, block)
	if err != nil {
		proxyAppCtx.RollbackSync()
		return err
	}

	// All good!
	nextValSet.IncrementAccum(1)
	s.Validators = nextValSet
	s.LastValidators = valSet
	s.LastAppHash = block.AppHash
	s.LastBlockHeight = block.Height
	s.LastBlockHash = block.Hash()
	s.LastBlockParts = blockPartsHeader
	s.LastBlockTime = block.Time

	return nil
}