了解链码/对等方与分类帐的本地副本之间的交互

时间:2019-04-27 09:44:23

标签: hyperledger-fabric

问题1:

链码(hyperledger/fabric/examples/chaincode/go/examplexx/chaincode.go)通过ChaincodeStubInterface访问分类帐,例如stub.GetState(.)stub.PutState(.)

ChaincodeStubInterfacehyperledger/fabric/core/chaincode/shim/chaincode.go实现。

如果我正确看到它,则{{1}的stubPutState创建的GetState使用的handleInit(.)

hyperledger/fabric/core/chaincode/shim/handler.go

stub := new(ChaincodeStub)handleInit调用,handleReadyhandleMessage调用,chatWithPeerStarthyperledger/fabric/core/chaincode/shim/chaincode.go)调用由main的{​​{1}}函数调用

a)此hyperledger/fabric/examples/chaincode/go/examplexx/cmd/main.go函数是通过哪个命令调用的?通过main吗?

b)然后在结构代码中的哪个位置获取此$peer chaincode install函数,然后调用它(我对某些指针感到高兴)。

问题2:

假设main调用$peer chaincode invoke .. '{"Args":["yy","a","b","10"]}'yy)文件中的chaincode.go事务方法。假设此交易执行了一个hyperledger/fabric/examples/chaincode/go/examplexx/chaincode.go,调用了stub.GetState(.)

a)这种处理程序是链码和对等/分类帐之间的中间人吗?

b)处理程序是否属于同级?如果是,是每个对等方有一个处理程序,还是有多个处理程序(每个链码一个)?

c)该处理程序何时实例化?

d)何时实例化对等方的本地分类帐副本?

我知道这些有很多问题。但是我对一些提示感到非常高兴,这样我就可以弄清楚分类账的本地副本是如何创建的,以及链码/对等方如何与之通信。谢谢!

1 个答案:

答案 0 :(得分:0)

  

a)这个主要功能是通过哪个命令调用的?由$ peer   安装chaincode?      

b)然后在结构代码中获取此主要功能的位置称为(I   会为一些指针感到高兴)。

主要功能在对等代码中定义。当对等方决定运行chaincode容器时,它仅运行chaincode填充程序(golang,java,node.js)的docker映像,并仅运行命令according to the chaincode language

    switch ccType {
    case pb.ChaincodeSpec_GOLANG.String(), pb.ChaincodeSpec_CAR.String():
        lc.Args = []string{"chaincode", fmt.Sprintf("-peer.address=%s", c.PeerAddress)}
    case pb.ChaincodeSpec_JAVA.String():
        lc.Args = []string{"/root/chaincode-java/start", "--peerAddress", c.PeerAddress}
    case pb.ChaincodeSpec_NODE.String():
        lc.Args = []string{"/bin/sh", "-c", fmt.Sprintf("cd /usr/local/src; npm start -- --peer.address %s", c.PeerAddress)}
default:
  

a)这种处理程序是链码和   同行/分类帐?

     

b)处理程序是否属于同级?如果是,每个人有一个处理程序吗   对等还是有多个处理程序(每个链码一个)?

     

c)该处理程序何时实例化?

     

d)何时实例化对等方的本地分类帐副本?

否,GetState实际上是在本地链码填充程序上而不是在同级上调用一个函数。然后,链码填充程序(在其容器中运行)通过专用的gRPC流将消息发送给对等方,然后对等方从数据库中读取密钥的值,并将结果发送回链码填充程序中到gRPC流,链码填充程序在其中等待结果。

对于处理程序-每个链码的对等体上都有一个handler

现在,这一切都在签注时间(链码的计算)中得到了解决-但是在签注期间永远不会更新本地数据库。 链码执行完成后,客户端将事务发送给订购者,然后订购者创建一个新块并将其写入其文件系统。

然后,对等方拉出该块,检查执行链码的对等方的签名(来自背书),如果签名有效,则更新其本地数据库。