看尽浮华

导航

 

一、前言

本教程在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-samplesbin文件下的二进制文件添加到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"]}'

 

posted on 2022-10-27 11:34  看尽浮华  阅读(263)  评论(0编辑  收藏  举报