Hyperledger Fabric 2.x 环境搭建

news/2024/5/24 11:41:16/

一、说明

区块链网络的核心是分布式账本,在这个账本中记录了网络中发生的所有交易信息。

Hyperledger Fabric 是一个是开源的,企业级的,带权限的分布式账本解决方案的平台。Hyperledger Fabric 由模块化架构支撑,并具备极佳的保密性、可伸缩性、灵活性和可扩展性。Hyperledger Fabric 被设计成支持不同的模块组件直接拔插启用,并能适应在经济生态系统中错综复杂的各种场景。

本文分享在 Centos 下搭建 Hyperledger Fabric 2.4 环境并进行简单的网络测试。

二、环境准备

2.1. 环境依赖

  • Git 客户端
  • Golang 1.17.5 以上版本
  • Docker 18.03 以上版本

2.2. 检查环境

Docker 版本

docker -v

Golang 语言环境

go version

三、Fabric 源码安装

3.1. 创建目录

在 GOPATH 目录下创建 Fabric 的文件夹:

mkdir -p $GOPATH/src/github.com/hyperledger

3.2. 下载源码

cd $GOPATH/src/github.com/hyperledgergit clone https://gitee.com/hyperledger/fabric.git

这里使用国内的码云的镜像仓库

3.3. 修改安装脚本

如果本地网络访问 github 顺畅可以忽略该步骤

编辑 bootstrap.sh 文件

vim $GOPATH/src/github.com/hyperledger/fabric/scripts/bootstrap.sh
  1. 把 https://github.com/hyperledger/fabric-samples.git 修改为 https://gitee.com/hyperledger/fabric-samples.git

  1. 注释 pullBinaries

3.4. 执行安装脚本

./bootstrap.sh

如下图所示,脚本执行成功之后会下载一个 fabric-samples 工程和一堆 fabric 的 docker 镜像:

分别手动下载 fabric 和 fabric-ca 编译后的压缩包,存放在 fabric/scripts/ 目录下:

由于码云镜像仓库的发布包只有源码,我们需要编译后的所以只能想办法去 github 下载。

https://github.com/hyperledger/fabric/releases/download/v2.4.1/hyperledger-fabric-linux-amd64-2.4.1.tar.gz

https://github.com/hyperledger/fabric-ca/releases/download/v1.5.2/hyperledger-fabric-ca-linux-amd64-1.5.2.tar.gz

压缩压缩包,得到 bin 与 config 两个文件夹:

tar -zxvf hyperledger-fabric-linux-amd64-2.4.1.tar.gztar -zxvf hyperledger-fabric-ca-linux-amd64-1.5.2.tar.gz

执行以下命令复制 fabric-samples 目录中

cp -r bin fabric-samples/
cp -r config fabric-samples/

四、启动 test-network 测试网络

进入 test-network 目录

cd $GOPATH/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network

执行以下命令:

./network.sh up

如果出现下图的报错:

则需要修改 docker-compose 的版本,在 test-network 目录下分别编辑以下文件:

vim docker/docker-compose-test-net.yaml
vim docker/docker-compose-couch.yaml
vim docker/docker-compose-ca.yaml
vim addOrg3/docker/docker-compose-couch-org3.yaml
vim addOrg3/docker/docker-compose-org3.yaml

其中把 version: '3.7' 修改为 version: '3.6' 如下图所示:

修改完配置后,重新执行:

./network.sh up

如下图所示,已成功启动一个 orderer节点 和两个 peer节点

至此一个基于 Hyperledger Fabric 的测试网络就搭建完成了。

五、测试网络使用

可以执行以下命令打印脚本的帮助文本:

./network.sh -h

5.1. 创建 Channel

现在我们的机器上正在运行对等节点和排序节点, 我们可以使用脚本创建用于在 Org1 和 Org2 之间进行交易的 Fabric 通道。

Fabric channel 是特定网络成员之间的专用通信层,通道只能由被邀请加入通道的组织使用,并且对网络的其他成员不可见。 每个通道都有一个单独的区块链账本,被邀请的组织 “加入” 他们的对等节点来存储其通道账本并验证交易,建立一个通道相当于建立了一个子链。

使用 network.sh 脚本在 Org1 和 Org2 之间创建通道并加入他们的对等节点,执行以下命令创建一个通道:

./network.sh createChannel

如下图所示创建成功后默认名称为 mychannel

可使用 -c 来指定通道名称,以下命令将创建一个名为 channel1 的通道:

./network.sh createChannel -c channel1

5.2. 在通道启动一个链码

创建通道后,可以开始使用智能合约与通道账本交互。智能合约包含管理区块链账本上资产的业务逻辑,由成员运行的应用程序网络可以在账本上调用智能合约创建,更改和转让这些资产,应用程序还通过智能合约查询,以在分类账上读取数据。

在 Fabric 中,智能合约作为链码以软件包的形式部署在网络上。链码安装在组织的对等节点上,然后部署到某个通道,然后可以在该通道中用于认可交易和区块链账本交互。在将链码部署到通道前,该频道的成员需要就链码定义达成共识,建立链码治理。何时达到要求数量的组织同意后,链码定义可以提交给通道,并且可以使用链码了。

创建频道后,可以使用 network.sh 脚本在通道上启动链码:

./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-java -ccl java
  • -ccn:为指定链码名称
  • -ccl:为指定链码语言

deployCC 子命令将在 peer0.org1.example.com 和 peer0.org2.example.com 上安装 asset-transfer-basic 链码,如果第一次部署链码,脚本将安装链码的依赖项。默认情况下,脚本安装 Go 版本的 asset-transfer-basic 链码,可以通过参数 -ccl 来安装 Java 或 javascript 版本的链码。

5.3. 与网络交互

在启用测试网络后,可以使用 peer cli 客户端与网络进行交互,通过 peer cli 客户端可以调用已部署的智能合约,更新通道,或安装和部署新的智能合约。

首先确保操作目录为 test-network 目录,比如我的目录是:

以下操作需确保在 test-network 目录中进行操作: 

执行以下命令将 cli 客户端添加到环境变量中:

export PATH=${PWD}/../bin:$PATH

还需要将 fabric-samples 代码库中的 FABRIC_CFG_PATH 设置为指向其中的 core.yaml 文件:

export FABRIC_CFG_PATH=$PWD/../config/

设置允许 org1 操作 peer cli 的环境变量:

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051

CORE_PEER_TLS_ROOTCERT_FILE 和 CORE_PEER_MSPCONFIGPATH 环境变量指向 Org1 的 organizations 文件夹中的的加密材料。

执行以下命令用一些资产来初始化账本:

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"InitLedger","Args":[]}'

执行成功会返回 Chaincode invoke successful. result: status:200 如下图所示:

执行以下指令来查询通道账本中的资产列表:

peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

六、关闭网络

使用完测试网络后,可执行以下命令关闭网络:

./network.sh down

该命令将停止并删除节点和链码容器,删除组织加密材料,并从 Docker Registry 移除链码镜像,另外还会删除之前运行的通道项目:

七、使用认证机构创建网络

Hyperledger Fabric 使用公钥基础设施 (PKI) 来验证所有网络参与者的行为。 每个节点,网络管理员和用户提交的交易需要具有公共证书和私钥以验证其身份。

默认情况下,脚本使用 cryptogen 工具创建证书和密钥,该工具用于开发和测试,并且可以快速为具有有效根信任的 Fabric 组织创建所需的加密材料。

测试网络脚本还提供了使用证书颁发机构(CA)的网络的启动选项。在网络中每个组织操作一个 CA(或多个中间 CA)来创建属于他们的组织身份,所有由该组织运行的 CA 创建的身份享有相同的组织信任根源。

首先运行以下命令关停所有正在运行的网络:

./network.sh down

使用 CA 参数启动网络:

./network.sh up -ca

执行命令成功后,通过打印的 docker 容器可以看到启动了三个 CA,每个网络中的组织一个:

可以通过 tree 命令来查看 Org1 管理员用户的 MSP 文件夹结构和文件:

tree organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/

其中 signcerts 文件夹中存放着管理员用户的证书,keystore 文件夹中存放着私钥。

参考资料

  • https://hyperledger-fabric.readthedocs.io/en/latest/whatis.html

http://www.ppmy.cn/news/47570.html

相关文章

幂等性问题与解决方案

幂等性问题与解决方案 摘要 幂等概念来自数学,表示N次变换和1次变换的结果是相同的。这里讨论在某些场景下,客户端在调用服务没有达到预期结果时,会进行多次调用,为避免多次重复的调用对服务资源产生副作用,服务提供…

机器学习:皮尔逊相关系数——影评相关性分析案例

机器学习:皮尔逊相关系数——影评相关性分析案例 文章目录 机器学习:皮尔逊相关系数——影评相关性分析案例:rocket:1、皮尔逊相关系数概念及公式:rocket:2、案例代码部分 皮尔逊(pearson)相关系数、 斯皮尔曼(spearm…

TypeScript泛型类型和接口

本节课我们来开始了解 TypeScript 中泛型类型的概念和接口使用。 一.泛型类型 1. 前面,我们通过泛型变量的形式来存储调用方的类型从而进行检查; 2. 而泛型也可以作为类型的方式存在,理解这一点,先了解下函数的…

【Vue】Vue-route路由

Vue-router官网 由vue-router模块控制,需要额外安装依赖。参考官网 npm install vue-router --save组成 router-link:路由链接,跳转至路由视图,展示指定路由组件信息router-view:路由视图,展示路由组件信…

SLAM 十四讲(第一版)各章方法总结与理解

SLAM 十四讲(第一版)各章方法总结与理解 总结十四讲中各章各步骤提到的各种方法,以及具体方法在哪个 c 库中可以调用。目的在于能更直观地了解 slam 过程各步骤到底在做什么,以及是怎么联系在一起的。 2. 初识 SLAM SLAM&#x…

Redis---测试配置及添加slave主机

一、测试集群功能 测试高可用 1、停止 master 主机的 redis 服务 master 宕机后对应的 slave 自动被选举为 master,原 master 启动后,会自动配置为当前 master 的 slave 2、检测集群 mgm68管理主机,查看集群信息 主服务器地址和端口(ID值…

python笔记:datetime

处理日期和时间 1 常量 MINYEAR datetime允许的最小年份 MAXYEAR datetime允许的最大年份 2 数据类型 datetime.date带有属性year,month,daydatetime.time带有属性hour,minute,second,microsecond,tzinfodatetime.datetime带有属性year,month,day,hour,minute,second,…

22勤于思考:gRPC都有哪些优势和不足?

如果你能从专栏的开篇词开始读到这篇文章并且能够在过程中认真思考,那么我相信你目前已经能够对gRPC有了较为充分了解。在专栏的最后几节中,我们抽出一篇文章。来探讨一下gRPC有哪些优势和不足,因为只有这样我们才能取其精华,去其糟粕,学习gRPC框架设计的优点,还能反观出…

Nacos服务端健康检查-篇五

Nacos服务端健康检查-篇五 🕐Nacos 客户端服务注册源码分析-篇一 🕑Nacos 客户端服务注册源码分析-篇二 🕒Nacos 客户端服务注册源码分析-篇三 🕓Nacos 服务端服务注册源码分析-篇四 上篇分析l服务端的注册服务的整个流程&…

大四的告诫

👂 LOCK OUT - $atori Zoom/KALONO - 单曲 - 网易云音乐 👂 喝了一口星光酒(我只想爱爱爱爱你一万年) - 木小雅 - 单曲 - 网易云音乐 其实不是很希望这篇文章火,不然就更卷了。。 从大一开始,每天10小时…

mysql 事务的 ACID 特征与使用

事务的四大特征: A 原子性:事务是最小的单位,不可以再分割;C 一致性:要求同一事务中的 SQL 语句,必须保证同时成功或者失败;I 隔离性:事务1 和 事务2 之间是具有隔离性的&#xff1…

【性能测试】5年测试老鸟,总结性能测试基础到指标,进阶性能测试专项......

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能测试是为了评…

软文推广:真实有效提升软文排名与收录的三大方法!

软文是一种具有良好传播效果的文体,可以通过在搜索引擎中排名靠前的方式,为品牌或企业带来更多曝光。但是,如何让软文在搜索引擎中得到更好的收录和排名呢?在本文中,我们将讨论如何提升软文的收录和排名,以…

Unity记录3.4-地图-柏林噪声生成 1D 地图及过渡地图

文章首发及后续更新:https://mwhls.top/4489.html,无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评,非常感谢! 汇总:Unity 记录 摘要:柏林噪声生成…

深入理解栈:从CPU和函数的视角看栈的管理、从栈切换的角度理解进程和协程

我们知道栈被操作系统安排在进程的高地址处,它是向下增长的。但这只是对栈相关知识的“浅尝辄止”。栈是每一个程序员都很熟悉的话题,但你敢说你真的完全了解它吗?我相信,你在工作中肯定遇到过栈溢出(StackOverflow&am…

java轻量级框架MiniDao的详解

MiniDao是一款基于Java语言开发的轻量级持久层框架,它的目标是简化数据库操作流程,提高开发效率,减少代码量。MiniDao采用简单的注解配置方式,可以很容易地与Spring等常用框架集成使用。 MiniDao的主要特点包括: 简单…

ChatGPT实战100例 - (03) 网站用不惯?油猴子盘它

文章目录 ChatGPT实战100例 - (03) 网站用不惯?油猴子盘它一、需求与思路二、油猴子脚本二、油猴子脚本部署 ChatGPT实战100例 - (03) 网站用不惯?油猴子盘它 一、需求与思路 需求:网页太长,要回顶部慢慢拖? No&…

盖子的c++小课堂——第十七讲:递归

前言 通知一下,以后每周不定期更新,有可能是周六更新,也可能是周日吧,反正会更新的~~还有我新出的专栏《跟着盖子读论语》,记得订阅一下啊跟着盖子学《论语》_我叫盖子的盖鸭的博客-CSDN博客 三元表达式 三元表达式…

android studio 重装之老年人

原由:前一天估计未正确关机,导致第二天0004蓝屏开机,重装系统,装好androidstudio 以及jdk,adt (且adt要新否则连不上) a.出现adb device 未知最常见的方案就是先找到占用ADB的端口的程序,然后杀死重启服务…

【Python入门第五十二天】Python丨NumPy 数组过滤

数组过滤 从现有数组中取出一些元素并从中创建新数组称为过滤(filtering)。 在 NumPy 中,我们使用布尔索引列表来过滤数组。 布尔索引列表是与数组中的索引相对应的布尔值列表。 如果索引处的值为 True,则该元素包含在过滤后的…