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  }