一、共識
- 交易背書(模擬 @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 //系統鏈
}
總結