fabric2.0链码操作

1、打包链码
链码在安装前需要打包为tar文件。我们可以使用peer命令,node sdk,或者第三方工具。
第三方的打包工具需要满足以下要求:
   链码以tar.gz结尾;
   tar文件需要包含2个文件(不是目录),元文件Chaincode-Package-Metadata.json和chaincode文件。
   Chaincode-Package-Metadata.json文件长成下面这样。
   {"Path":"fabric-samples/chaincode/fabcar/go","Type":"golang","Label":"fabcarv1"}
peer命令打包示例:
    首先我们处理依赖问题:
    cd fabric-sample/chaincode/fabcar/go
    GO111MODULE=on go mod vendor


然后进入cli客户端进行打包
  docker exec -it cli /bin/bash
  peer lifecycle chaincode package fabcar2.tar.gz --path github.com/hyperledger/fabric/chaincode/fabcar/go/ --label fabcar_2 >&log.txt
生成:fabcar2.tar.gz
解压fabcar2.tar.gz查看链码打包后内容:metadata.json、code.tar.gz
其中metadata.json:{"path":"github.com/hyperledger/fabric/chaincode/fabcar/go/","type":"golang","label":"fabcar_2"}
其中code.tar.gz:打包后的合约代码
2、安装链码
现在我们在peer0.org1和peer0.org2上安装fabcar链码包,因为在这个演示中我们只需要使用这两个节点进行链码调用和查询。
  # peer0.org1
   docker exec cli peer lifecycle chaincode install fabcar2.tar.gz

# peer0.org2
  docker exec \
     -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp \
     -e CORE_PEER_ADDRESS=peer0.org2.example.com:7051 \
     -e CORE_PEER_LOCALMSPID="Org2MSP" \
     -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
    cli peer lifecycle chaincode install fabcar2.tar.gz


我们会收到链码包的标识符,在下面的链码审批阶段会用到。我们收到的链码标识符为:fabcar_2:3b9c21db5f42197d8b00a68661924da344a4f7d94f67050168269391ec8c732d。
我们可以使用peer lifecycle chaincode queryinstalled命令随时检查节点上的链码安装情况,如果我们需要找出链码包的标识ID,这个命令会很有用。
   # peer0.org1
   docker exec cli peer lifecycle chaincode queryinstalled

# peer0.org2
  docker exec \
      -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp \
      -e CORE_PEER_ADDRESS=peer0.org2.example.com:7051 \
      -e CORE_PEER_LOCALMSPID="Org2MSP" \
      -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
      cli peer lifecycle chaincode queryinstalled


3、审批链码
根据默认策略,需要超过半数的机构审批链码后才能向通道提交链码,具体可参考configtx.yaml中的Application/Policies/LifecycleEndorsement部分。目前的设置中包含两个机构,因此需要两个机构同时批准链码。
首先是Org1批准链码:
  docker exec cli peer lifecycle chaincode approveformyorg \
    --tls \
    --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
    --channelID mychannel --name fabcar2 --version 1 \
     --init-required --sequence 1 --waitForEvent --package-id fabcar_2:3b9c21db5f42197d8b00a68661924da344a4f7d94f67050168269391ec8c732d

如果我们现在看下peer节点的日志,可以看到出了新块#3


类似的,我们让Org2批准链码:
  docker exec \
    -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp \
    -e CORE_PEER_ADDRESS=peer0.org2.example.com:7051 \
    -e CORE_PEER_LOCALMSPID="Org2MSP" \
    -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
    cli peer lifecycle chaincode approveformyorg \
    --tls \
    --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
    --channelID mychannel --name fabcar2 --version 1 --init-required \
     --sequence 1 --waitForEvent --package-id  fabcar_2:3b9c21db5f42197d8b00a68661924da344a4f7d94f67050168269391ec8c732d


不出意外,可以看到出了新块block#4:


可以随时使用如下命令查看链码的提交状态:
  docker exec cli peer lifecycle chaincode checkcommitreadiness \
  --channelID mychannel --name fabcar2 --version 1 --sequence 1 --output json

两个机构都已经批准了链码,现在可以提交了。(这里暂时没想明白为什么为false)

4、向通道提交链码
链码提交可以在一个peer节点上完成:
docker exec cli peer lifecycle chaincode commit -o orderer.example.com:7050 \
--tls \
--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
--peerAddresses peer0.org1.example.com:7051 \
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \
--peerAddresses peer0.org2.example.com:7051 \
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
--channelID mychannel --name fabcar2 --version 1 --sequence 1 --init-required
可以看到出了新块#5:

注意我们在commit命令中已经包含了init所需的参数。
同样,我们可以使用querycommited命令来查看链码的提交状态:
docker exec cli peer lifecycle chaincode querycommitted --channelID mychannel --name fabcar2


在链码提交到通道之后,链码的生命周期就完成了,链码已经可以访问。现在我们回到链码的调用和查询,这和之前的版本是一致的。

5、调用链码的Init方法
fabcar链码的Init方法需要首先调用。

docker exec cli peer chaincode invoke -o orderer.example.com:7050 \
--tls \
--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
--peerAddresses peer0.org1.example.com:7051 \
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \
--peerAddresses peer0.org2.example.com:7051 \
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
-C mychannel -n fabcar2 \
--isInit \
-c ‘{"function":"initLedger","Args":[]}‘

现在可以查询链码:
docker exec cli peer chaincode query -C mychannel -n fabcar -c ‘{"Args":["queryAllCars"]}‘

6、调用链码方法并从另一个peer节点查询

原文地址:https://www.cnblogs.com/zhangmingcheng/p/12607006.html

时间: 2024-10-25 07:17:28

fabric2.0链码操作的相关文章

cocos2d-x 3.0 rapidJson 操作应该注意的细节

Size visibleSize = Director::getInstance()->getVisibleSize(); Point origin = Director::getInstance()->getVisibleOrigin(); std::string path = FileUtils::getInstance()->fullPathForFilename("story.json"); std::string document = FileUtils::

Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤

原文地址: Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤 - 网络资源是无限的 - 博客频道 - CSDN.NET http://blog.csdn.net/fengbingchun/article/details/11192189   1.  先按照http://blog.csdn.net/fengbingchun/article/details/10439281中操作搭建好基本的Android开发环境: 2.  打开Eclipse,-->Window-->

ActionScript 3.0数组操作

var arr:Array=new Array();arr=["a","b","c"];  //赋初值,注意这里的即使单个字符赋值使用的是""trace(arr[1]);       //获取成员信息trace(arr.length);    //获取数组中所包含的元素的个数 //接下来使用for循环逐个输出数组的每一个元素,这也称为数组的遍历var loopTime:int=arr.length;for (var i:int

moloch1.8.0简单操作手册

moloch1.8.0简单操作手册 Sessions 页面:Sessions主要通过非常简单的查询语言来构建表达式追溯数据流量,以便分析. SPIView 页面: SPIGraph页面:SPIGraph 将以流量趋势图的方式展示指定字段的流量情况.除了直接在 SPIGraph 界面中选择字段,也可以在Sessions 及 SPIView 界面进行指定要查看的字段,通过 SPIGraph 选项跳转至本界面. Connections页面:Connections 用于直观的展示源节点与目的节点的关系.

诡异之--map clear 之后可能导致size != 0的操作

map<char, int>mp; charMp['a'] = 1; charMp['b'] ++; cout<<charMp['a']<<endl; cout<<charMp.size()<<endl; charMp.clear(); cout<<"after clear:"<<endl; cout<<charMp.size()<<endl;//0 //charMp.find(

lucene 3.0.2 操作进阶

转自:Bannings http://blog.csdn.net/zhangao0086/article/details/6292950 Analyzer(分词器) 分词器能以某种规则对关键字进行分词,将分好的词放到目录中,以作为检索到的条件,在创建索引时会使用到分词器,在搜索时也将用到分词器,这两个地方要使用同一个分词器,否则可能找不到结果.分词器一般的工作流程: 切分关键词 去除停用词 对于英文单词,把所有字母转为小写 注:有的分词器对英文支持的非常好,还能对英文单词进行时态还原. 停用词的

vs2010 net4.0 c# 操作 sqlite

1.百科介绍 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl.C#.PHP.Java等,还有ODBC接口,同样比起Mysql.PostgreSQL这两款开源的

Linux kali 2.0 基础操作

Linux基础]Linux基础知识入门及常见命令. 2,Linux是一个操作系统, 与windows的区别: Linux:图形化界面简单,性能很快,在企业中当做服务器来使用. Windows:图形化界面很炫,性能相对差,大众用户. windows的服务器: windows2003,windows2008,windows2012 3,Linux的作用: 当做服务器来使用 4,Linux中目录结构: bin:存放二进制可执行文件 sbin: 存放二进制可执行文件,只有root才能访问 etc:存放系

对kali2.0的操作—网络的简单配置修改

网卡配置文件: /etc/network/interfaces 文件关键内容: auto eth0 iface eth0 inet static address 192.168.0.106 netmask 255.255.255.0 gateway 192.168.0.1 DNS的配置: /etc/resovl.conf 文件关键内容: domainnameserver 8.8.8.8nameserver 114.114.114.114 重启网卡: /etc/init.d/networking