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 }