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  }