Hyperledger2.0 链码安装

2023-11-18

简介

以Hyperldger2.0为例,链码的安装主要分为以下几部分:

  1. package :打包源代码
  2. install: 安装链码
  3. approveformyorg: 节点所在组织审批链码
  4. commit: 提交链码
    在完成之后可以执行链码的查询和调用

package

  • 首先需要对合约进行编译,首先把我们写的go语言合约放到chaincode下新建的test文件夹下。
root@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# pwd
/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test
root@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# ls
CaAndFakeName.go
root@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# 
  • 执行命令go mod init生成go.mod
root@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# go mod init
go: creating new go.mod: module github.com/hyperledger/fabric-samples/chaincode/test
root@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# ls
CaAndFakeName.go  go.mod
  • 执行命令go run CaAndFakeName.go 生成go.sum
root@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# go run CaAndFakeName.go 
Error starting UserCA chaincode: 'CORE_CHAINCODE_ID_NAME' must be setroot@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# ls
CaAndFakeName.go  go.mod  go.sum

上述的CORE_CHAINCODE_ID_NAME不设置不影响链码部署和执行。

  • 执行命令GO111MODULE=on go mod vendor生成vendor包
root@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# GO111MODULE=on go mod vendor
root@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# ls
CaAndFakeName.go  go.mod  go.sum  vendor
  • 将我们编译好的智能合约打包到容器内,执行命令如下:
docker exec cli peer lifecycle chaincode package $1.tar.gz \
	--path github.com/hyperledger/fabric-samples/chaincode/$3 \
       	--label $1_$2

上述参数定义为(下面的参数与此相同):

  • $1表示我们自定义的合约打包的名字如(mycc.tar.gz 则参数1为mycc)。
  • $2代表我们链码的版本开始时一般为1,后续如果需要升级合约可依次为2、3、4……。
  • $3代表我们链码放的位置(对应上文编译时为test文件夹,则参数2为test)。

install

在完成打包后执行安装命令(安装到示例网络的两个组织的节点上)如下:

  • 节点1,msp配置文件、address、tls配置文件默认为peer0.org1不用添加
docker exec cli peer lifecycle chaincode install $1.tar.gz
  • 节点2,因为时在cli容器执行需要添加指定的文件路径
docker exec \
	-e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \
	-e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \
	-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 $1.tar.gz

上述安装成功的话会输出链码的package_id如下:

3cd7767df34500f3d72faf7efd9774fbd72da4be0696b37\022\007mycc_1" > 
2022-01-04 14:13:44.443 UTC [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code package identifier: mycc_1:cb23fa9b0bace2c353cd7767df34500f3d72faf7efd9774fbd72da4be0696b37

package identifier: mycc_1:cb23fa9b0bace2c353cd7767df34500f3d72faf7efd9774fbd72da4be0696b37我们下文需要使用.

approveformyorg

在完成安装命令之后需要组织进行同意命令如下:

  • peer0.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 $1 --version $2 \
	--init-required --sequence $2 --waitForEvent --package-id $4
  • peer0.org2执行命令
docker exec \
	-e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \
	-e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \
	-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 $4 --name $3 --version $2 --init-required \
	--sequence $2 --waitForEvent --package-id $1

上述参数$4就是上文中生成的package identifier。

commit

在完成组织审批之后,需要执行链码向orderer节点进行提交执行如下命令:

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:9051 \
	--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
	--channelID $4 --name $3 --version $2 --sequence $2 --init-required

上述命令成功执行完输出如下表明链码安装成功。

2022-01-04 14:20:56.239 UTC [cli.lifecycle.chaincode] setOrdererClient -> INFO 001 Retrieved channel (mychannel) orderer endpoint: orderer.example.com:7050
2022-01-04 14:20:58.526 UTC [chaincodeCmd] ClientWait -> INFO 002 txid [4e000545094b9b09c359a6f54d00e7a8efddf78e125e75ad25a3b14eb5d98885] committed with status (VALID) at 
approced on org2 successful
2022-01-04 14:21:01.520 UTC [chaincodeCmd] ClientWait -> INFO 001 txid [5243ea90c3bc104e3998707e5859857f01fb360e38d3d325d8761c84ae455f6c] committed with status (VALID) at peer0.org1.example.com:7051
2022-01-04 14:21:01.522 UTC [chaincodeCmd] ClientWait -> INFO 002 txid [5243ea90c3bc104e3998707e5859857f01fb360e38d3d325d8761c84ae455f6c] committed with status (VALID) at peer0.org2.example.com:9051
commit successful
2022-01-04 14:21:05.637 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200

以上就是fabric2.0中安装一个链码的正常步骤。

半自动化安装链码

下面是我封装的安装链码的两个sh文件,可以简化终端输入

  • 文件1是对步骤package和install的命令封装。
function help(){
        echo "para1-----package_name"
        echo "para2-----chaincode_id"
        echo "para3-----chaincode_dir"
}
if [ $1 == "help" -o $1 == "h" -o $1 == "-h" -o $1 == "-help" ]; then
        help
        exit 1
fi
if [ $# -ne 3 ]; then
        echo "You need to enter three para3"
        exit 1
fi
#打包
docker exec cli peer lifecycle chaincode package $1.tar.gz \
        --path github.com/hyperledger/fabric-samples/chaincode/$3 \
        --label $1_$2
if [ $? -ne 0 ]; then
        echo "package error"
        exit 1
fi
docker exec cli ls
docker exec cli peer lifecycle chaincode install $1.tar.gz
if [ $? -ne 0 ]; then
        echo "install on org1 error"
        exit 1
fi
echo "install on org1 successful"
docker exec \
        -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \
        -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \
        -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 $1.tar.gz
if [ $? -ne 0 ]; then
        echo "install on org2 error"
        exit 1
fi

linux执行命令为如下:sh 文件名.sh $1 $2 $3需要注意将输出的package identifier使用变量记录下来,文件2需要使用此参数

  • 文件2是对步骤approveformyorg和commit的命令封装。
function help(){
        echo "para1-----package_id"
        echo "para2-----chaincode_id"
        echo "para3-----chaincode_name"
        echo "para4-----channel_name"
}
if [ $1 == "help" -o $1 == "h" -o $1 == "-h" -o $1 == "-help" ]; then
        help
        exit 1
fi
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 $4 --name $3 --version $2 \
        --init-required --sequence $2 --waitForEvent --package-id $1
if [ $? -ne 0 ]; then
        echo "approve failed for org1"
        exit 1
fi
echo "approved on org1 successful "
docker exec \
        -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \
        -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \
        -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 $4 --name $3 --version $2 --init-required \
        --sequence $2 --waitForEvent --package-id $1
if [ $? -ne 0 ]; then
        echo "approve failed for org2"
        exit 1
fi
echo "approced on org2 successful"
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:9051 \
        --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
        --channelID $4 --name $3 --version $2 --sequence $2 --init-required
if [ $? -ne 0 ]; then
        echo "commit failed"
        exit 1
fi
echo "commit successful"

linux执行命令为如下sh 文件名.sh 参数1 参数2 参数3 参数4 参数1为上文输出的package identifier。

hyperldger中文文档

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hyperledger2.0 链码安装 的相关文章

  • Vite3 + Svelte3使用@import导入scss样式

    近年来 前端技术日新月异 Vite Vue3 Svelte SolidJS 等框架工具大放异彩 身为一个前端开发 总感觉一刻不学习就要out了 最近使用 Vite3 Svelte3 来构建封装自定义的 Web Components 开始了艰

随机推荐

  • 开发板配置NFS服务

    文章目录 NFS介绍 NFS版本 NFS服务器和客户端 安装NFS 配置NFS服务器 启动NFS服务 挂载NFS共享 NFS安全性 NFS日志 开发板配置NFS环境 环境 操作前先关闭防火墙 配置过程 server端的配置 开发板的操作 常
  • 华为OD机试真题 Java 实现【拔河比赛】【2023 B卷 100分】,附详细解题思路

    目录 专栏导读 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 华为OD机试 2023B卷题库疯狂收录中 刷题点这里 专栏导读 本专栏收录于 华为OD机试 JAVA
  • JAVA--windows和linux下执行.class

    windows和linux下执行 class windows下执行 class linux下执行 class windows下执行 class title testJOb java cp jar com yang jobTest start
  • CMake命令

    1 aux source directory 查找当前目录所有源文件 并将源文件名称列表保存到DIR SRCS变量 不能查找子目录 aux source directory DIR SRCS 2 添加一个库或预编译库 添加一个库 名为
  • 企业实名认证接口

    详情链接 http www haoservice com docs 140 企业实名认证接口 通过营业执照全称 营业执照注册号 对公账户名 对公账号 清算联行号来验证信息一致不一致 支持格式 JSON XML 请求方式 GET POST 明
  • Springboot集成Redis——实现分布式锁

    目录 1 分布式锁 2 springboot集成redis 3 使用setnx命令实现分布式锁 4 使用Redission实现分布式锁 5 redission分布式锁的类型 1 分布式锁 分布式锁 即分布式系统中的锁 随着业务发展的需要 原
  • Android App的工作原理

    Android App的工作原理 Android系统是基于liunx内核的 但是与传统的基于liunx的pc系统不同 用户对Android app没有绝对的掌控权 pc系统中 在应用程序的系统菜单上选择 退出 或者 关闭 之类的选项会直接杀
  • 大型项目一定用angular吗

    不一定 虽然Angular在构建大型项目方面具有优势 但选择使用何种前端框架还需要考虑多个因素 包括项目需求 团队技能 开发周期 项目规模和性能需求等 以下是一些需要考虑的因素 项目规模和复杂性 Angular 的模块化 依赖注入和组件化架
  • bootstrap label的for属性

  • Spring Boot 统一返回前端封装VO类型结果集定义

    现在大部分项目都是前后端分离的项目 为了统一管理 后端需要对数据进行封装对应的VO数据 什么是Vo我就不叙述了 这里贴出我自己的VO封装类 项目的故障码并没有定义太多 所以也没有定义枚举类型 供大家参考 import io swagger
  • Unity查看接入的Ironsource和adapter 版本号

    APPLOVINADAPTER版本号
  • vmware 开机自动启动虚拟机

    vmware开机自动启动 可以使用vmrun命令 1 首先在 我的电脑 属性 高级 环境变量 PATH 中添加vmware路径 如 C Program Files x86 VMware VMware Workstation 2 新建一个 启
  • Kafka一文懂

    初识 Kafka 什么是 Kafka Kafka 是由 Linkedin 公司开发的 它是一个分布式的 支持多分区 多副本 基于 Zookeeper 的分布式消息流平台 它同时也是一款开源的基于发布订阅模式的消息引擎系统 Kafka 的基本
  • 影响DDR5稳定性的RAS功能

    内存的稳定性 离不开RAS功能 这里的RAS Reliability Availability and Serviceability 即可靠性 可用性和可维护性的简称 RAS功能一方面可以通过调整信号规避风险 另一方面 在发生错误时及时发现
  • js常用正则表达式 匹配多个汉字、数字、英文、所有字符(附带Layui中form的表单验证)

    常用正则表达式 转自 菜鸟工具 https c runoob com front end 854 一 校验数字的表达式 数字 0 9 n位的数字 d n 至少n位的数字 d n m n位的数字 d m n 零和非零开头的数字 0 1 9 0
  • 系统部署的基本流程

    系统部署的基本流程 系统升级部署的步骤 系统升级部署的步骤 一 web后台 1 确保代码正确 配置正确 打包为war 2 登录现有web端查看部分数据正常 数据库部分表时间段数据正常 3 连接服务器 进入相应tomcat 停止tomcat
  • Vite简介

    Vite是一个快速 轻量级的前端构建工具 它可以让开发者更高效地进行前端开发 相比于其他构建工具 Vite的特点在于快速的冷启动 模块热替换和按需编译等功能 下面我们将详细探讨Vite的优势和如何使用它 什么是Vite Vite是一款基于R
  • python进阶(七):并发和多线程

    一 多线程 原文 大纲 首页 并发是一种同时执行多个任务的方式 而多线程是一种实现并发的技术 在Python中 可以使用多线程来实现并发编程 了解Python的并发和多线程对于编写高效和响应性的程序非常重要 并发 vs 并行 在讨论并发和多
  • 支持本地挂载的网盘文件列表工具AList

    什么是 Alist AList 是一个支持多存储的文件列表程序 使用 Gin 框架和 Solidjs 库 可以将常见的 18 种网盘整合在一起 并支持 WebDAV 客户端访问 之前老苏写过一篇 Alist 但此 Alist 非彼 Alis
  • Hyperledger2.0 链码安装

    文章目录 简介 package install approveformyorg commit 半自动化安装链码 简介 以Hyperldger2 0为例 链码的安装主要分为以下几部分 package 打包源代码 install 安装链码 ap