建议和反馈

请填写你的反馈内容

Fabric 链码 Chaincode 的安装、初始化、调用、升级

2020-06-04 ·5914次阅读 ·读完需要7分钟

什么是 chaincode

chaincode 是 fabric 的智能合约,又叫做链码。Chaincode 是生成交易 transacton 的唯一方式,是外界与区块链系统交互的唯一渠道,开发 Fabric 区块链应用就是要编写 ChaincodeChaincode 就是业务逻辑实现。

chaincode 生命周期

  • Install 安装

    chaincode 要在 Fabric 网络上运行,必须要先安装在网络中的节点 peer 上(可以理解为部署代码),安装同时注明版本号保证应用的版本控制。

  • Instantiate 实例化

    在 peer 上安装 chaincode 后,还需要实例化才能真正激活该 chaincode 。在实例化的过程中,chaincode 就会被编译并打包成 docker 容器镜像,然后启动运行。每个应用只能被实例化一次,实例化可在任意一个已安装该 chaincode 的 peer 上进行。

  • Invoke 调用,Query 查询

    chaincode 在实例化后,用户就能与它进行交互,其中 query 查询与应用相关的状态(即只读),而 invoke 则可能会改变其状态。

  • Upgrade 升级

    在 chaincode 更新代码后,需要把新的代码通过 install 交易安装到正在运行该 chaincode 的 peer 上,安装时需注明比先前版本更高的版本号,接下来向任意一个安装了新代码的 peer 发送 upgrade 交易就能更新 chaincode,chaincode 在更新前的状态也会得到保留。

first network 示例

现在,我们在 first network 的环境中,重新部署一个新的应用,应用逻辑是插入一个学生的成绩(学生姓名,语文成绩,数学成绩),然后计算总成绩记录到链上,通过学生姓名查询学生的总成绩,链码路径放到 fabric-samples/chaincode/win_test/src/fabric-chaincode 目录下,链码下载地址是:https://gitee.com/zh5715615/fabric-chaincode.git。

先关掉 TLS

为了减少参数输入,在这里不引入 TLS(安全传输层协议)功能,后面再进行讲解,我们关掉 tls 开关:

  1. 修改 first-network/docker-compose-cli.yaml

找到 CORE_PEER_TLS_ENABLED=true,修改为 CORE_PEER_TLS_ENABLED=false,如下:

1234567891011121314
cli:    container_name: cli    image: hyperledger/fabric-tools:$IMAGE_TAG    tty: true    stdin_open: true    environment:      - GOPATH=/opt/gopath      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock      #- FABRIC_LOGGING_SPEC=DEBUG      - FABRIC_LOGGING_SPEC=INFO      - CORE_PEER_ID=cli      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051      - CORE_PEER_LOCALMSPID=Org1MSP      - CORE_PEER_TLS_ENABLED=false
  1. 修改 first-network/base/peer-base.yaml

找到 CORE_PEER_TLS_ENABLED=true 改为 CORE_PEER_TLS_ENABLED=false

找到 ORDERER_GENERAL_TLS_ENABLED=true 改为 ORDERER_GENERAL_TLS_ENABLED=false

如下:

123456789101112131415161718192021222324252627282930313233343536373839
peer-base:    image: hyperledger/fabric-peer:$IMAGE_TAG    environment:      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock      # the following setting starts chaincode containers on the same      # bridge network as the peers      # https://docs.docker.com/compose/networking/      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}_byfn      - FABRIC_LOGGING_SPEC=INFO      #- FABRIC_LOGGING_SPEC=DEBUG      - CORE_PEER_TLS_ENABLED=false      - CORE_PEER_GOSSIP_USELEADERELECTION=true      - CORE_PEER_GOSSIP_ORGLEADER=false      - CORE_PEER_PROFILE_ENABLED=true      - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt      - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key      - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer    command: peer node start  orderer-base:    image: hyperledger/fabric-orderer:$IMAGE_TAG    environment:      - FABRIC_LOGGING_SPEC=INFO      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0      - ORDERER_GENERAL_GENESISMETHOD=file      - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp      # enabled TLS      - ORDERER_GENERAL_TLS_ENABLED=false      - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key      - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt      - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]      - ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1      - ORDERER_KAFKA_VERBOSE=true      - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt      - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key      - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]

进入容器

first network 的操作都是再 cli 容器中进行的,进入 cli 容器:

1
docker exec -it cli bash

链码安装

cli 容器中,默认的 peer 成员时 peer0.org0,所以安装链码只是安装在 peer0.org0 的节点上,如果要在其他节点安装需要切换环境变量,链码安装操作如下:

  1. 在 peer0.org1 上安装 chaincode

    1
    peer chaincode install -n kpcc -v 1.0 -l golang -p github.com/chaincode/win_test/src/fabric-chaincode/kunpeng_example01/
  2. 在 peer1.org1 上安装 chaincode

    12
    CORE_PEER_ADDRESS=peer1.org1.example.com:8051 #切换节点peer chaincode install -n kpcc -v 1.0 -l golang -p github.com/chaincode/win_test/src/fabric-chaincode/kunpeng_example01/
  3. 在 peer0.org2 上安装 chaincode

    1234
    CORE_PEER_LOCALMSPID="Org2MSP" #切换组织CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp #切换组织mspCORE_PEER_ADDRESS=peer0.org2.example.com:9051 #切换节点peer chaincode install -n kpcc -v 1.0 -l golang -p github.com/chaincode/win_test/src/fabric-chaincode/kunpeng_example01/
  4. 在 peer1.org2 上安装 chaincode

    12
    CORE_PEER_ADDRESS=peer1.org2.example.com:10051 #切换节点peer chaincode install -n kpcc -v 1.0 -l golang -p github.com/chaincode/win_test/src/fabric-chaincode/kunpeng_example01/

    注意,如果要切回组织 1 时,环境变量为:

    12
    CORE_PEER_LOCALMSPID="Org1MSP"CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

    从上面的例子可以看到,如果不同的节点之间有不同的环境变量,而不同的组织环境变量和需要导入的 MSP (成员管理) 不同,在使用时注意切换。如果是在非 docker 的真机环境下,不需要 cli 时,则记得在 peer node start 启动前,配置好相应的环境变量值。

    参数解析:

  • -n:指定链码名称

  • -v:指定链码版本号

  • -l:指定链码使用的语言,可以是 golang, java, nodejs

  • -p:指定链码源码目录

    链码安装成功则显示如下:

    1
    response:

链码初始化

链码的初始化只需要执行一次,在任意节点上执行都可以:

1
peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n kpcc -l golang -v 1.0 -c '{"Args":[]}' -P 'AND ('\''Org1MSP.peer'\'','\''Org2MSP.peer'\'')'

参数解析:

  • -n:指定链码名称

  • -v:指定链码版本号

  • -l:指定链码使用的语言,可以是 golang, java, nodejs

  • -o:指定排序节点

  • -C:指定通道名

    • -c:指定初始化参数

  • -P:指定背书策略,上例中的背书策略是,两个组织必须都参与链码 invoke 或 query,chaincode 执行才能生效。这个参数可为空,则任意安装了链码的节点无约束地调用链码。

    链码初始化成功则不会有 error 信息显示。

链码执行

执行链码 Invoke,链码的执行在任意节点完成后,会将结果同步到其他节点:

1
peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n kpcc -c '{"Args":["invoke","Alice","98","92"]}'

参数解析:

  • -n:指定链码名称

  • -o:指定排序节点

  • -C:指定通道名

  • -c:指定链码执行地参数,如上例中有四个参数,invoke 是方法,表示写入,Alice 是学生名称,98,92 是分数

    以上的示例指令执行会失败,并不会记录在链上,因为有背书规则,所以需要两个组织一起参与背书,正确指令如下:

    1
    peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n kpcc --peerAddresses peer0.org1.example.com:7051 --peerAddresses peer0.org2.example.com:9051 -c '{"Args":["invoke","Alice","98","92"]}'

    链码执行成功显示如下:

    1
    Chaincode invoke successful. result: status:200

链码查询

1
peer chaincode query -C mychannel -n kpcc -c '{"Args":["query","Alice"]}'

参数解析:

  • -n:指定链码名称

  • -C:指定通道名

  • -c:指定链码执行地参数,如上例中有四个参数,invoke 是方法,表示写入,Alice 是学生名称,98,92 是分数

    链码的查询是不会记录在链上的,只会从账本中读取记录返回给用户,此示例返回值是 190

    链码查询其实也可以用 invoke 来执行,这样就需要背书,且记录上链。

链码更新

链码更新,首先要安装链码,更新一下版本号:

1
peer chaincode install -n kpcc -v 1.1 -l golang -p github.com/chaincode/win_test/src/fabric-chaincode/kunpeng_example01/

然后再更新链码,参与同初始化一样

1
peer chaincode upgrade -o orderer.example.com:7050 -C mychannel -n kpcc -l golang -v 1.1 -c '{"Args":[]}' -P 'AND ('\''Org1MSP.peer'\'','\''Org2MSP.peer'\'')'

链码更新只能在安装了新版本链码的节点上有效,老的节点仍然只能用旧的链码,同样,参与背书的节点,也需要将链码升级,才能让提交 Invoke 的操作背书通过。


声明:作为区块链技术信息平台,本站所提供的资讯信息不代表任何投资暗示,本站所发布文章仅代表个人观点,与链客社区官方立场无关。
评论(0)问答(0)
请先登录或注册

请先登陆或注册

相关推荐

技术 | 链上账本数据写入慢?试试LSM

来源:趣链科技导 读首先问大家一个小问题?区块链的账本数据存储格式主要是什么类型的?相信聪明的你一定知道是Key-Value类型存储。下一个问题,这些Key-Value数据在底层数据库如何高效组织?答......
justnow · 2020-12-22
2014阅读 · 0赞赏 · 0问答

为什么Hyperledger Fabric会战胜R3 Corda和Quorum?

区块链作为一种新兴技术尚未达到基础水平,但颠覆性技术已经历经了五代。虽然前两代技术比特币和以太币是公开的,无许可的区块链,但Hyperledger Fabric、Corda和Quorum却是私有和需许......
bears · 2020-10-07
2245阅读 · 0赞赏 · 0问答

美联储发布分布式账本技术试验详情,采用HyperLedger Fabric区块链软件

美联储发布了有关2019年支付试验的详细信息,该试验涉及分布式账本技术,特别是Hyperledger Fabric区块链软件。该结果是与美联储正在与麻省理工学院(MIT)合作进行为期多年的努力的消息一......
moondesign · 2020-09-23
1925阅读 · 0赞赏 · 0问答

我们如何选择开发平台:超级账本还是以太坊

在区块链的世界里,超级账本(Hyperledger)和(Ethereum)都产生了创新的浪潮。这两个流行的开源区块链平台在行业中不仅发现了大量区块链应用,而且它们还鼓励世界各地的区块链开发者参与区块链......
江南烟雨 · 2020-09-08
4634阅读 · 0赞赏 · 0问答

区块链是全球数字化迁徙的信任机制

2020 年初,一场突如其来的疫情打乱了人们的生活,对商业活动产生了巨大影响。在这场疫情中,以互联网为代表的数字经济为人们在特殊时期的生活提供了强有力的缓冲,同时也为经济发展提供了一些新机遇。新机遇正......
古风 · 2020-08-19
2825阅读 · 0赞赏 · 0问答

我们如何选择开发平台:超级账本还是以太坊?

在区块链的世界里,超级账本(Hyperledger)和(Ethereum)都产生了创新的浪潮。这两个流行的开源区块链平台在行业中不仅发现了大量区块链应用,而且它们还鼓励世界各地的区块链开发者参与区块链......
论坛咸鸟 · 2020-08-11
3129阅读 · 0赞赏 · 0问答

Mecoooo

4412.0

LK币

20

粉丝

46

笔记

感谢"Mecoooo"

这篇精彩的笔记,目前已经帮助

  • 0
  • 5
  • 9
  • 1
  • 4
喜欢0
链客社群 加入

微博进入

商务合作>

广告投放>

公司名称:北京链客行科技有限公司

联系方式:010-67707199

ICP备案号:京ICP备18032136号

Copyright:链客区块链技术问答社区 版权所有

感谢您的提问,问题被社区永久收入以便新人查看。一定要记得采纳最佳答案哦!加油!

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

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!