问题1:
链码(hyperledger/fabric/examples/chaincode/go/examplexx/chaincode.go
)通过ChaincodeStubInterface
访问分类帐,例如stub.GetState(.)
,stub.PutState(.)
。
ChaincodeStubInterface
由hyperledger/fabric/core/chaincode/shim/chaincode.go
实现。
如果我正确看到它,则{{1}的stub
和PutState
创建的GetState
使用的handleInit(.)
:
hyperledger/fabric/core/chaincode/shim/handler.go
stub := new(ChaincodeStub)
由handleInit
调用,handleReady
由handleMessage
调用,chatWithPeer
由Start
(hyperledger/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)何时实例化对等方的本地分类帐副本?
我知道这些有很多问题。但是我对一些提示感到非常高兴,这样我就可以弄清楚分类账的本地副本是如何创建的,以及链码/对等方如何与之通信。谢谢!
答案 0 :(得分:0)
a)这个主要功能是通过哪个命令调用的?由$ peer 安装chaincode? p>
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。
现在,这一切都在签注时间(链码的计算)中得到了解决-但是在签注期间永远不会更新本地数据库。 链码执行完成后,客户端将事务发送给订购者,然后订购者创建一个新块并将其写入其文件系统。
然后,对等方拉出该块,检查执行链码的对等方的签名(来自背书),如果签名有效,则更新其本地数据库。