github.com/aswedchain/aswed@v1.0.1/consensus/congress/systemcontract/upgrade.go (about)

     1  package systemcontract
     2  
     3  import (
     4  	"github.com/aswedchain/aswed/core"
     5  	"github.com/aswedchain/aswed/core/state"
     6  	"github.com/aswedchain/aswed/core/types"
     7  	"github.com/aswedchain/aswed/log"
     8  	"github.com/aswedchain/aswed/params"
     9  	"math/big"
    10  )
    11  
    12  type IUpgradeAction interface {
    13  	GetName() string
    14  	Update(config *params.ChainConfig, height *big.Int, state *state.StateDB) error
    15  	Execute(state *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig) error
    16  }
    17  
    18  var (
    19  	sysContracts []IUpgradeAction
    20  )
    21  
    22  func init() {
    23  	sysContracts = []IUpgradeAction{
    24  		&hardForkSysGov{},
    25  		&hardForkAddressList{},
    26  		&hardForkValidatorsV1{},
    27  		&hardForkPunishV1{},
    28  	}
    29  }
    30  
    31  func ApplySystemContractUpgrade(state *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig) (err error) {
    32  	if config == nil || header == nil || state == nil {
    33  		return
    34  	}
    35  	height := header.Number
    36  
    37  	for _, contract := range sysContracts {
    38  		log.Info("system contract upgrade", "name", contract.GetName(), "height", height, "chainId", config.ChainID.String())
    39  
    40  		err = contract.Update(config, height, state)
    41  		if err != nil {
    42  			log.Error("Upgrade system contract update error", "name", contract.GetName(), "err", err)
    43  			return
    44  		}
    45  
    46  		log.Info("system contract upgrade execution", "name", contract.GetName(), "height", header.Number, "chainId", config.ChainID.String())
    47  
    48  		err = contract.Execute(state, header, chainContext, config)
    49  		if err != nil {
    50  			log.Error("Upgrade system contract execute error", "name", contract.GetName(), "err", err)
    51  			return
    52  		}
    53  	}
    54  	// Update the state with pending changes
    55  	state.Finalise(true)
    56  
    57  	return
    58  }