github.com/intfoundation/intchain@v0.0.0-20220727031208-4316ad31ca73/cmd/intchain/chain.go (about)

     1  package main
     2  
     3  import (
     4  	cfg "github.com/intfoundation/go-config"
     5  	"github.com/intfoundation/intchain/accounts/keystore"
     6  	"github.com/intfoundation/intchain/cmd/utils"
     7  	tdmTypes "github.com/intfoundation/intchain/consensus/ipbft/types"
     8  	"github.com/intfoundation/intchain/log"
     9  	intnode "github.com/intfoundation/intchain/node"
    10  	"gopkg.in/urfave/cli.v1"
    11  	"path/filepath"
    12  )
    13  
    14  const (
    15  	// Client identifier to advertise over the network
    16  	MainChain    = "intchain"
    17  	TestnetChain = "testnet"
    18  )
    19  
    20  type Chain struct {
    21  	Id      string
    22  	Config  cfg.Config
    23  	IntNode *intnode.Node
    24  }
    25  
    26  func LoadMainChain(ctx *cli.Context, chainId string) *Chain {
    27  
    28  	chain := &Chain{Id: chainId}
    29  	config := utils.GetTendermintConfig(chainId, ctx)
    30  	chain.Config = config
    31  
    32  	log.Info("Make full node")
    33  	stack := makeFullNode(ctx, GetCMInstance(ctx).cch, chainId)
    34  	chain.IntNode = stack
    35  
    36  	return chain
    37  }
    38  
    39  func LoadChildChain(ctx *cli.Context, chainId string) *Chain {
    40  
    41  	log.Infof("now load child: %s", chainId)
    42  
    43  	//chainDir := ChainDir(ctx, chainId)
    44  	//empty, err := cmn.IsDirEmpty(chainDir)
    45  	//log.Infof("chainDir is : %s, empty is %v", chainDir, empty)
    46  	//if empty || err != nil {
    47  	//	log.Errorf("directory %s not exist or with error %v", chainDir, err)
    48  	//	return nil
    49  	//}
    50  	chain := &Chain{Id: chainId}
    51  	config := utils.GetTendermintConfig(chainId, ctx)
    52  	chain.Config = config
    53  
    54  	log.Infof("chainId: %s, makeFullNode", chainId)
    55  	cch := GetCMInstance(ctx).cch
    56  	stack := makeFullNode(ctx, cch, chainId)
    57  	if stack == nil {
    58  		return nil
    59  	} else {
    60  		chain.IntNode = stack
    61  		return chain
    62  	}
    63  }
    64  
    65  func StartChain(ctx *cli.Context, chain *Chain, startDone chan<- struct{}) error {
    66  
    67  	log.Infof("Start Chain: %s", chain.Id)
    68  	go func() {
    69  		utils.StartNode(ctx, chain.IntNode)
    70  
    71  		if startDone != nil {
    72  			startDone <- struct{}{}
    73  		}
    74  	}()
    75  
    76  	return nil
    77  }
    78  
    79  func CreateChildChain(ctx *cli.Context, chainId string, validator tdmTypes.PrivValidator, keyJson []byte, validators []tdmTypes.GenesisValidator) error {
    80  
    81  	// Get Tendermint config base on chain id
    82  	config := utils.GetTendermintConfig(chainId, ctx)
    83  
    84  	// Save the KeyStore File (Optional)
    85  	if len(keyJson) > 0 {
    86  		keystoreDir := config.GetString("keystore")
    87  		keyJsonFilePath := filepath.Join(keystoreDir, keystore.KeyFileName(validator.Address))
    88  		saveKeyError := keystore.WriteKeyStore(keyJsonFilePath, keyJson)
    89  		if saveKeyError != nil {
    90  			return saveKeyError
    91  		}
    92  	}
    93  
    94  	// Save the Validator Json File
    95  	privValFile := config.GetString("priv_validator_file_root")
    96  	validator.SetFile(privValFile + ".json")
    97  	validator.Save()
    98  
    99  	// Init the INT Genesis
   100  	err := initEthGenesisFromExistValidator(chainId, config, validators)
   101  	if err != nil {
   102  		return err
   103  	}
   104  
   105  	// Init the INT Blockchain
   106  	init_int_blockchain(chainId, config.GetString("int_genesis_file"), ctx)
   107  
   108  	// Init the Tendermint Genesis
   109  	init_em_files(config, chainId, config.GetString("int_genesis_file"), validators)
   110  
   111  	return nil
   112  }