區塊鏈:Hyperledger Fabric共識排序

一、共識

  • 交易背書(模擬 @Endorser)
  • 交易排序(排序 @Orderer)
  • 交易驗證(驗證 @Committer)

二、排序節點功能

1. 交易排序

  • 目的:保證系統交易順序的一致性
  • solo:   單節點排序, 所見即所得
  • kafka: 外置消息隊列保證一致性

2. 區塊分發

  • 中間狀態區塊
  • 有效交易&無效交易

3. 多通道

 

三、fabric目錄結構

bccsp

密碼學:加密,簽名,證書等等

bddtest

行爲驅動開發

繡球 高腰設計 詳細設計 開發

common

公共庫

  • 錯誤處理
  • 日誌處理
  • 賬本存儲
  • 各種工具

core

核心庫

devnev

開發環境、Vagrant

docs

文檔相關

event

事件監聽機制

examples

一些例子

gossip

最終一致性共識算法,用於組織內部區塊同步

images

dockers鏡像打包

MSP

成員服務管理

orderer

排序節點入口

peer

peer節點入口

proposals

新功能提案

protos

grpc : protobuffer + rpc

jsonrpc: json + rpc

四、Orderer 源碼分析

1. main入口

func main() {
	kingpin.Version("0.0.1")
	switch kingpin.MustParse(app.Parse(os.Args[1:])) {
	// "start" command
	case start.FullCommand():
		logger.Infof("Starting %s", metadata.GetVersionInfo())
		// 載入配置信息
		conf := config.Load()
		// 初始化日誌級別
		initializeLoggingLevel(conf)
		// 初始化profile
		initializeProfilingService(conf)
		// 初始化grpc服務端
		grpcServer := initializeGrpcServer(conf)
		// 載入msp證書
		initializeLocalMsp(conf)
		// msp證書用於簽名實例化
		signer := localmsp.NewSigner()
		// 初始化多鏈manager
		manager := initializeMultiChainManager(conf, signer)
		// 實例化服務實現
		server := NewServer(manager, signer)
		// 綁定服務器 + 服務實現
		ab.RegisterAtomicBroadcastServer(grpcServer.Server(), server)
		logger.Info("Beginning to serve requests")
        // 啓動服務
		grpcServer.Start()
	// "version" command
	case version.FullCommand():
		fmt.Println(metadata.GetVersionInfo())
	}
}

2. 初始化多鏈manager

func initializeMultiChainManager(conf *config.TopLevel, signer crypto.LocalSigner) multichain.Manager {
	// 創建賬本工廠 臨時區塊 file json ram
	lf, _ := createLedgerFactory(conf)
	// Are we bootstrapping?
	// 是否有鏈
	if len(lf.ChainIDs()) == 0 {
		// 啓動引導
		initializeBootstrapChannel(conf, lf)
	} else {
		logger.Info("Not bootstrapping because of existing chains")
	}
	// 實例化共識機制
	consenters := make(map[string]multichain.Consenter)
	consenters["solo"] = solo.New()
	consenters["kafka"] = kafka.New(conf.Kafka.TLS, conf.Kafka.Retry, conf.Kafka.Version)
	// 實例化manager 
	return multichain.NewManagerImpl(lf, consenters, signer)
}

3. 實例化服務器 

Server方法實例化了server內部類,裏面含有兩個成員變量

type server struct {
	bh broadcast.Handler    // 交易收集
	dh deliver.Handler    // 區塊擴散
}

4. Manager

manager接口

// Manager coordinates the creation and access of chains
type Manager interface {
	// GetChain retrieves the chain support for a chain (and whether it exists)
	// 獲取鏈對象
	GetChain(chainID string) (ChainSupport, bool)

	// SystemChannelID returns the channel ID for the system channel
	// 獲取系統鏈名
	SystemChannelID() string

	// NewChannelConfig returns a bare bones configuration ready for channel
	// creation request to be applied on top of it
	// 生成鏈的配置
	NewChannelConfig(envConfigUpdate *cb.Envelope) (configtxapi.Manager, error)
}

manager的實現類

// manager的實現
type multiLedger struct {
	chains          map[string]*chainSupport //多鏈對象
	consenters      map[string]Consenter	 //共識機制
	ledgerFactory   ledger.Factory			 //賬本讀寫工廠
	signer          crypto.LocalSigner		 //簽名
	systemChannelID string					 //系統簽名
	systemChannel   *chainSupport			 //系統鏈
}

總結

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章