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