// 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 }