当前位置:首页区块链hyperledger fabric 结构分析(二)

hyperledger fabric 结构分析(二)


接着上图分析,经过Consensus Commit流程生成批数据后,是如何送入到ChainCode呢?我们还是以Inoke命令分析。

1)在consensus的helper中调用chaincode的ExecuteTransactions 进入transaction处理流程

[cpp] 代码
func (h *Helper) ExecTxs(id interface{}, txs []*pb.Transaction) ([]byte, error) {
succeededTxs, res, cceents, txerrs, err := chaincode.ExecuteTransactions(context.Background(), chaincode.DefaultChain, txs)
}

2)该函数在core/chaincode 中处理,将命令封装成ChainCode识别的格式。其中的chain对象则是访问ChainCode对应的ChainCodeSupport,这样就说明访问ChainCode的接口类是ChainCodeSupportSerer。

[cpp] 代码
func Execute(ctxt context.Context, chain *ChaincodeSupport, t *pb.Transaction) ([]byte, *pb.ChaincodeEent, error) {
ccMsg, err = createTransactionMessage(t.Txid, cMsg)
resp, err := chain.Execute(ctxt, chaincode, ccMsg, timeout, t)
}

3)该函数在ChainCodeSupport文件中,首先检测ChainCode是否建立成功、能否正常运行。其中chrte.handler的得来是比较复杂的,见下描述

[cpp] 代码
func (chaincodeSupport *ChaincodeSupport) Execute(ctxt context.Context, chaincode string, msg *pb.ChaincodeMessage, timeout time.Duration, tx *pb.Transaction) (*pb.ChaincodeMessage, error) {
chrte, ok := chaincodeSupport.chaincodeHasBeenLaunched(chaincode)
chrte.handler.sendExecuteMessage(msg, tx)
}

3.1)在创建ChainCodeSupport的时候registerChaincodeSupport 调用 NewChaincodeSupport 实例化ChainCodeSupport(start.Go),服务器的Name:

[cpp] 代码
protos.ChaincodeSupport

[cpp] 代码
ccStartupTimeout := time.Duration(tOut) * time.Millisecond

ccSr := chaincode.NewChaincodeSupport(chainname, peer.GetPeerEndpoint, userRunsCC,
ccStartupTimeout, secHelper)

//Now that chaincode is initialized, register all system chaincodes.
system_chaincode.RegisterSysCCs()

pb.RegisterChaincodeSupportSerer(grpcSerer, ccSr)

[cpp] 代码
ar _ChaincodeSupport_sericeDesc = grpc.SericeDesc{
SericeName: “protos.ChaincodeSupport”,
HandlerType: (*ChaincodeSupportSerer)(nil),
METHods: []grpc.METHodDesc{},
Streams: []grpc.StreamDesc{
{
StreamName: “Register”,
Handler: _ChaincodeSupport_Register_Handler,
SererStreams: true,
ClientStreams: true,
},
},
}

3.2)ChainCode 调用 err := shim.Start(new(SimpleChaincode)) 接入到ChainCodeSupportSerer


[cpp] 代码
err := shim.Start(new(SimpleChaincode))

3.3)连接ChainCodeSupprotSerer同时调用Register函数

[cpp] 代码
func Start(cc Chaincode) error {
chaincodeSupportClient := pb.NewChaincodeSupportClient(clientConn)
stream, err := chaincodeSupportClient.Register(context.Background())
err = chatWithPeer(chaincodename, stream, cc)
}

3.4)与此同时ChainCodeSupportSerer会根据Client调用注册函数创建该Stream的Handler处理句柄,创建消息响应循环,等待Client发送命令.(注意该handler就是我们关心的
handler.sendExecuteMessage)

[cpp] 代码
func HandleChaincodeStream(chaincodeSupport *ChaincodeSupport, ctxt context.Context, stream ccintf.ChaincodeStream) error {lt;/spangt;

[cpp] 代码
deadline, ok := ctxt.Deadline()
chaincodeLogger.Debugf(“Current context deadline = %s, ok = %”, deadline, ok)
handler := newChaincodeSupportHandler(chaincodeSupport, stream)
return handler.processStream()
}

3.5) 客户端shim/Chaincode发送RegisterMessage

[cpp] 代码
handler.serialSend(AMPLpb.ChaincodeMessage{Type: pb.ChaincodeMessage_REGISTER, Payload: payload})

3.6)对于Serer而言,我们刚刚创建了handler又有ProcessStream消息响应循环,这样RegisterMessage就交到了ProcessStream手里,ProcessStream根据消息类执行命令分发
调用beforeRegisterEent函数。

[cpp] 代码
func (handler *Handler) beforeRegisterEent(e *fsm.Eent, state string) {
err = handler.chaincodeSupport.registerHandler(handler)
}

3.7)同理在client端(shim/chaincode)也建立响应的消息响应循环。

4)到目前为止还没有完,我们将inoke命令送给了Client的委托模块Shim进行处理。Shim模块根据来访事件类送入指定处理函数
[cpp] 代码
func (handler *Handler) enterTransactionState(e *fsm.Eent) {
msg, ok := e.Args[0].(*pb.ChaincodeMessage)
if !ok {
e.Cancel(fmt.Errorf(“Receied unexpected message type”))
return
}
chaincodeLogger.Debugf(“[%s]Receied %s, inoking transaction on chaincode(Src:%s, Dst:%s)”, shorttxid(msg.Txid), msg.Type.String(), e.Src, e.Dst)
if msg.Type.String() == pb.ChaincodeMessage_TRANSACTION.String() {
// Call the chaincode’s Run function to inoke transaction
handler.handleTransaction(msg)
}
}

5)调用ChainCode的inoke函数
[cpp] 代码
func (handler *Handler) handleTransaction(msg *pb.ChaincodeMessage) {
res, err := handler.cc.Inoke(stub, function, params)
}

以上分析涉及两个过程 1) consensus结束后如何将命令送入ChainCode 2)ChainCodeSupportSerer与ChainCode如何建立通信关系。

画一个 ChainCodeSupportSerer与ChainCode如何建立通信关系 图:


温馨提示:

文章标题:hyperledger fabric 结构分析(二)

文章链接:https://www.btchangqing.cn/2762.html

更新时间:2022年09月28日

本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。

hyperledger fabric 结构分析(二)
区块链

区块链核心技术:委任权益证明算法DPoS

2020-4-6 17:24:10

区块链

IBM HyperLedger fabric 详解

2020-4-6 17:25:57

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索