建议和反馈

请填写你的反馈内容

问答 > 超级账本 > 问答详情
求助中

chaincode在安装的时候,官方文档说要在每个背书节点上安装,是指每个peer节点?同一org的每个peer都要安装一遍?

chaincode在安装的时候,官方文档说要在每个背书节点上安装,是指每个peer节点?同一org的每个peer都要安装一遍?

shapeofmyheart

2019-06-12

666

0

撰写答案

请先登陆或注册

1个回答

Mars

2019-06-13

每个peer节点上安装

安装和实例化chaincode

我们利用一个简单的已写好的chaincode。应用通过chaincode和区块链的账本进行交互,因此我们需要首先在每个peer节点上安装chaincode用来执行交易和背书交易,然后在channel上实例化chaincode。
首先安装例子go代码到4个peer节点中的一个。这个命令会把go源码放在peer节点的文件系统中。

peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

接下来,在channel上实例化chaincode。这将会在channel上初始化chaincode,为chaincode设置背书策略,为目标peer启动一个chaincode容器。注意-P参数,这个参数指定了在该chaincode上一个交易被认可需要的背书级别。
接下来的命令中,我们设置-P参数为OR ('Org0MSP.member','Org1MSP.member’)”
。这表示我们需要Org1或者Org2中一个peer节点的背书。如果改变语法为AND,那么就需要两个背书

peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"

上述命令中的mycc为上文中peer上安装的chaincode的名称。

Query

下面查询a的值,确认chaincode被正确的实例化,stateDB正常的运行。查询的语法如下:

peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

Invoke

现在从a转移10到b。这个交易会产生一个新的区块并更新stateDB。调用的语法是:

peer chaincode invoke -o orderer.example.com:7050  --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem  -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'

现在再次查询,查看上述转移10的命令是否已经成功执行,执行的命令是:

peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

正常执行,会输出如下提示:

Query Result: 90

这背后发生了什么

下面描述docker-compose-cli.yaml文件中没有注释script.sh时的执行情况。去掉包含script.sh脚本执行的注释,然后使用docker-compose命令再次启动网络。

  1. script.sh脚本在CLI容器里已经备份过,脚本执行createChannel命令根据设定的channel名字,使用channel.tx文件作为channel配置交易。

  2. createChannel执行的输出是一个genesis block-<your channel name>.block。输出存储在peer节点的文件系统上包含了channel.tx所指定的channel配置信息。

  3. joinChannel命令被执行(4个peer节点),joinChannel命令使用上文生成的genesis
    block作为参数,该命令引导peer节点加入到<your channel name>并且建立一个以<your
    channel name>.block为起始的链。

  4. 目前我们建立了一个包含4个节点的channel, channel包含两个orgnizations。类似TwoOrgsChannel文件的配置。

  5. peer0.org1.example.com和peer1.org1.example.com属于Org1;peer0.org2.example.com和peer1.org2.example.com属于Org2

  6. 这些关系在crypto-config.yaml里定义,MSP的路径在docker compose中指定

  7. Org1MSP的Anchor Peer(peer0.org1.example.com)和Org2MSP的Anchor peer(peer0.org2.example.com)被更新。我们通过传递Org1MSPanchor.tx和Org2MSPanchor.tx以及channel的名字到ordering service来实现这一步。

  8. 将编写好的chaincode_example02安装在peer0.org1.example.com和peer0.org2.example.com上(这里并没有安装在所有peer上,而是仅安装在anchor
    peer节点上,anchor peer节点之前每个Org设置了一个)

  9. chaincode在peer0.org2.example.com上实例化。实例化过程添加chaincode到channel中,为目标peer启动容器,同时初始化与chaincode相关的key-value键值对。本例中初始化的值为[“a”: ”100”, “b”: ”200”]。实例化后会启动一个容器dev-peer0.org2.example.com-mycc-1.0。(实例化过程发送至peer0.org2.example.com上执行)

  10. 实例化过程也传递了一个背书策略的参数。背书策略类似形式:-P "OR ('Org1MSP.member','Org2MSP.member')",代表任何交易必须被Org1或Org2的一个peer背书。

  11. 在peer0.org1.example.com上执行查询a的值。chaincode之前已经安装在peer0.org1.example.com上了,因此查询操作会为Org1的peer0节点启动一个容器dev-peer0.org1.example.com-mycc-1.0。查询结果也会返回回来,这个过程中没有任何写操作发生,所以a的值还是100。

  12. 发送一个转移账户金额的调用到peer0.org1.example.com,从a账户转移10单位至b账户

  13. chaincode然后安装在peer1.org2.example.com上

  14. 发送查询a账户操作至peer1.org2.example.com。这将启动第三个chaincode容器dev-peer1.org2.example.com-mycc-1.0。返回金额90,说明之前帐号金额的转移操作成功执行。

这说明了什么

为了在账本上成功的执行读写操作,chaincode必须安装在peer上。另外,chaincode容器直到实例化或者传统交易-读写执行的时候(例:查询a账户的值),chaincode容器才会启动。channel中的每个节点都维护了账本的完全复制,存储了不可改变的、序列化的记录区块以及state database用于保存当前的fabric状态。即便是那些没有安装chaincode的节点(例如peer1.org1.example.com)也会同步账本。最终chaincode在安装到peer1.org1.example.com后就可以被调用了,因为chaincode已经完成了实例化。

怎样查看交易信息

查看CLI docker容器的日志信息

docker logs -f cli

可以看到交易的详细过程

怎样查看chaincode的日志

在每个chaincode container上可以查看当前container里所执行过的交易。具体查看命令如下:

$ docker logs dev-peer0.org2.example.com-mycc-1.004:30:45.947 [BCCSP_FACTORY] DEBU : Initialize BCCSP [SW]
ex02 Init
Aval = 100, Bval = 200$ docker logs dev-peer0.org1.example.com-mycc-1.004:31:10.569 [BCCSP_FACTORY] DEBU : Initialize BCCSP [SW]
ex02 Invoke
Query Response:{"Name":"a","Amount":"100"}
ex02 Invoke
Aval = 90, Bval = 210$ docker logs dev-peer1.org2.example.com-mycc-1.004:31:30.420 [BCCSP_FACTORY] DEBU : Initialize BCCSP [SW]
ex02 Invoke
Query Response:{"Name":"a","Amount":"90"}


0
赞赏(0)
邀请

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励