区块链hyperledger fabric部署

一 搭建开发环境

 

 1.1 安装Git

sudo apt-get install git

1.2 安装curl

sudo apt-get install curl

 1.3 安装docker

# 安装并检查版本
sudo apt-get -y install docker-compose
docker --version
docker-compose --version
# 提示,以后只要碰到docker有关的错误,先执行2.3.1步骤
#1.重启docker
sudo systemctl start docker
#设置系统启动时docker启动,可选
sudo systemctl enable docker
#2.将用户添加到docker组,确保在用户命令下可以执行
sudo gpasswd -a $USER docker
#3.更新用户组
newgrp docker   
# docker信息
docker info
# 测试docker,若报错详见文末附加问题1
docker run hello-world 

1.4 安装go

新建目录、下载、解压

mkdir ~/download
cd ~/download
# 下载
wget https://studygolang.com/dl/golang/go1.13.linux-amd64.tar.gz
# 解压
sudo tar -C /usr/local -xzf go1.13.linux-amd64.tar.gz

配置环境

mkdir $HOME/go
#用vi打开~./bashrc,配置环境变量
vi ~/.bashrc
# 在最下方插入
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
#使配置的环境变量生效
source ~/.bashrc
#检查是否配置正确
go version
# 配置goproxy环境变量加速国内下载
go env -w  GOPROXY=https://goproxy.io

1.5 安装JQ

sudo apt-get install jq

二 安装实例、二进制和docker镜像

2.1 新建目录,克隆fabric-samples 仓库

mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
# 获取fabric-samples源码
git clone https://github.com/hyperledger/fabric-samples.git

 选择适当的版本标签,进入目录,切换分支

cd fabric-samples
# 可自行选择版本
git checkout release-2.2
#查看版本
git branch

2.2 下载docker镜像

 将指定版本的 Hyperledger Fabric 平台特定二进制文件和配置文件安装到 fabric-samples 下的 /bin和 /config 目录中,下载指定版本的 Hyperledger Fabric docker 镜像

2.2.1 配置镜像源

sudo vi /etc/docker/daemon.json
#把以下代码加进去
{
"registry-mirrors":["https://registry.docker-cn.com"]
}
#如果你想要最新的生产发布版本,忽略所有的版本标识符。
# curl -sSL https://bit.ly/2ysbOFE | bash -s
# curl -sSL https://bit.ly/2ysbOFE | bash -s -- <fabric_version> <fabric-ca_version> <thirdparty_version>
# 若报错详见文末附加问题2
curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.2.0 1.4.7 0.4.18
# 若不行试试下面这个
curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s  2.2.0 1.4.7 0.4.18

注:以上curl主要是为了获得一个bootstrap.sh的脚本文件并执行,可能会出现拒绝连接或者访问,以及网络故障等问题

可以去去fabric中下载bootstrap.sh源码即可。

  • 需要先下载zip https://github.com/hyperledger/fabric.git (master分支)
  • 再将文件fabric/scripts/bootstrap.sh 移动到目录$HOME/go/src/github.com/<your_github_userid>下,也就是虚拟机fabric-samples目录
  • 在fabric-samples目录下执行下面的指令
    cat bootstrap.sh |bash -s

    结果:

    2.2.2 将go版本匹 

 查看安装的go版本

go version
cd chaincode-go
sudo vi go.mod
# 进入文件发现是1.14 自己把改成1.13 ,要与你下载的go版本匹配

 2.2.3 环境变量设置

vi ~/.bashrc
# 添加下面的变量
export PATH=$PATH:$GOPATH/src/github.com/hyperledger/fabric-samples/bin
# 使之生效
source ~/.bashrc
# 检验成功否
fabric-ca-client version

 三 使用fabric测试网络

到了这里说明环境已经部署完毕,接下来要使用测试网络,需要注意的是最好在一个完整的时间段操作 。

首先开启debug模式

#开启debug模式
export FABRIC_LOGGING_SPEC=debug

 3.1 启动测试网络

进入fabric-samples下的test-network,执行以下命令以执行脚本network.sh

./network.sh up

执行完毕后看到,我们创建了排序组织orderer、联盟成员org1的peer0节点和联盟成员org2的peer0节点以及相应的镜像image

3.2 测试网络的组成部分

执行

docker ps -a

 Fabric网络成员的所有组织称为联盟,此测试网络有两个联盟成员org1、2,一个维护网络排序服务的组织orderer,每个组织各运营一个对等节点,peer0.org1.example.com和peer0.org2.example.com。peer节点是fabric网络的基本组件,最常见的peer节点就是背书节点,对等节点存储区块链账本进行交易之前的验证。
3.3 创建一个channel

使用./network.sh createChannel 在org1和org2之间创建通道并加入他们的对等节点,如下有几种方法:

  • 创建Channel,系统默认命名为 mychannel
  • channel名称限制
    • 仅包含小写ASCII字母数字,点“。”和破折号“-”
    • 少于250个字符
    • 以字母开头
# 1.不输入自定义名称通道,默认为mychannel
./network.sh createChannel
# 2.输入自定义名称,可以创建多个不同名称通道
./network.sh createChannel -c channel1
./network.sh createChannel -c channel2
# 3.也可以建立网络创建通道一起
./network.sh up createChannel

我这里默认通道名

 执行完成显示:

 3.3 在通道启动一个链码

在fabric 中,链码就是指的智能合约。
在创建通道后,开始部署链码与通道账本交互,链码包含区块链账本上资产的业务逻辑,用的go语言编写。由成员运行的应用程序网络可以在账本上调用智能合约创建,更改和转让资产。
为确保交易有效,使用智能合约创建的交易需要多个组织签名才能提交到账本,也就是背书,而智能合约也定义了背书策略,比如需要成员2/3同意便通过,一半成员同意通过等等。
创建完通道,现在开始启动链码

 

./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go

链码启动成功

 3.4 与网络互动,配置peer指令

均在 test-network 文件夹下执行

3.4.1 把fabric-samples的bin文件下的二进制文件添加到CLI路径:

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


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

export FABRIC_CFG_PATH=$PWD/../config/

 3.4.3 设置环境变量,允许用户作为org1操作peer的CLI:

# Environment variables for Org1

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
#CORE_PEER_TLS_ROOTCERT_FILE和CORE_PEER_MSPCONFIGPATH环境变量指向Org1的organizations文件夹中的的加密材料。
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 文件夹。 

 3.4.4 初始化账本

接下来可以调用链码(Go)的 InitLedger 方法来赋予一些账本上的初始资产,运行如下命令,用一些资产来初始化账本。

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":[]}'

3.4.5 用CLI工具查询账本

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

 

成功查询后的输出:
[{"AppraisedValue":300,"Color":"blue","ID":"asset1","Owner":"Tomoko","Size":5},
{"AppraisedValue":400,"Color":"red","ID":"asset2","Owner":"Brad","Size":5},
{"AppraisedValue":500,"Color":"green","ID":"asset3","Owner":"Jin Soo","Size":10},
{"AppraisedValue":600,"Color":"yellow","ID":"asset4","Owner":"Max","Size":10},
{"AppraisedValue":700,"Color":"black","ID":"asset5","Owner":"Adriana","Size":15},
{"AppraisedValue":800,"Color":"white","ID":"asset6","Owner":"Michel","Size":15}]

 账或改变资产所有者(也就是数据库中的改操作)

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":"TransferAsset","Args":["asset6","Christopher"]}'
更改结果:
[{"AppraisedValue":300,"Color":"blue","ID":"asset1","Owner":"Tomoko","Size":5},
{"AppraisedValue":400,"Color":"red","ID":"asset2","Owner":"Brad","Size":5},
{"AppraisedValue":500,"Color":"green","ID":"asset3","Owner":"Jin Soo","Size":10},
{"AppraisedValue":600,"Color":"yellow","ID":"asset4","Owner":"Max","Size":10},
{"AppraisedValue":700,"Color":"black","ID":"asset5","Owner":"Adriana","Size":15},
{"AppraisedValue":800,"Color":"white","ID":"asset6","Owner":"Christopher","Size":15}]

发现ID为asset6的拥有者已经变成了Christopher。

3.4.6 我们可以通过org2的peer来查询,在这之前我们先设置一下org2的环境变量

# Environment variables for Org2

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'

查询运行在 mychannel 上的 asset-transfer-basic 链码 peer0.org2.example.com 

 结果和org1一样asset6转给了名叫Christopher的人.

3.4.7 至此测试完毕,我们关闭网络./network.sh down

./network.sh down

 3.5 使用认证机构建立网络

 Hyperledger Fabric使用公钥基础设施(PKI)来验证所有网络参与者的行为。 每个节点,网络管理员和用户提交的交易需要具有公共证书和私钥以验证其身份。 这些身份必须具有有效的信任根源,该证书是由作为网络中的成员组织颁发的。
在测试网络中,network.sh在创建节点之前就使用cryptogen工具创建了这些加密材料。

在text-network目录下执行

./network.sh up -ca

结果:

可以看到脚本启动了三个CA,分别是orderer、org1和org2。 

下面还可以查看一下org1的MSP文件夹,其中包含了每个身份的证书和私钥:

tree organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/
# tree命令并不是默认安装的,如果没有该命令,按照提示先安装

organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/
└── msp
    ├── cacerts //根CA服务器证书
    │   └── localhost-7054-ca-org1.pem
    ├── config.yaml
    ├── IssuerPublicKey
    ├── IssuerRevocationPublicKey
    ├── keystore //节点的私钥
    │   └── 1018d5470ce399ed212639a454a80d1ea96592b01bed4c0560e11b65c34ed1b6_sk
    ├── signcerts
    │   └── cert.pem //账户证书文件
    └── user

5 directories, 6 files
 

关闭网络:

#关闭网络
./network.sh down

### Hyperledger Fabric 区块链平台概述 Hyperledger Fabric 是由 IBM 发起并最终交由 Linux 基金会托管的一个开源区块链项目[^2]。该平台旨在为企业级应用提供高性能、模块化和可扩展的分布式账本解决方案。 #### 主要特点 - **许可制**:作为一个联盟框架,Hyperledger Fabric 运行于一组已知且经过验证的身份之间,在这些参与者间建立了一定程度的信任关系。这种设计允许采用更为高效的共识机制,如崩溃容错 (CFT) 或拜占庭容错 (BFT),而无需像公有那样依赖工作量证明(PoW)[^4]。 - **灵活性与隐私保护**:支持多通道通信模式以及细粒度的数据访问控制策略,确保不同业务场景下的数据隔离性和保密性需求得到满足。 - **智能合约(码)**:通过 Go, Node.js 和 Java 编写的码程序定义了交易逻辑,并可以在多个节点上执行以实现一致性更新状态数据库的功能。 ### 架构详解 Hyperledger Fabric 的架构分为几个核心组件: 1. **Peer 节点** Peer 负责维护分类帐副本并与客户端应用程序交互处理读写请求;同时负责部署和调用码实例完成具体业务操作。 2. **Orderer 节点** Orderer 组件用于接收来自各个 peer 提交过来的新提案并将它们打包成区块按序广播给整个网络中的其他成员确认入账。 3. **会员服务提供商(MSP)** MSP 定义了一个组织内部及其合作伙伴间的身份认证体系结构,管理着用户证书签发、撤销列表分发等工作流程。 4. **CA 服务器** CA(证书授权机构)主要职责在于颁发 X.509 数字凭证供各参与方用来标识自己在网络里的角色权限等信息。 5. **SDK 工具包** SDK 提供给开发者一套完整的 API 接口库以便轻松集成 Fabric 功能至第三方前端界面或后台管理系统里去。 ```mermaid graph TD; A[Client Application] --> B(Ordering Service); C[Endorser Nodes] --> D(Ledger & Chaincode Execution); E(CA Server) -.-> F(Membership Services Provider); G[Smart Contracts/Chaincodes]; H(State Database); style A fill:#f96,stroke:#333,stroke-width:4px; style B fill:#bbf,stroke:#f66,stroke-width:2px; style C fill:#8be,stroke:#e77,stroke-width:2px; style D fill:#bbb,stroke:#6b6,stroke-width:2px; style E fill:#ff6,stroke:#6a6,stroke-width:2px; style F fill:#afa,stroke:#faa,stroke-width:2px; style G fill:#aff,stroke:#fac,stroke-width:2px; style H fill:#bff,stroke:#cda,stroke-width:2px; ``` ### 使用教程概览 对于希望学习如何构建基于 Hyperledger Fabric 应用系统的 nodejs 开发者而言,可以从以下几个方面入手[^3]: - **环境配置**:安装 Docker 及其 Compose 插件来简化本地测试网搭建过程; - **基础概念理解**:熟悉 Fabric 中涉及的关键术语比如 Ledger、Channel、MSP 等; - **动手实践**:尝试编写简单的 chaincode 实现基本增删改查功能; - **深入探索**:研究官方文档中关于性能优化、安全加固等方面的指导建议。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值