一、前言
本教程在Centos7版本下运行,请在执行操作前先部署Centos7环境,所有部署都按照官方文档hyperledger fabric进行,在运行过程中遇到的问题,我也会逐个说明,如果你对于区块链还不太了解,请先查阅区块链概念,文中若有理解不对的地方,欢迎批评指正。
二、Hyperledger Fabric介绍
Hyperledger Fabric 是 Hyperledger (超级账本)中的区块链项目之一,也是经典的联盟链之一。它有一个账本,使用智能合约,由参与者管理交易的系统,但它又不完全去中心化,即想要加入联盟的成员们需要从可信赖的成员服务提供者(MSP)注册,以下是一些相关概念的介绍。
名词 | 解释 |
资产 | 记录的数据,通常为json格式表示键值对的集合 |
链码 | 业务逻辑,即智能合约,定义修改交易指令 |
账本特性 | 基于键、范围和组合查询等特性 |
隐私 | 创建的通道之间是相互分隔的,虽然允许组织间共享网络基础设施,但也可以被私有化 |
安全和成员服务 | 所有成员公开,可以在更广泛的网络和通道上操作管理数据 |
共识 | 从提案和背书到排序、验证和提交,都有共识验证在里面,以保证交易达成共识,防止双花 |
区块链网络 | 为应用程序账本及智能合约(链码)服务的技术基础设施 |
原文链接:https://blog.csdn.net/weixin_44165950/article/details/124857431
下图为Hyperledger Fabric 的结构,详解见区块链网络:
三、测试网络示例
搭建开发环境
1.安装git
yum install git
2.安装curl
yum install curl
3.安装doocker
# 安装并检查版本
yum install docker-compose
docker --version
docker-compose --version
#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 run hello-world
4.安装go
mkdir ~/download
cd ~/download
# 下载
wget https://studygolang.com/dl/golang/go1.14.linux-amd64.tar.gz
# 解压
sudo tar -C /usr/local -xzf go1.14.linux-amd64.tar.gz
创建go目录配置环境
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
安装二进制和docker镜像
1.克隆仓库
mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
# 获取fabric-samples源码
git clone https://github.com/hyperledger/fabric-samples.git
2.选择版本
cd fabric-samples
# 可自行选择版本
git checkout release-2.2
#查看版本
git branch
3.将指定版本的 Hyperledger Fabric 平台特定二进制文件和配置文件安装到 fabric-samples 下的 /bin和 /config 目录中,下载指定版本的 Hyperledger Fabric docker 镜像
vi /etc/docker/daemon.json
#把以下代码加进去
{ "registry-mirrors":["https://registry.docker-cn.com"] }
注:可以多试几次
curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s 2.2.0 1.4.7 0.4.18
cd /root/go/src/github.com/hyperledger/fabric-samples/asset-transfer-basic/chaincode-go
环境变量设置
vi ~/.bashrc
# 添加下面的变量
export PATH=$PATH:$GOPATH/src/github.com/hyperledger/fabric-samples/bin
# 使之生效
source ~/.bashrc
# 检验成功否
fabric-ca-client version
使用Fabric测试网络
export FABRIC_LOGGING_SPEC=debug
1.启动测试网络
进入fabric-samples
下的test-network
./network.sh up
2.执行docker ps -a,看到创建的三个节点和之前的测试hello
Fabric网络成员的所有组织称为联盟,此测试网络有两个联盟成员org1、2,一个维护网络排序服务的组织orderer,每个组织各运营一个对等节点,peer0.org1.example.com和peer0.org2.example.com。
peer节点是fabric网络的基本组件,最常见的peer节点就是背书节点,对等节点存储区块链账本进行交易之前的验证。
该示例网络使用单节点Raft排序服务,以前的版本有solo模式和kafka模式,此测试仅使用单节点排序服务,但一个真实的网络将有多个排序节点,由一个或多个排序者组织。
3.创建个channle
./network.sh createChannel
4.启动一个链码
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
在这一步会报错,请执行下面步骤
cd /root/go/src/github.com/hyperledger/fabric-samples/asset-transfer-basic/chaincode-go
rm -f go.sum
go env -w GOPROXY=https://goproxy.cn,direct
go clean -modcache
go mod tidy
5.与网络交互
把fabric-samples
的bin
文件下的二进制文件添加到CLI路径:
/root/go/src/github.com/hyperledger/fabric-samples/bin
export PATH=${PWD}/../bin:$PATH
还需要将fabric-samples
代码库中的FABRIC_CFG_PATH
设置为指向其中的core.yaml
文件:
export FABRIC_CFG_PATH=$PWD/../config/
cd /root/go/src/github.com/hyperledger/fabric-samples/test-network
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
接下来可以调用链码(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":[]}'
注:在调用链码时会报错
Error: endorsement failure during invoke. response: status:500 message:"error in simulation: failed to execute transaction 75a77550b68a7476882e7a512fa0dd4f0accd90e9f1db7e5193c914dd91bb285: could not launch chaincode basic_1.0:3cfcf67978d6b3f7c5e0375660c995b21db19c4330946079afc3925ad7306881: error starting container: error starting container: API error (404): network fabric_test not found"
docker network ls
打开test-network/docker/docker-compose-test-net.yaml文件
可以发现这里的名字不对,需要将其修改成docker network ls的显示的docker_test。
注意在该文件中CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=fabric_test
有两处,所以需要我们改两个地方。
./network.sh down
然后重新启动走上面的步骤
接下来可以用CLI工具查询账本:
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
还可以转账或改变资产所有者(也就是数据库中的改操作)
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"]}'
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!