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 }