了解链码/对等点与账本本地副本之间的交互



问题 1:

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

ChaincodeStubInterfacehyperledger/fabric/core/chaincode/shim/chaincode.go.

如果我没看错,用于PutStateGetStatestub是由handleInit(.)hyperledger/fabric/core/chaincode/shim/handler.go创建的:

stub := new(ChaincodeStub)

handleInithandleReady调用,handleMessage

调用由chatWithPeer调用,Start调用(hyperledger/fabric/core/chaincode/shim/chaincode.go),由main函数调用hyperledger/fabric/examples/chaincode/go/examplexx/cmd/main.go

a) 使用哪个命令调用此main函数?通过$peer chaincode install

b)以及结构代码中的位置得到这个main函数然后调用(我会很高兴一些指针)。

问题2:

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

a) 这个处理程序是链码和对等节点/账本之间的中间体吗?

b) 处理程序是否属于对等方?如果是,每个对等节点是否有一个处理程序,或者是否有多个处理程序(每个链码一个)?

c) 这个处理程序什么时候被实例化?

d) 对等方的本地账本副本何时实例化?

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

a) 使用哪个命令调用此主函数?按$peer 链码安装?

b) 在结构代码中的位置得到这个主函数然后调用(I 会很高兴得到一些指示)。

main 函数在对等代码中定义。当 peer 决定运行链码容器时,它只运行链码填充程序的 docker 镜像(golang,java,node.js),并根据链码语言运行命令。

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 流,链码填充程序在其中等待结果。

至于处理程序 - 每个链码在对等节点上都有一个处理程序。

现在,这一切都在背书时间(链码的计算)期间得到照顾 - 但本地数据库在背书期间永远不会更新。 当链码执行完成后,客户端将交易发送给排序者,然后排序者创建一个新区块并将其写入其文件系统。

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

最新更新