关于channel和chaincode的基础知识+基本测试

1:channel

    在 Fabric 中,channel 代表了一个私有的广播通道,保证了消息的隔离性和私密性,它由 orderer 来管理。channel 中的成员共享该 channel 的账本,并且只有通过验证的用户才能在 channel 中进行交易,与一个 channel 相关的属性记录在该channel的初始区块中,可通过 reconfiguration 交易进行更改。channel的初始区块由 create channel 交易生成,peer 向 orderer 发送该交易时会带有的 config.tx 文件,该文件定义 channel 的相关属性。

2:channel操作

    ##创建通道:peer channel create

    系统会在cli内部的当前目录创建一个mychannel.block文件,这个文件非常重要,接下来其他节点要加入这个Channel就必须使用这个文件。  

    ##节点加入通道:peer channel join

    任何节点想要加入该通道,那么执行:peer channel join -b mychannel.block即可(前提:cli容器指向对应的节点(通过修改配置文件内容指向对应的节点)  

    当网络和channel配置好以后,才可以对chaincode进行操作。

3:chaincode

      chaincode是一个运行在ledger上的软件,对资产和交易指令编码来修改资产。

      chaincode 是开发人员按照特定接口编写的智能合约,通过 SDK 或者 CLI 在 Fabric 的网络上安装并且初始化后,该应用就能访问网络中的共享账本。

       (CLI在整个Fabric网络中扮演客户端的角色,我们在开发测试的时候可以用CLI来代替SDK,执行各种SDK能执行的操作。CLI会和Peer相连,把指令发送给对应的Peer执行。

3:chaincode 的生命周期如下:

     注意!!对chaincode的操作都是在cli容器中进行的,cli容器可以与加入通道的任意节点连接并对其操作!
     a.    Install(安装
          chaincode 要在 Fabric 网络上运行,必须要先安装在网络中的 peer 上,安装同时注明版本号保证应用的版本控制。

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

          (-n 执行名称为mycc, -v指定版本号1.0, -p将后面的例子进行打包部署(这里使用的是go/example02的例子))
     b.    Instantiate(实例化)

          在 peer 上安装 chaincode 后,还需要实例化才能真正激活该 chaincode 。在实例化的过程中,chaincode 就会被编译并打包成容器镜像,

          然后启动运行。若 chaincode 在实例化的过程中更新了数据状态,如给某个变量赋予初始值,则该状态变化会被记录在共享账本中。每个应用

          只能被实例化一次,实例化可在任意一个已安装该 chaincode 的 peer 上进行。

          例如:peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c

                     '{"Args":["init","a","100","b","200"]}' -P "OR      ('Org1MSP.member','Org2MSP.member')"

           (可以在实例化的时候进行初始化。实例化会产生自己的链码容器dev开头的,以当前结点命名例如:dev-peer0.org1.example.com-mycc-1.0

            -p指定背书策略,OR      ('Org1MSP.member','Org2MSP.member')"  请求两个中的一个的签即可
     c.    Invoke和query (调用和查询
          chaincode 在实例化后,用户就能与它进行交互,其中 query 查询与应用相关的状态(即只读),而 invoke 则可能会改变其状态。

          例如:peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'、

          (-C制定通道名称muchannel, -n制定chaincode的名称mycc, -c调用接口的参数:query, a

           又例如:peer chaincode invoke -o orderer.example.com:7050  --tls true --cafile $ORDERER_CA -C mychannel -n mycc -c 

                          '{"Args":  ["invoke","a","b","10"]}'

           (同一个通道中已经安装chaincode的节点是可以共享state的,如果只在节点a上面初始化了,那么其他节点也是可以查询到的。其中两个节点进行了交易状态发生变化了,其他节点也是可以获得当前状态的。后面进行测试......


     d.    Upgrade(升级)
          在 chaincode 添加新功能或出现 bug 需要升级时,可以通过 upgrade 交易来实现。这时需要把新的代码通过install交易安装到正在运行该 chaincode的 peer 上,安装时需注明比先前版本更高的版本号,接下来只需要向任意一个安装了新代码的 peer 发送 upgrade 交易就能更新 chaincode ,chaincode 在更新前的状态也会得到保留。

4:基本测试

         我们在fabric网络启动的基础上,进入cli容器创建一个mychannel通道,将所有的节点都加入进去,并且设置好两个锚点(first-network实例)。当前的网络如下图所示:(2org, 4peer, 四个节点都加入到channel中,并且peer0, peer2是各自的锚点)

     关于channel和chaincode的基础知识+基本测试_第1张图片

进行测试:

        (1).在peer0和peer2上面安装上chaincode        关于channel和chaincode的基础知识+基本测试_第2张图片

  关于channel和chaincode的基础知识+基本测试_第3张图片 

    2). 然后在peer2上面进行初始化:a:100, b:200,然后再peer0上面进行query a的查询操作:

  

   然后查询成功了,返回值为100,是在peer2上面初始化的值。

   

   我们分析一下发生了什么?

       关于channel和chaincode的基础知识+基本测试_第4张图片

     那么现在没有安装chaincode的节点peer1和peer4可以查到数据吗?我把cli指向pee1进行查询,结果如下图所示:

    

      结果:失败。会报:error open  XXXXchaincode.mycc.1.0: no such file or directory。(找不到那个chaincode)

     (chaincode是应用修改账本的途径,没有chaincode就无法进行修改账本了!) peer4是一样的情况。

     (3).在peer0上面执行invoke交易,a转账到b10元,那么a还剩90元。这时候我们给peer3加上chaincode。然后在peer3上面对a进行查询,如果结果为90:   


        结果发现,给peer3加上chaincode以后查询a可以查询,而且结果还是正确的为:90

         分析:

         

         总结:

             同一个channel中账本是共享的,每个节点获得的数据是同步的。应用访问账本,进行查询,交易等操作是需要借助于chaincode来实现的。没有安装Chaincode的节点是无法访问账本的。一旦安装chaincode,那么节点的数据会和通道的账本进行同步。

        参考:http://www.cnblogs.com/studyzy/p/7451276.html

                   亨利笔记的公众号

 

你可能感兴趣的:(区块链(fabric))