github.com/Hnampk/my-fabric@v0.0.0-20201028083322-75069da399c0/orderer/common/server/main.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package server
     8  
     9  import (
    10  	"bytes"
    11  	"context"
    12  	"fmt"
    13  	"io/ioutil"
    14  	"net"
    15  	"net/http"
    16  	_ "net/http/pprof" // This is essentially the main package for the orderer
    17  	"os"
    18  	"os/signal"
    19  	"sync"
    20  	"syscall"
    21  	"time"
    22  
    23  	"github.com/golang/protobuf/proto"
    24  	"github.com/hyperledger/fabric-lib-go/healthz"
    25  	cb "github.com/hyperledger/fabric-protos-go/common"
    26  	ab "github.com/hyperledger/fabric-protos-go/orderer"
    27  	"github.com/hyperledger/fabric/bccsp"
    28  	"github.com/hyperledger/fabric/bccsp/factory"
    29  	"github.com/hyperledger/fabric/common/channelconfig"
    30  	"github.com/hyperledger/fabric/common/crypto"
    31  	"github.com/hyperledger/fabric/common/flogging"
    32  	floggingmetrics "github.com/hyperledger/fabric/common/flogging/metrics"
    33  	"github.com/hyperledger/fabric/common/grpclogging"
    34  	"github.com/hyperledger/fabric/common/grpcmetrics"
    35  	"github.com/hyperledger/fabric/common/ledger/blockledger"
    36  	"github.com/hyperledger/fabric/common/metrics"
    37  	"github.com/hyperledger/fabric/common/metrics/disabled"
    38  	"github.com/hyperledger/fabric/common/tools/protolator"
    39  	"github.com/hyperledger/fabric/core/operations"
    40  	"github.com/hyperledger/fabric/msp"
    41  	"github.com/hyperledger/fabric/orderer/common/bootstrap/file"
    42  	"github.com/hyperledger/fabric/orderer/common/cluster"
    43  	"github.com/hyperledger/fabric/orderer/common/localconfig"
    44  	"github.com/hyperledger/fabric/orderer/common/metadata"
    45  	"github.com/hyperledger/fabric/orderer/common/multichannel"
    46  	"github.com/hyperledger/fabric/orderer/consensus"
    47  	"github.com/hyperledger/fabric/orderer/consensus/etcdraft"
    48  	"github.com/hyperledger/fabric/orderer/consensus/kafka"
    49  	"github.com/hyperledger/fabric/orderer/consensus/solo"
    50  	"github.com/hyperledger/fabric/protoutil"
    51  	"github.com/hyperledger/fabric/usable-inter-nal/pkg/comm"
    52  	"github.com/hyperledger/fabric/usable-inter-nal/pkg/identity"
    53  	"go.uber.org/zap/zapcore"
    54  	"google.golang.org/grpc"
    55  	"gopkg.in/alecthomas/kingpin.v2"
    56  )
    57  
    58  var logger = flogging.MustGetLogger("orderer.common.server")
    59  
    60  //command line flags
    61  var (
    62  	app = kingpin.New("orderer", "Hyperledger Fabric orderer node")
    63  
    64  	_       = app.Command("start", "Start the orderer node").Default() // preserved for cli compatibility
    65  	version = app.Command("version", "Show version information")
    66  
    67  	clusterTypes = map[string]struct{}{"etcdraft": {}}
    68  )
    69  
    70  // Main is the entry point of orderer process
    71  func Main() {
    72  	fullCmd := kingpin.MustParse(app.Parse(os.Args[1:]))
    73  
    74  	// "version" command
    75  	if fullCmd == version.FullCommand() {
    76  		fmt.Println(metadata.GetVersionInfo())
    77  		return
    78  	}
    79  
    80  	conf, err := localconfig.Load()
    81  	if err != nil {
    82  		logger.Error("failed to parse config: ", err)
    83  		os.Exit(1)
    84  	}
    85  	initializeLogging()
    86  
    87  	prettyPrintStruct(conf)
    88  
    89  	cryptoProvider := factory.GetDefault()
    90  
    91  	signer, signErr := loadLocalMSP(conf).GetDefaultSigningIdentity()
    92  	if signErr != nil {
    93  		logger.Panicf("Failed to get local MSP identity: %s", signErr)
    94  	}
    95  
    96  	opsSystem := newOperationsSystem(conf.Operations, conf.Metrics)
    97  	if err = opsSystem.Start(); err != nil {
    98  		logger.Panicf("failed to initialize operations subsystem: %s", err)
    99  	}
   100  	defer opsSystem.Stop()
   101  	metricsProvider := opsSystem.Provider
   102  	logObserver := floggingmetrics.NewObserver(metricsProvider)
   103  	flogging.SetObserver(logObserver)
   104  
   105  	serverConfig := initializeServerConfig(conf, metricsProvider)
   106  	grpcServer := initializeGrpcServer(conf, serverConfig)
   107  	caMgr := &caManager{
   108  		appRootCAsByChain:     make(map[string][][]byte),
   109  		ordererRootCAsByChain: make(map[string][][]byte),
   110  		clientRootCAs:         serverConfig.SecOpts.ClientRootCAs,
   111  	}
   112  
   113  	lf, _, err := createLedgerFactory(conf, metricsProvider)
   114  	if err != nil {
   115  		logger.Panicf("Failed to create ledger factory: %v", err)
   116  	}
   117  
   118  	var clusterBootBlock *cb.Block
   119  	// configure following artifacts properly if orderer is of cluster type
   120  	var r *replicationInitiator
   121  	clusterServerConfig := serverConfig
   122  	clusterGRPCServer := grpcServer // by default, cluster shares the same grpc server
   123  	var clusterClientConfig comm.ClientConfig
   124  	var clusterDialer *cluster.PredicateDialer
   125  	var clusterType, reuseGrpcListener bool
   126  	var serversToUpdate []*comm.GRPCServer
   127  	if conf.General.BootstrapMethod == "file" {
   128  		bootstrapBlock := extractBootstrapBlock(conf)
   129  		if err := ValidateBootstrapBlock(bootstrapBlock, cryptoProvider); err != nil {
   130  			logger.Panicf("Failed validating bootstrap block: %v", err)
   131  		}
   132  		sysChanLastConfigBlock := extractSysChanLastConfig(lf, bootstrapBlock)
   133  		clusterBootBlock = selectClusterBootBlock(bootstrapBlock, sysChanLastConfigBlock)
   134  
   135  		typ := consensusType(bootstrapBlock, cryptoProvider)
   136  		clusterType = isClusterType(clusterBootBlock, cryptoProvider)
   137  		if clusterType {
   138  			logger.Infof("Setting up cluster for orderer type %s", typ)
   139  			clusterClientConfig = initializeClusterClientConfig(conf)
   140  			clusterDialer = &cluster.PredicateDialer{
   141  				Config: clusterClientConfig,
   142  			}
   143  
   144  			r = createReplicator(lf, bootstrapBlock, conf, clusterClientConfig.SecOpts, signer, cryptoProvider)
   145  			// Only clusters that are equipped with a recent config block can replicate.
   146  			if conf.General.BootstrapMethod == "file" {
   147  				r.replicateIfNeeded(bootstrapBlock)
   148  			}
   149  
   150  			if reuseGrpcListener = reuseListener(conf, typ); !reuseGrpcListener {
   151  				clusterServerConfig, clusterGRPCServer = configureClusterListener(conf, serverConfig, ioutil.ReadFile)
   152  			}
   153  
   154  			// If we have a separate gRPC server for the cluster,
   155  			// we need to update its TLS CA certificate pool.
   156  			serversToUpdate = append(serversToUpdate, clusterGRPCServer)
   157  		}
   158  		// Are we bootstrapping?
   159  		if len(lf.ChannelIDs()) == 0 {
   160  			initializeBootstrapChannel(clusterBootBlock, lf)
   161  		} else {
   162  			logger.Info("Not bootstrapping because of existing channels")
   163  		}
   164  
   165  	}
   166  
   167  	identityBytes, err := signer.Serialize()
   168  	if err != nil {
   169  		logger.Panicf("Failed serializing signing identity: %v", err)
   170  	}
   171  
   172  	expirationLogger := flogging.MustGetLogger("certmonitor")
   173  	crypto.TrackExpiration(
   174  		serverConfig.SecOpts.UseTLS,
   175  		serverConfig.SecOpts.Certificate,
   176  		[][]byte{clusterClientConfig.SecOpts.Certificate},
   177  		identityBytes,
   178  		expirationLogger.Infof,
   179  		expirationLogger.Warnf, // This can be used to piggyback a metric event in the future
   180  		time.Now(),
   181  		time.AfterFunc)
   182  
   183  	// if cluster is reusing client-facing server, then it is already
   184  	// appended to serversToUpdate at this point.
   185  	if grpcServer.MutualTLSRequired() && !reuseGrpcListener {
   186  		serversToUpdate = append(serversToUpdate, grpcServer)
   187  	}
   188  
   189  	tlsCallback := func(bundle *channelconfig.Bundle) {
   190  		logger.Debug("Executing callback to update root CAs")
   191  		caMgr.updateTrustedRoots(bundle, serversToUpdate...)
   192  		if clusterType {
   193  			caMgr.updateClusterDialer(
   194  				clusterDialer,
   195  				clusterClientConfig.SecOpts.ServerRootCAs,
   196  			)
   197  		}
   198  	}
   199  
   200  	manager := initializeMultichannelRegistrar(
   201  		clusterBootBlock,
   202  		r,
   203  		clusterDialer,
   204  		clusterServerConfig,
   205  		clusterGRPCServer,
   206  		conf,
   207  		signer,
   208  		metricsProvider,
   209  		opsSystem,
   210  		lf,
   211  		cryptoProvider,
   212  		tlsCallback,
   213  	)
   214  
   215  	mutualTLS := serverConfig.SecOpts.UseTLS && serverConfig.SecOpts.RequireClientCert
   216  	server := NewServer(
   217  		manager,
   218  		metricsProvider,
   219  		&conf.Debug,
   220  		conf.General.Authentication.TimeWindow,
   221  		mutualTLS,
   222  		conf.General.Authentication.NoExpirationChecks,
   223  	)
   224  
   225  	logger.Infof("Starting %s", metadata.GetVersionInfo())
   226  	handleSignals(addPlatformSignals(map[os.Signal]func(){
   227  		syscall.SIGTERM: func() {
   228  			grpcServer.Stop()
   229  			if clusterGRPCServer != grpcServer {
   230  				clusterGRPCServer.Stop()
   231  			}
   232  		},
   233  	}))
   234  
   235  	if !reuseGrpcListener && clusterType {
   236  		logger.Info("Starting cluster listener on", clusterGRPCServer.Address())
   237  		go clusterGRPCServer.Start()
   238  	}
   239  
   240  	if conf.General.Profile.Enabled {
   241  		go initializeProfilingService(conf)
   242  	}
   243  	ab.RegisterAtomicBroadcastServer(grpcServer.Server(), server)
   244  	logger.Info("Beginning to serve requests")
   245  	grpcServer.Start()
   246  }
   247  
   248  func reuseListener(conf *localconfig.TopLevel, typ string) bool {
   249  	clusterConf := conf.General.Cluster
   250  	// If listen address is not configured, and the TLS certificate isn't configured,
   251  	// it means we use the general listener of the node.
   252  	if clusterConf.ListenPort == 0 && clusterConf.ServerCertificate == "" && clusterConf.ListenAddress == "" && clusterConf.ServerPrivateKey == "" {
   253  		logger.Info("Cluster listener is not configured, defaulting to use the general listener on port", conf.General.ListenPort)
   254  
   255  		if !conf.General.TLS.Enabled {
   256  			logger.Panicf("TLS is required for running ordering nodes of type %s.", typ)
   257  		}
   258  
   259  		return true
   260  	}
   261  
   262  	// Else, one of the above is defined, so all 4 properties should be defined.
   263  	if clusterConf.ListenPort == 0 || clusterConf.ServerCertificate == "" || clusterConf.ListenAddress == "" || clusterConf.ServerPrivateKey == "" {
   264  		logger.Panic("Options: General.Cluster.ListenPort, General.Cluster.ListenAddress, General.Cluster.ServerCertificate," +
   265  			" General.Cluster.ServerPrivateKey, should be defined altogether.")
   266  	}
   267  
   268  	return false
   269  }
   270  
   271  // Extract system channel last config block
   272  func extractSysChanLastConfig(lf blockledger.Factory, bootstrapBlock *cb.Block) *cb.Block {
   273  	// Are we bootstrapping?
   274  	channelCount := len(lf.ChannelIDs())
   275  	if channelCount == 0 {
   276  		logger.Info("Bootstrapping because no existing channels")
   277  		return nil
   278  	}
   279  	logger.Infof("Not bootstrapping because of %d existing channels", channelCount)
   280  
   281  	systemChannelName, err := protoutil.GetChainIDFromBlock(bootstrapBlock)
   282  	if err != nil {
   283  		logger.Panicf("Failed extracting system channel name from bootstrap block: %v", err)
   284  	}
   285  	systemChannelLedger, err := lf.GetOrCreate(systemChannelName)
   286  	if err != nil {
   287  		logger.Panicf("Failed getting system channel ledger: %v", err)
   288  	}
   289  	height := systemChannelLedger.Height()
   290  	lastConfigBlock := multichannel.ConfigBlock(systemChannelLedger)
   291  	logger.Infof("System channel: name=%s, height=%d, last config block number=%d",
   292  		systemChannelName, height, lastConfigBlock.Header.Number)
   293  	return lastConfigBlock
   294  }
   295  
   296  // Select cluster boot block
   297  func selectClusterBootBlock(bootstrapBlock, sysChanLastConfig *cb.Block) *cb.Block {
   298  	if sysChanLastConfig == nil {
   299  		logger.Debug("Selected bootstrap block, because system channel last config block is nil")
   300  		return bootstrapBlock
   301  	}
   302  
   303  	if sysChanLastConfig.Header.Number > bootstrapBlock.Header.Number {
   304  		logger.Infof("Cluster boot block is system channel last config block; Blocks Header.Number system-channel=%d, bootstrap=%d",
   305  			sysChanLastConfig.Header.Number, bootstrapBlock.Header.Number)
   306  		return sysChanLastConfig
   307  	}
   308  
   309  	logger.Infof("Cluster boot block is bootstrap (genesis) block; Blocks Header.Number system-channel=%d, bootstrap=%d",
   310  		sysChanLastConfig.Header.Number, bootstrapBlock.Header.Number)
   311  	return bootstrapBlock
   312  }
   313  
   314  func createReplicator(
   315  	lf blockledger.Factory,
   316  	bootstrapBlock *cb.Block,
   317  	conf *localconfig.TopLevel,
   318  	secOpts comm.SecureOptions,
   319  	signer identity.SignerSerializer,
   320  	bccsp bccsp.BCCSP,
   321  ) *replicationInitiator {
   322  	logger := flogging.MustGetLogger("orderer.common.cluster")
   323  
   324  	vl := &verifierLoader{
   325  		verifierFactory: &cluster.BlockVerifierAssembler{Logger: logger, BCCSP: bccsp},
   326  		onFailure: func(block *cb.Block) {
   327  			protolator.DeepMarshalJSON(os.Stdout, block)
   328  		},
   329  		ledgerFactory: lf,
   330  		logger:        logger,
   331  	}
   332  
   333  	systemChannelName, err := protoutil.GetChainIDFromBlock(bootstrapBlock)
   334  	if err != nil {
   335  		logger.Panicf("Failed extracting system channel name from bootstrap block: %v", err)
   336  	}
   337  
   338  	// System channel is not verified because we trust the bootstrap block
   339  	// and use backward hash chain verification.
   340  	verifiersByChannel := vl.loadVerifiers()
   341  	verifiersByChannel[systemChannelName] = &cluster.NoopBlockVerifier{}
   342  
   343  	vr := &cluster.VerificationRegistry{
   344  		LoadVerifier:       vl.loadVerifier,
   345  		Logger:             logger,
   346  		VerifiersByChannel: verifiersByChannel,
   347  		VerifierFactory:    &cluster.BlockVerifierAssembler{Logger: logger, BCCSP: bccsp},
   348  	}
   349  
   350  	ledgerFactory := &ledgerFactory{
   351  		Factory:       lf,
   352  		onBlockCommit: vr.BlockCommitted,
   353  	}
   354  	return &replicationInitiator{
   355  		registerChain:     vr.RegisterVerifier,
   356  		verifierRetriever: vr,
   357  		logger:            logger,
   358  		secOpts:           secOpts,
   359  		conf:              conf,
   360  		lf:                ledgerFactory,
   361  		signer:            signer,
   362  		cryptoProvider:    bccsp,
   363  	}
   364  }
   365  
   366  func initializeLogging() {
   367  	loggingSpec := os.Getenv("FABRIC_LOGGING_SPEC")
   368  	loggingFormat := os.Getenv("FABRIC_LOGGING_FORMAT")
   369  	flogging.Init(flogging.Config{
   370  		Format:  loggingFormat,
   371  		Writer:  os.Stderr,
   372  		LogSpec: loggingSpec,
   373  	})
   374  }
   375  
   376  // Start the profiling service if enabled.
   377  func initializeProfilingService(conf *localconfig.TopLevel) {
   378  	logger.Info("Starting Go pprof profiling service on:", conf.General.Profile.Address)
   379  	// The ListenAndServe() call does not return unless an error occurs.
   380  	logger.Panic("Go pprof service failed:", http.ListenAndServe(conf.General.Profile.Address, nil))
   381  }
   382  
   383  func handleSignals(handlers map[os.Signal]func()) {
   384  	var signals []os.Signal
   385  	for sig := range handlers {
   386  		signals = append(signals, sig)
   387  	}
   388  
   389  	signalChan := make(chan os.Signal, 1)
   390  	signal.Notify(signalChan, signals...)
   391  
   392  	go func() {
   393  		for sig := range signalChan {
   394  			logger.Infof("Received signal: %d (%s)", sig, sig)
   395  			handlers[sig]()
   396  		}
   397  	}()
   398  }
   399  
   400  type loadPEMFunc func(string) ([]byte, error)
   401  
   402  // configureClusterListener returns a new ServerConfig and a new gRPC server (with its own TLS listener).
   403  func configureClusterListener(conf *localconfig.TopLevel, generalConf comm.ServerConfig, loadPEM loadPEMFunc) (comm.ServerConfig, *comm.GRPCServer) {
   404  	clusterConf := conf.General.Cluster
   405  
   406  	cert, err := loadPEM(clusterConf.ServerCertificate)
   407  	if err != nil {
   408  		logger.Panicf("Failed to load cluster server certificate from '%s' (%s)", clusterConf.ServerCertificate, err)
   409  	}
   410  
   411  	key, err := loadPEM(clusterConf.ServerPrivateKey)
   412  	if err != nil {
   413  		logger.Panicf("Failed to load cluster server key from '%s' (%s)", clusterConf.ServerPrivateKey, err)
   414  	}
   415  
   416  	port := fmt.Sprintf("%d", clusterConf.ListenPort)
   417  	bindAddr := net.JoinHostPort(clusterConf.ListenAddress, port)
   418  
   419  	var clientRootCAs [][]byte
   420  	for _, serverRoot := range conf.General.Cluster.RootCAs {
   421  		rootCACert, err := loadPEM(serverRoot)
   422  		if err != nil {
   423  			logger.Panicf("Failed to load CA cert file '%s' (%s)", serverRoot, err)
   424  		}
   425  		clientRootCAs = append(clientRootCAs, rootCACert)
   426  	}
   427  
   428  	serverConf := comm.ServerConfig{
   429  		StreamInterceptors: generalConf.StreamInterceptors,
   430  		UnaryInterceptors:  generalConf.UnaryInterceptors,
   431  		ConnectionTimeout:  generalConf.ConnectionTimeout,
   432  		ServerStatsHandler: generalConf.ServerStatsHandler,
   433  		Logger:             generalConf.Logger,
   434  		KaOpts:             generalConf.KaOpts,
   435  		SecOpts: comm.SecureOptions{
   436  			TimeShift:         conf.General.Cluster.TLSHandshakeTimeShift,
   437  			CipherSuites:      comm.DefaultTLSCipherSuites,
   438  			ClientRootCAs:     clientRootCAs,
   439  			RequireClientCert: true,
   440  			Certificate:       cert,
   441  			UseTLS:            true,
   442  			Key:               key,
   443  		},
   444  	}
   445  
   446  	srv, err := comm.NewGRPCServer(bindAddr, serverConf)
   447  	if err != nil {
   448  		logger.Panicf("Failed creating gRPC server on %s:%d due to %v", clusterConf.ListenAddress, clusterConf.ListenPort, err)
   449  	}
   450  
   451  	return serverConf, srv
   452  }
   453  
   454  func initializeClusterClientConfig(conf *localconfig.TopLevel) comm.ClientConfig {
   455  	cc := comm.ClientConfig{
   456  		AsyncConnect: true,
   457  		KaOpts:       comm.DefaultKeepaliveOptions,
   458  		Timeout:      conf.General.Cluster.DialTimeout,
   459  		SecOpts:      comm.SecureOptions{},
   460  	}
   461  
   462  	if conf.General.Cluster.ClientCertificate == "" {
   463  		return cc
   464  	}
   465  
   466  	certFile := conf.General.Cluster.ClientCertificate
   467  	certBytes, err := ioutil.ReadFile(certFile)
   468  	if err != nil {
   469  		logger.Fatalf("Failed to load client TLS certificate file '%s' (%s)", certFile, err)
   470  	}
   471  
   472  	keyFile := conf.General.Cluster.ClientPrivateKey
   473  	keyBytes, err := ioutil.ReadFile(keyFile)
   474  	if err != nil {
   475  		logger.Fatalf("Failed to load client TLS key file '%s' (%s)", keyFile, err)
   476  	}
   477  
   478  	var serverRootCAs [][]byte
   479  	for _, serverRoot := range conf.General.Cluster.RootCAs {
   480  		rootCACert, err := ioutil.ReadFile(serverRoot)
   481  		if err != nil {
   482  			logger.Fatalf("Failed to load ServerRootCAs file '%s' (%s)", serverRoot, err)
   483  		}
   484  		serverRootCAs = append(serverRootCAs, rootCACert)
   485  	}
   486  
   487  	timeShift := conf.General.TLS.TLSHandshakeTimeShift
   488  	// XXX since this is a backport, release-2.1 is unlikely to see
   489  	// any new consensus plugin types, so hardcoding to 'etcdraft'
   490  	// note, this is only for a debug message and has no functional
   491  	// input. The parm is gone in master.
   492  	if reuseGrpcListener := reuseListener(conf, "etcdraft"); !reuseGrpcListener {
   493  		timeShift = conf.General.Cluster.TLSHandshakeTimeShift
   494  	}
   495  
   496  	cc.SecOpts = comm.SecureOptions{
   497  		TimeShift:         timeShift,
   498  		RequireClientCert: true,
   499  		CipherSuites:      comm.DefaultTLSCipherSuites,
   500  		ServerRootCAs:     serverRootCAs,
   501  		Certificate:       certBytes,
   502  		Key:               keyBytes,
   503  		UseTLS:            true,
   504  	}
   505  
   506  	return cc
   507  }
   508  
   509  func initializeServerConfig(conf *localconfig.TopLevel, metricsProvider metrics.Provider) comm.ServerConfig {
   510  	// secure server config
   511  	secureOpts := comm.SecureOptions{
   512  		UseTLS:            conf.General.TLS.Enabled,
   513  		RequireClientCert: conf.General.TLS.ClientAuthRequired,
   514  		TimeShift:         conf.General.TLS.TLSHandshakeTimeShift,
   515  	}
   516  	// check to see if TLS is enabled
   517  	if secureOpts.UseTLS {
   518  		msg := "TLS"
   519  		// load crypto material from files
   520  		serverCertificate, err := ioutil.ReadFile(conf.General.TLS.Certificate)
   521  		if err != nil {
   522  			logger.Fatalf("Failed to load server Certificate file '%s' (%s)",
   523  				conf.General.TLS.Certificate, err)
   524  		}
   525  		serverKey, err := ioutil.ReadFile(conf.General.TLS.PrivateKey)
   526  		if err != nil {
   527  			logger.Fatalf("Failed to load PrivateKey file '%s' (%s)",
   528  				conf.General.TLS.PrivateKey, err)
   529  		}
   530  		var serverRootCAs, clientRootCAs [][]byte
   531  		for _, serverRoot := range conf.General.TLS.RootCAs {
   532  			root, err := ioutil.ReadFile(serverRoot)
   533  			if err != nil {
   534  				logger.Fatalf("Failed to load ServerRootCAs file '%s' (%s)",
   535  					err, serverRoot)
   536  			}
   537  			serverRootCAs = append(serverRootCAs, root)
   538  		}
   539  		if secureOpts.RequireClientCert {
   540  			for _, clientRoot := range conf.General.TLS.ClientRootCAs {
   541  				root, err := ioutil.ReadFile(clientRoot)
   542  				if err != nil {
   543  					logger.Fatalf("Failed to load ClientRootCAs file '%s' (%s)",
   544  						err, clientRoot)
   545  				}
   546  				clientRootCAs = append(clientRootCAs, root)
   547  			}
   548  			msg = "mutual TLS"
   549  		}
   550  		secureOpts.Key = serverKey
   551  		secureOpts.Certificate = serverCertificate
   552  		secureOpts.ServerRootCAs = serverRootCAs
   553  		secureOpts.ClientRootCAs = clientRootCAs
   554  		logger.Infof("Starting orderer with %s enabled", msg)
   555  	}
   556  	kaOpts := comm.DefaultKeepaliveOptions
   557  	// keepalive settings
   558  	// ServerMinInterval must be greater than 0
   559  	if conf.General.Keepalive.ServerMinInterval > time.Duration(0) {
   560  		kaOpts.ServerMinInterval = conf.General.Keepalive.ServerMinInterval
   561  	}
   562  	kaOpts.ServerInterval = conf.General.Keepalive.ServerInterval
   563  	kaOpts.ServerTimeout = conf.General.Keepalive.ServerTimeout
   564  
   565  	commLogger := flogging.MustGetLogger("core.comm").With("server", "Orderer")
   566  
   567  	if metricsProvider == nil {
   568  		metricsProvider = &disabled.Provider{}
   569  	}
   570  
   571  	return comm.ServerConfig{
   572  		SecOpts:            secureOpts,
   573  		KaOpts:             kaOpts,
   574  		Logger:             commLogger,
   575  		ServerStatsHandler: comm.NewServerStatsHandler(metricsProvider),
   576  		ConnectionTimeout:  conf.General.ConnectionTimeout,
   577  		StreamInterceptors: []grpc.StreamServerInterceptor{
   578  			grpcmetrics.StreamServerInterceptor(grpcmetrics.NewStreamMetrics(metricsProvider)),
   579  			grpclogging.StreamServerInterceptor(flogging.MustGetLogger("comm.grpc.server").Zap()),
   580  		},
   581  		UnaryInterceptors: []grpc.UnaryServerInterceptor{
   582  			grpcmetrics.UnaryServerInterceptor(grpcmetrics.NewUnaryMetrics(metricsProvider)),
   583  			grpclogging.UnaryServerInterceptor(
   584  				flogging.MustGetLogger("comm.grpc.server").Zap(),
   585  				grpclogging.WithLeveler(grpclogging.LevelerFunc(grpcLeveler)),
   586  			),
   587  		},
   588  	}
   589  }
   590  
   591  func grpcLeveler(ctx context.Context, fullMethod string) zapcore.Level {
   592  	switch fullMethod {
   593  	case "/orderer.Cluster/Step":
   594  		return flogging.DisabledLevel
   595  	default:
   596  		return zapcore.InfoLevel
   597  	}
   598  }
   599  
   600  func extractBootstrapBlock(conf *localconfig.TopLevel) *cb.Block {
   601  	var bootstrapBlock *cb.Block
   602  
   603  	// Select the bootstrapping mechanism
   604  	switch conf.General.BootstrapMethod {
   605  	case "file": // For now, "file" is the only supported genesis method
   606  		bootstrapBlock = file.New(conf.General.BootstrapFile).GenesisBlock()
   607  	case "none": // simply honor the configuration value
   608  		return nil
   609  	default:
   610  		logger.Panic("Unknown genesis method:", conf.General.BootstrapMethod)
   611  	}
   612  
   613  	return bootstrapBlock
   614  }
   615  
   616  func initializeBootstrapChannel(genesisBlock *cb.Block, lf blockledger.Factory) {
   617  	chainID, err := protoutil.GetChainIDFromBlock(genesisBlock)
   618  	if err != nil {
   619  		logger.Fatal("Failed to parse channel ID from genesis block:", err)
   620  	}
   621  	gl, err := lf.GetOrCreate(chainID)
   622  	if err != nil {
   623  		logger.Fatal("Failed to create the system channel:", err)
   624  	}
   625  
   626  	if err := gl.Append(genesisBlock); err != nil {
   627  		logger.Fatal("Could not write genesis block to ledger:", err)
   628  	}
   629  }
   630  
   631  func isClusterType(genesisBlock *cb.Block, bccsp bccsp.BCCSP) bool {
   632  	_, exists := clusterTypes[consensusType(genesisBlock, bccsp)]
   633  	return exists
   634  }
   635  
   636  func consensusType(genesisBlock *cb.Block, bccsp bccsp.BCCSP) string {
   637  	if genesisBlock == nil || genesisBlock.Data == nil || len(genesisBlock.Data.Data) == 0 {
   638  		logger.Fatalf("Empty genesis block")
   639  	}
   640  	env := &cb.Envelope{}
   641  	if err := proto.Unmarshal(genesisBlock.Data.Data[0], env); err != nil {
   642  		logger.Fatalf("Failed to unmarshal the genesis block's envelope: %v", err)
   643  	}
   644  	bundle, err := channelconfig.NewBundleFromEnvelope(env, bccsp)
   645  	if err != nil {
   646  		logger.Fatalf("Failed creating bundle from the genesis block: %v", err)
   647  	}
   648  	ordConf, exists := bundle.OrdererConfig()
   649  	if !exists {
   650  		logger.Fatalf("Orderer config doesn't exist in bundle derived from genesis block")
   651  	}
   652  	return ordConf.ConsensusType()
   653  }
   654  
   655  func initializeGrpcServer(conf *localconfig.TopLevel, serverConfig comm.ServerConfig) *comm.GRPCServer {
   656  	lis, err := net.Listen("tcp", fmt.Sprintf("%s:%d", conf.General.ListenAddress, conf.General.ListenPort))
   657  	if err != nil {
   658  		logger.Fatal("Failed to listen:", err)
   659  	}
   660  
   661  	// Create GRPC server - return if an error occurs
   662  	grpcServer, err := comm.NewGRPCServerFromListener(lis, serverConfig)
   663  	if err != nil {
   664  		logger.Fatal("Failed to return new GRPC server:", err)
   665  	}
   666  
   667  	return grpcServer
   668  }
   669  
   670  func loadLocalMSP(conf *localconfig.TopLevel) msp.MSP {
   671  	// MUST call GetLocalMspConfig first, so that default BCCSP is properly
   672  	// initialized prior to LoadByType.
   673  	mspConfig, err := msp.GetLocalMspConfig(conf.General.LocalMSPDir, conf.General.BCCSP, conf.General.LocalMSPID)
   674  	if err != nil {
   675  		logger.Panicf("Failed to get local msp config: %v", err)
   676  	}
   677  
   678  	typ := msp.ProviderTypeToString(msp.FABRIC)
   679  	opts, found := msp.Options[typ]
   680  	if !found {
   681  		logger.Panicf("MSP option for type %s is not found", typ)
   682  	}
   683  
   684  	localmsp, err := msp.New(opts, factory.GetDefault())
   685  	if err != nil {
   686  		logger.Panicf("Failed to load local MSP: %v", err)
   687  	}
   688  
   689  	if err = localmsp.Setup(mspConfig); err != nil {
   690  		logger.Panicf("Failed to setup local msp with config: %v", err)
   691  	}
   692  
   693  	return localmsp
   694  }
   695  
   696  //go:generate counterfeiter -o mocks/health_checker.go -fake-name HealthChecker . healthChecker
   697  
   698  // HealthChecker defines the contract for health checker
   699  type healthChecker interface {
   700  	RegisterChecker(component string, checker healthz.HealthChecker) error
   701  }
   702  
   703  func initializeMultichannelRegistrar(
   704  	bootstrapBlock *cb.Block,
   705  	ri *replicationInitiator,
   706  	clusterDialer *cluster.PredicateDialer,
   707  	srvConf comm.ServerConfig,
   708  	srv *comm.GRPCServer,
   709  	conf *localconfig.TopLevel,
   710  	signer identity.SignerSerializer,
   711  	metricsProvider metrics.Provider,
   712  	healthChecker healthChecker,
   713  	lf blockledger.Factory,
   714  	bccsp bccsp.BCCSP,
   715  	callbacks ...channelconfig.BundleActor,
   716  ) *multichannel.Registrar {
   717  
   718  	registrar := multichannel.NewRegistrar(*conf, lf, signer, metricsProvider, bccsp, callbacks...)
   719  
   720  	consenters := map[string]consensus.Consenter{}
   721  
   722  	var icr etcdraft.InactiveChainRegistry
   723  	if conf.General.BootstrapMethod == "file" && isClusterType(bootstrapBlock, bccsp) {
   724  		etcdConsenter := initializeEtcdraftConsenter(consenters, conf, lf, clusterDialer, bootstrapBlock, ri, srvConf, srv, registrar, metricsProvider, bccsp)
   725  		icr = etcdConsenter.InactiveChainRegistry
   726  	}
   727  
   728  	consenters["solo"] = solo.New()
   729  	var kafkaMetrics *kafka.Metrics
   730  	consenters["kafka"], kafkaMetrics = kafka.New(conf.Kafka, metricsProvider, healthChecker, icr, registrar.CreateChain)
   731  	// Note, we pass a 'nil' channel here, we could pass a channel that
   732  	// closes if we wished to cleanup this routine on exit.
   733  	go kafkaMetrics.PollGoMetricsUntilStop(time.Minute, nil)
   734  	registrar.Initialize(consenters)
   735  	return registrar
   736  }
   737  
   738  func initializeEtcdraftConsenter(
   739  	consenters map[string]consensus.Consenter,
   740  	conf *localconfig.TopLevel,
   741  	lf blockledger.Factory,
   742  	clusterDialer *cluster.PredicateDialer,
   743  	bootstrapBlock *cb.Block,
   744  	ri *replicationInitiator,
   745  	srvConf comm.ServerConfig,
   746  	srv *comm.GRPCServer,
   747  	registrar *multichannel.Registrar,
   748  	metricsProvider metrics.Provider,
   749  	bccsp bccsp.BCCSP,
   750  ) *etcdraft.Consenter {
   751  	replicationRefreshInterval := conf.General.Cluster.ReplicationBackgroundRefreshInterval
   752  	if replicationRefreshInterval == 0 {
   753  		replicationRefreshInterval = defaultReplicationBackgroundRefreshInterval
   754  	}
   755  
   756  	systemChannelName, err := protoutil.GetChainIDFromBlock(bootstrapBlock)
   757  	if err != nil {
   758  		ri.logger.Panicf("Failed extracting system channel name from bootstrap block: %v", err)
   759  	}
   760  	systemLedger, err := lf.GetOrCreate(systemChannelName)
   761  	if err != nil {
   762  		ri.logger.Panicf("Failed obtaining system channel (%s) ledger: %v", systemChannelName, err)
   763  	}
   764  	getConfigBlock := func() *cb.Block {
   765  		return multichannel.ConfigBlock(systemLedger)
   766  	}
   767  
   768  	exponentialSleep := exponentialDurationSeries(replicationBackgroundInitialRefreshInterval, replicationRefreshInterval)
   769  	ticker := newTicker(exponentialSleep)
   770  
   771  	icr := &inactiveChainReplicator{
   772  		logger:                            logger,
   773  		scheduleChan:                      ticker.C,
   774  		quitChan:                          make(chan struct{}),
   775  		replicator:                        ri,
   776  		chains2CreationCallbacks:          make(map[string]chainCreation),
   777  		retrieveLastSysChannelConfigBlock: getConfigBlock,
   778  		registerChain:                     ri.registerChain,
   779  	}
   780  
   781  	// Use the inactiveChainReplicator as a channel lister, since it has knowledge
   782  	// of all inactive chains.
   783  	// This is to prevent us pulling the entire system chain when attempting to enumerate
   784  	// the channels in the system.
   785  	ri.channelLister = icr
   786  
   787  	go icr.run()
   788  	raftConsenter := etcdraft.New(clusterDialer, conf, srvConf, srv, registrar, icr, metricsProvider, bccsp)
   789  	consenters["etcdraft"] = raftConsenter
   790  	return raftConsenter
   791  }
   792  
   793  func newOperationsSystem(ops localconfig.Operations, metrics localconfig.Metrics) *operations.System {
   794  	return operations.NewSystem(operations.Options{
   795  		Logger:        flogging.MustGetLogger("orderer.operations"),
   796  		ListenAddress: ops.ListenAddress,
   797  		Metrics: operations.MetricsOptions{
   798  			Provider: metrics.Provider,
   799  			Statsd: &operations.Statsd{
   800  				Network:       metrics.Statsd.Network,
   801  				Address:       metrics.Statsd.Address,
   802  				WriteInterval: metrics.Statsd.WriteInterval,
   803  				Prefix:        metrics.Statsd.Prefix,
   804  			},
   805  		},
   806  		TLS: operations.TLS{
   807  			Enabled:            ops.TLS.Enabled,
   808  			CertFile:           ops.TLS.Certificate,
   809  			KeyFile:            ops.TLS.PrivateKey,
   810  			ClientCertRequired: ops.TLS.ClientAuthRequired,
   811  			ClientCACertFiles:  ops.TLS.ClientRootCAs,
   812  		},
   813  		Version: metadata.Version,
   814  	})
   815  }
   816  
   817  // caMgr manages certificate authorities scoped by channel
   818  type caManager struct {
   819  	sync.Mutex
   820  	appRootCAsByChain     map[string][][]byte
   821  	ordererRootCAsByChain map[string][][]byte
   822  	clientRootCAs         [][]byte
   823  }
   824  
   825  func (mgr *caManager) updateTrustedRoots(
   826  	cm channelconfig.Resources,
   827  	servers ...*comm.GRPCServer,
   828  ) {
   829  	mgr.Lock()
   830  	defer mgr.Unlock()
   831  
   832  	appRootCAs := [][]byte{}
   833  	ordererRootCAs := [][]byte{}
   834  	appOrgMSPs := make(map[string]struct{})
   835  	ordOrgMSPs := make(map[string]struct{})
   836  
   837  	if ac, ok := cm.ApplicationConfig(); ok {
   838  		//loop through app orgs and build map of MSPIDs
   839  		for _, appOrg := range ac.Organizations() {
   840  			appOrgMSPs[appOrg.MSPID()] = struct{}{}
   841  		}
   842  	}
   843  
   844  	if ac, ok := cm.OrdererConfig(); ok {
   845  		//loop through orderer orgs and build map of MSPIDs
   846  		for _, ordOrg := range ac.Organizations() {
   847  			ordOrgMSPs[ordOrg.MSPID()] = struct{}{}
   848  		}
   849  	}
   850  
   851  	if cc, ok := cm.ConsortiumsConfig(); ok {
   852  		for _, consortium := range cc.Consortiums() {
   853  			//loop through consortium orgs and build map of MSPIDs
   854  			for _, consortiumOrg := range consortium.Organizations() {
   855  				appOrgMSPs[consortiumOrg.MSPID()] = struct{}{}
   856  			}
   857  		}
   858  	}
   859  
   860  	cid := cm.ConfigtxValidator().ChannelID()
   861  	logger.Debugf("updating root CAs for channel [%s]", cid)
   862  	msps, err := cm.MSPManager().GetMSPs()
   863  	if err != nil {
   864  		logger.Errorf("Error getting root CAs for channel %s (%s)", cid, err)
   865  		return
   866  	}
   867  	for k, v := range msps {
   868  		// check to see if this is a FABRIC MSP
   869  		if v.GetType() == msp.FABRIC {
   870  			for _, root := range v.GetTLSRootCerts() {
   871  				// check to see of this is an app org MSP
   872  				if _, ok := appOrgMSPs[k]; ok {
   873  					logger.Debugf("adding app root CAs for MSP [%s]", k)
   874  					appRootCAs = append(appRootCAs, root)
   875  				}
   876  				// check to see of this is an orderer org MSP
   877  				if _, ok := ordOrgMSPs[k]; ok {
   878  					logger.Debugf("adding orderer root CAs for MSP [%s]", k)
   879  					ordererRootCAs = append(ordererRootCAs, root)
   880  				}
   881  			}
   882  			for _, intermediate := range v.GetTLSIntermediateCerts() {
   883  				// check to see of this is an app org MSP
   884  				if _, ok := appOrgMSPs[k]; ok {
   885  					logger.Debugf("adding app root CAs for MSP [%s]", k)
   886  					appRootCAs = append(appRootCAs, intermediate)
   887  				}
   888  				// check to see of this is an orderer org MSP
   889  				if _, ok := ordOrgMSPs[k]; ok {
   890  					logger.Debugf("adding orderer root CAs for MSP [%s]", k)
   891  					ordererRootCAs = append(ordererRootCAs, intermediate)
   892  				}
   893  			}
   894  		}
   895  	}
   896  	mgr.appRootCAsByChain[cid] = appRootCAs
   897  	mgr.ordererRootCAsByChain[cid] = ordererRootCAs
   898  
   899  	// now iterate over all roots for all app and orderer chains
   900  	trustedRoots := [][]byte{}
   901  	for _, roots := range mgr.appRootCAsByChain {
   902  		trustedRoots = append(trustedRoots, roots...)
   903  	}
   904  	for _, roots := range mgr.ordererRootCAsByChain {
   905  		trustedRoots = append(trustedRoots, roots...)
   906  	}
   907  	// also need to append statically configured root certs
   908  	if len(mgr.clientRootCAs) > 0 {
   909  		trustedRoots = append(trustedRoots, mgr.clientRootCAs...)
   910  	}
   911  
   912  	// now update the client roots for the gRPC server
   913  	for _, srv := range servers {
   914  		err = srv.SetClientRootCAs(trustedRoots)
   915  		if err != nil {
   916  			msg := "Failed to update trusted roots for orderer from latest config " +
   917  				"block.  This orderer may not be able to communicate " +
   918  				"with members of channel %s (%s)"
   919  			logger.Warningf(msg, cm.ConfigtxValidator().ChannelID(), err)
   920  		}
   921  	}
   922  }
   923  
   924  func (mgr *caManager) updateClusterDialer(
   925  	clusterDialer *cluster.PredicateDialer,
   926  	localClusterRootCAs [][]byte,
   927  ) {
   928  	mgr.Lock()
   929  	defer mgr.Unlock()
   930  
   931  	// Iterate over all orderer root CAs for all chains and add them
   932  	// to the root CAs
   933  	var clusterRootCAs [][]byte
   934  	for _, roots := range mgr.ordererRootCAsByChain {
   935  		clusterRootCAs = append(clusterRootCAs, roots...)
   936  	}
   937  
   938  	// Add the local root CAs too
   939  	clusterRootCAs = append(clusterRootCAs, localClusterRootCAs...)
   940  	// Update the cluster config with the new root CAs
   941  	clusterDialer.UpdateRootCAs(clusterRootCAs)
   942  }
   943  
   944  func prettyPrintStruct(i interface{}) {
   945  	params := localconfig.Flatten(i)
   946  	var buffer bytes.Buffer
   947  	for i := range params {
   948  		buffer.WriteString("\n\t")
   949  		buffer.WriteString(params[i])
   950  	}
   951  	logger.Infof("Orderer config values:%s\n", buffer.String())
   952  }