日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

一 hyperledger fabric 結(jié)構(gòu)分析是什么?hyperledger fabric的架構(gòu)設(shè)計(jì)指的什么?( 二 )


HandlerType: (*DevopsServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: Login,
Handler:_Devops_Login_Handler,
},
{
MethodName: Build,
Handler:_Devops_Build_Handler,
},
{
MethodName: Deploy,
Handler:_Devops_Deploy_Handler,
},
{
MethodName: Invoke,
Handler:_Devops_Invoke_Handler,
},
{
MethodName: Query,
Handler:_Devops_Query_Handler,
},
{
MethodName: EXP_GetApplicationTCert,
Handler:_Devops_EXP_GetApplicationTCert_Handler,
},
{
MethodName: EXP_PrepareForTx,
Handler:_Devops_EXP_PrepareForTx_Handler,
},
{
MethodName: EXP_ProduceSigma,
Handler:_Devops_EXP_ProduceSigma_Handler,
},
{
MethodName: EXP_ExecuteWithBinding,
Handler:_Devops_EXP_ExecuteWithBinding_Handler,
},
},
Streams: []grpc.StreamDesc{},
}
3)其中_Devops_Invoke_Handler函數(shù)在Protos模塊,其負(fù)責(zé)將Client接入的信息傳遞到對(duì)應(yīng)的Server模塊
func _Devops_Invoke_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error) (interface{}, error) {
in := new(ChaincodeInvocationSpec)
if err := dec(in); err != nil {
return nil, err
}
out, err := srv.(DevopsServer).Invoke(ctx, in)
if err != nil {
return nil, err
}
return out, nil
}
4)在函數(shù)在devops服務(wù)端代碼中處理
func (d *Devops) Invoke(ctx context.Context, chaincodeInvocationSpec *pb.ChaincodeInvocationSpec) (*pb.Response, error) {
return d.invokeOrQuery(ctx, chaincodeInvocationSpec, chaincodeInvocationSpec.ChaincodeSpec.Attributes, true)
}
5)精簡(jiǎn)invokeOrQuery代碼,d.coord 是PeerServer對(duì)象,ExecuteTransaction 是對(duì)應(yīng)Engine的實(shí)現(xiàn)方法
func (d *Devops) invokeOrQuery(ctx context.Context, chaincodeInvocationSpec *pb.ChaincodeInvocationSpec, attributes []string, invoke bool) (*pb.Response, error) {
resp := d.coord.ExecuteTransaction(transaction)
}
6)本次請(qǐng)求被封裝成交易Struct,該處理是在PeerServer中 。
func (p *Impl) ExecuteTransaction(transaction *pb.Transaction) (response *pb.Response) {
if p.isValidator {
response = p.sendTransactionsToLocalEngine(transaction)
} else {
peerAddresses := p.discHelper.GetRandomNodes(1)
response = p.SendTransactionsToPeer(peerAddresses[0], transaction)
}
return response
}
7)思考可知,最終這筆transaction是要交給到Consensus進(jìn)行處理,那么如何傳遞的呢?就在下面p.engine.ProcessTransactionMsg,其中p代指PeerServer,engine是在創(chuàng)建PeerServer的時(shí)候指定的Engine,而這個(gè)Engine的handler實(shí)現(xiàn)在Consensus里,在實(shí)現(xiàn)EngineHandler過程中加載了PBFT算法 。所以ProcessTransactionMsg函數(shù)的實(shí)現(xiàn)在consensus模塊engine代碼里 。這樣解決了開始時(shí)提出的疑問3) 。
func (p *Impl) sendTransactionsToLocalEngine(transaction *pb.Transaction) *pb.Response {
peerLogger.Debugf(Marshalling transaction %s to send to local engine, transaction.Type)
data, err := proto.Marshal(transaction)
if err != nil {
return pb.Response{Status: pb.Response_FAILURE, Msg: []byte(fmt.Sprintf(Error sending transaction to local engine: %s, err))}
}
var response *pb.Response
msg := pb.Message{Type: pb.Message_CHAIN_TRANSACTION, Payload: data, Timestamp: util.CreateUtcTimestamp()}
peerLogger.Debugf(Sending message %s with timestamp %v to local engine, msg.Type, msg.Timestamp)
response = p.engine.ProcessTransactionMsg(msg, transaction)
return response
}
8)從這里開始進(jìn)入了consensus內(nèi)部處理,在這里Consensus模塊是單獨(dú)分析 。
func (eng *EngineImpl) ProcessTransactionMsg(msg *pb.Message, tx *pb.Transaction) (response *pb.Response) {
err := eng.consenter.RecvMsg(msg, eng.peerEndpoint.ID)

推薦閱讀