github.com/intfoundation/intchain@v0.0.0-20220727031208-4316ad31ca73/cmd/intchain/intchain.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "github.com/intfoundation/intchain/cmd/utils" 6 "github.com/intfoundation/intchain/consensus/ipbft/consensus" 7 "github.com/intfoundation/intchain/internal/debug" 8 "github.com/intfoundation/intchain/log" 9 "gopkg.in/urfave/cli.v1" 10 "os" 11 "os/signal" 12 "strings" 13 "syscall" 14 ) 15 16 func intchainCmd(ctx *cli.Context) error { 17 18 if ctx == nil { 19 log.Error("oh, ctx is null, how intchain works?") 20 return nil 21 } 22 23 log.Info("INT Chain is the world's first bottom up new-generation blockchain of things (BoT) communication standard and base application platform.") 24 25 chainMgr := GetCMInstance(ctx) 26 27 // ChildChainFlag flag 28 requestChildChain := strings.Split(ctx.GlobalString(utils.ChildChainFlag.Name), ",") 29 30 // Initial P2P Server 31 chainMgr.InitP2P() 32 33 // Load Main Chain 34 err := chainMgr.LoadMainChain() 35 if err != nil { 36 log.Errorf("Load Main Chain failed. %v", err) 37 return nil 38 } 39 40 //set the event.TypeMutex to cch 41 chainMgr.InitCrossChainHelper() 42 43 // Start P2P Server 44 err = chainMgr.StartP2PServer() 45 if err != nil { 46 log.Errorf("Start P2P Server failed. %v", err) 47 return err 48 } 49 consensus.NodeID = chainMgr.GetNodeID()[0:16] 50 51 // Start Main Chain 52 err = chainMgr.StartMainChain() 53 54 // Load Child Chain 55 err = chainMgr.LoadChains(requestChildChain) 56 if err != nil { 57 log.Errorf("Load Child Chains failed. %v", err) 58 return err 59 } 60 61 // Start Child Chain 62 err = chainMgr.StartChains() 63 if err != nil { 64 log.Error("start chains failed") 65 return err 66 } 67 68 err = chainMgr.StartRPC() 69 if err != nil { 70 log.Error("start intrpc failed") 71 return err 72 } 73 74 chainMgr.StartInspectEvent() 75 76 go func() { 77 sigc := make(chan os.Signal, 1) 78 signal.Notify(sigc, syscall.SIGINT, syscall.SIGTERM) 79 defer signal.Stop(sigc) 80 <-sigc 81 log.Info("Got interrupt, shutting down...") 82 83 chainMgr.StopChain() 84 chainMgr.WaitChainsStop() 85 chainMgr.Stop() 86 87 for i := 10; i > 0; i-- { 88 <-sigc 89 if i > 1 { 90 log.Info(fmt.Sprintf("Already shutting down, interrupt %d more times for panic.", i-1)) 91 } 92 } 93 debug.Exit() // ensure trace and CPU profile data is flushed. 94 debug.LoudPanic("boom") 95 }() 96 97 chainMgr.Wait() 98 99 return nil 100 }