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  }