github.com/cosmos/cosmos-sdk@v0.50.10/x/genutil/types/genesis_state.go (about) 1 package types 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "os" 7 8 "github.com/cosmos/cosmos-sdk/codec" 9 sdk "github.com/cosmos/cosmos-sdk/types" 10 stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" 11 ) 12 13 // NewGenesisState creates a new GenesisState object 14 func NewGenesisState(genTxs []json.RawMessage) *GenesisState { 15 // Ensure genTxs is never nil, https://github.com/cosmos/cosmos-sdk/issues/5086 16 if len(genTxs) == 0 { 17 genTxs = make([]json.RawMessage, 0) 18 } 19 return &GenesisState{ 20 GenTxs: genTxs, 21 } 22 } 23 24 // DefaultGenesisState returns the genutil module's default genesis state. 25 func DefaultGenesisState() *GenesisState { 26 return &GenesisState{ 27 GenTxs: []json.RawMessage{}, 28 } 29 } 30 31 // NewGenesisStateFromTx creates a new GenesisState object 32 // from auth transactions 33 func NewGenesisStateFromTx(txJSONEncoder sdk.TxEncoder, genTxs []sdk.Tx) *GenesisState { 34 genTxsBz := make([]json.RawMessage, len(genTxs)) 35 for i, genTx := range genTxs { 36 var err error 37 genTxsBz[i], err = txJSONEncoder(genTx) 38 if err != nil { 39 panic(err) 40 } 41 } 42 return NewGenesisState(genTxsBz) 43 } 44 45 // GetGenesisStateFromAppState gets the genutil genesis state from the expected app state 46 func GetGenesisStateFromAppState(cdc codec.JSONCodec, appState map[string]json.RawMessage) *GenesisState { 47 var genesisState GenesisState 48 if appState[ModuleName] != nil { 49 cdc.MustUnmarshalJSON(appState[ModuleName], &genesisState) 50 } 51 return &genesisState 52 } 53 54 // SetGenesisStateInAppState sets the genutil genesis state within the expected app state 55 func SetGenesisStateInAppState( 56 cdc codec.JSONCodec, appState map[string]json.RawMessage, genesisState *GenesisState, 57 ) map[string]json.RawMessage { 58 genesisStateBz := cdc.MustMarshalJSON(genesisState) 59 appState[ModuleName] = genesisStateBz 60 return appState 61 } 62 63 // GenesisStateFromAppGenesis creates the core parameters for genesis initialization 64 // for the application. 65 // 66 // NOTE: The pubkey input is this machines pubkey. 67 func GenesisStateFromAppGenesis(genesis *AppGenesis) (genesisState map[string]json.RawMessage, err error) { 68 if err = json.Unmarshal(genesis.AppState, &genesisState); err != nil { 69 return genesisState, err 70 } 71 return genesisState, nil 72 } 73 74 // GenesisStateFromGenFile creates the core parameters for genesis initialization 75 // for the application. 76 // 77 // NOTE: The pubkey input is this machines pubkey. 78 func GenesisStateFromGenFile(genFile string) (genesisState map[string]json.RawMessage, genesis *AppGenesis, err error) { 79 if _, err := os.Stat(genFile); os.IsNotExist(err) { 80 return genesisState, genesis, fmt.Errorf("%s does not exist, run `init` first", genFile) 81 } 82 83 genesis, err = AppGenesisFromFile(genFile) 84 if err != nil { 85 return genesisState, genesis, err 86 } 87 88 genesisState, err = GenesisStateFromAppGenesis(genesis) 89 return genesisState, genesis, err 90 } 91 92 // ValidateGenesis validates GenTx transactions 93 func ValidateGenesis(genesisState *GenesisState, txJSONDecoder sdk.TxDecoder, validator MessageValidator) error { 94 for _, genTx := range genesisState.GenTxs { 95 _, err := ValidateAndGetGenTx(genTx, txJSONDecoder, validator) 96 if err != nil { 97 return err 98 } 99 } 100 return nil 101 } 102 103 type MessageValidator func([]sdk.Msg) error 104 105 func DefaultMessageValidator(msgs []sdk.Msg) error { 106 if len(msgs) != 1 { 107 return fmt.Errorf("unexpected number of GenTx messages; got: %d, expected: 1", len(msgs)) 108 } 109 if _, ok := msgs[0].(*stakingtypes.MsgCreateValidator); !ok { 110 return fmt.Errorf("unexpected GenTx message type; expected: MsgCreateValidator, got: %T", msgs[0]) 111 } 112 113 if m, ok := msgs[0].(sdk.HasValidateBasic); ok { 114 if err := m.ValidateBasic(); err != nil { 115 return fmt.Errorf("invalid GenTx '%s': %w", msgs[0], err) 116 } 117 } 118 119 return nil 120 } 121 122 // ValidateAndGetGenTx validates the genesis transaction and returns GenTx if valid 123 // it cannot verify the signature as it is stateless validation 124 func ValidateAndGetGenTx(genTx json.RawMessage, txJSONDecoder sdk.TxDecoder, validator MessageValidator) (sdk.Tx, error) { 125 tx, err := txJSONDecoder(genTx) 126 if err != nil { 127 return tx, fmt.Errorf("failed to decode gentx: %s, error: %s", genTx, err) 128 } 129 130 return tx, validator(tx.GetMsgs()) 131 }