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 }