Likt's Blog

天空一直都在,是云来了又去。

0%

Centos7搭建fabric

环境:centos7

官方文档:https://hyperledger-fabric.readthedocs.io/en/latest/test_network.html

安装步骤

一、打开终端,安装所需要的库

依次执行以下命令进行库的安装

1
2
3
4
5
6
7
8
9
su root//切换root用户
yum update //yum更新
yum install vim
yum install git
yum install curl //利用URL语法在命令行下工作的文件传输工具,支持文件上传和文件下载
yum install wget //下载文件的工具,经常要下载一些软件或从远程服务器恢复服务器
yum install libtool-ltdl-devel //make编译fabric用到
yum install epel-release //epel存储库,提供了许多额外的软件包
yum install jq //fabric测试网络用到

二、go语言环境安装

  1. 下载Go压缩包,并解压移动

    • 进入downloads目录:cd Downloads

    • 输入命令:wget https://golang.google.cn/dl/go1.22.3.linux-amd64.tar.gz

    • 解压该压缩包:tar -xzf go1.22.3.linux-amd64.tar.gz

    • 移动解压后的文件夹到/usr/local底下:mv go /usr/local

    image-20240714150237693

  2. 配置GO全局环境变量

    输入命令:vim ~/.bashrc

    ​ 添加以下内容:

    1
    2
    3
    4
    export  PATH=$PATH:/usr/local/go/bin
    export GOROOT=/usr/local/go
    export GOPATH=$HOME/go
    export PATH=$PATH:$HOME/go/bin

    ​ 使文件生效:source ~/.bashrc

  3. 查看go版本:go version

  4. 为当前用户设置go代理,国内镜像代理

    1
    2
    sudo /usr/local/go/bin/go env -w GO111MODULE=on
    sudo /usr/local/go/bin/go env -w GOPROXY=https://goproxy.cn,direct

三、docker安装

  1. 安装国内阿里云镜像:

    1
    2
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  2. 安装最新版本docker: yum install docker-ce

  3. 启动docker:service docker start

  4. 查看docker版本,启动是否正常:docker version

image-20240714150226927

四、docker-compose安装

  1. 安装依赖包:yum install epel-release
  2. 升级依赖包:yum -y update
  3. 安装pip:yum -y install python-pip
  4. 升级pip:pip install --upgrade "pip <21.0"
  5. 安装docker-compose:pip install -U docker-compose
  6. 查看版本:docker-compose version

五、下载fabric源码,编译fabric

  1. 新建存放fabric源码的目录并进入目录:

    1
    2
    mkdir -p $GOPATH/src/github.com/hyperledger
    cd $GOPATH/src/github.com/hyperledger
  2. 下载源码:git clone https://github.com/hyperledger/fabric.git

    image-20240714150211520

  3. 查看fabric所有版本,并切换版本:

    1
    2
    3
    cd fabric
    git tag 查看版本
    git checkout -b v2.5.7 切换版本
  4. 编译fabric:make release(如下即编译成功)

    image-20240522225312266

  5. 执行脚本文件:切换目录cd fabric/scripts随后执行脚本文件 ./bootstrap.sh

    真的!建议尽量就是用热点、开VPN,尽量就是让脚本文件自己执行成功,如果自己去分开拉文件的话后面大概率会出现各种各种的错!!!!血的教训

    截图如下:(因为我先用命令:git clone https://github.com/hyperledger/fabric-samples.git先克隆了fabric-samples所以脚本文件执行的时候这一步跳过了)

    image-20240714150156829

    我这里脚本文件拉镜像的时候,失败了,根据提示是因为docker守护进程服务没开。从输出中可以看出,Docker服务被禁用了。

    image-20240714150137641

    解决方法如下:

    1. 启用Docker服务

      1
      sudo systemctl enable docker.service
    2. 重新启动Docker服务

      1
      sudo systemctl restart docker
    3. 检查Docker服务状态

      1
      sudo systemctl status docker

      确保服务状态显示为“active (running)”。

    4. 尝试再次拉取镜像

      1
      2
      3
      4
      5
      docker pull hyperledger/fabric-peer:2.5.7
      docker pull hyperledger/fabric-orderer:2.5.7
      docker pull hyperledger/fabric-ccenv:2.5.7
      docker pull hyperledger/fabric-baseos:2.5.7
      docker pull hyperledger/fabric-ca:1.5.10

    附有截图如下:

    image-20240714150107733

    image-20240714150052604

    附上镜像docker images截图:

    image-20240522231202819

    有个办法可以确认脚本文件是否执行成功:

    ls fabric-samples/bin以及ls fabric-samples/config 看看这个目录是否存在,且里面是否有文件(因为其实如果分步拉文件的话也是要解压fabric二进制中的bin和config文件夹放入fabric-samples中,所以如果./bootstrap.sh执行成功的话在fabric-samples文件夹中可以看到bin和config)

    image-20240522231442017

六、运行测试fabric

  1. 切换目录:

    cd fabric-samples/test-network

  2. ./network.sh down先down一下,把之前可能残余的卷、镜像等删除,避免之后。。。(后果很严重说实话)

  3. ./network.sh up,启用网络:docker ps -a(看到有一个orderer、两个peer)如下成功

    image-20240714150028014

  4. 创建通道:./network.sh createChannel (没命名即默认为mychannel)

    image-20240714150001347

  5. 在创建的通道上部署链码:./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go

    image-20240522222301926

  6. 交互:

①首先在test-network目录下使用以下命令将这些二进制文件添加到CLI路径中;将FABRIC_CFG_PATH设置为指向核心,fabric-samples存储库中的Yaml文件:

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

export FABRIC_CFG_PATH=$PWD/../config/

②进而,配置Org1环境变量

1
2
3
4
5
6
7
# Environment variables for Org1

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

③接下来,运行以下命令初始化带有资产的分类账。

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

成功后如下截图:

1
2024-05-25 12:17:53.774 CST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200

image-20240522222736882

④运行以下命令获取已添加到通道分类账的资产列表:

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

image-20240522222852183

1
[{"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}]

⑤使用以下命令通过调用资产转移(基本)链码来更改分类账上资产的所有者:

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

成功截图如下:

1
2024-05-25 12:19:01.643 CST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200 payload:"Michel" 

image-20240522223039989

⑥由于我们已经查询了Org1对等体,我们可以借此机会查询在Org2对等体上运行的链码。需要设置的环境变量如下:

1
2
3
4
5
6
7
# 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

⑦现在可以查询运行在peer0.org2.example.com上的资产转移(基本)链码:

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

测试全过程截图如下:

1
{"AppraisedValue":800,"Color":"white","ID":"asset6","Owner":"Christopher","Size":15}

image-20240522223516921

7.关闭网络./network.sh down

一些报错:

  • pip install -U docker-compose基础性一个报错:(应该大部分都不会出现,浅浅记录一下)

image-20240714145927583

image-20240521164715347

​ 关于pip的问题,我还进行了一个步骤,如果上面没解决,蛮试一下这个方法:

1
2
3
4
5
cd ~
mkdir .pip
cd .pip
vim pip.conf
加入镜像

image-20240521164823586

  • 还是pip install -U docker-compose报错

出现类似如下图所示报错,解决方法如下:

image-20240422205520511

依次输入以下指令:

sudo find / -name *subpro*.egg-info

rm -rf /usr/lib64/python2.7/site-packages/subprocess32-3.2.6-py2.7.egg-info

这里发现继续报错如下

sudo find / -name subpro.egg-info
find: ‘/run/user/1000/gvfs’: Permission denied

于是:

1
2
umount /run/user/1000/gvfs    // 卸载该文件
rm -rf /run/user/1000/gvfs    // 删除该文件

image-20240422210903771

现在重新执行命令安装:pip install -U docker-compose

image-20240422211153785

  • 记录一下: 下载的时候文件被分隔了多个部分【下面截图的是2.3.2版本,但是我成功搭建的是2.5.7版本,因为这个错误是我最开始搭建遇到的,后面重装虚拟机,我也选择了一个高版本的】【关于文件合并吧】

但是可能会出现压缩包被分片:scripts文件夹中出现了hyperledger-fabric-linux-amd64-2.3.2.tar.gz的文件,同时还有hyperledger-fabric-linux-amd64-2.3.2.tar.gz.1和hyperledger-fabric-linux-amd64-2.3.2.tar.gz.2

image-20240430113712833

出现这种文件名后跟点号和数字的情况,通常表明文件在传输或复制过程中被分割成了多个部分,以方便恢复或传输

我使用file命令查看这三个文件,发现它们的修改日期和文件类型都一直,故大概率可以合并:

image-20240430115127460

①执行命令:cat hyperledger-fabric-linux-amd64-2.3.2.tar.gz.* > hyperledger-fabric-linux-amd64-2.3.2.tar.gz 进行合并

ls发现这三个文件都还存在,因为cat命令只完成了合并,没有删除,于是执行命令:rm hyperledger-fabric-linux-amd64-2.3.2.tar.gz.*,这个命令将会删除所有以 hyperledger-fabric-linux-amd64-2.3.2.tar.gz. 开头,并且后面跟着任意字符的文件。

  • make fabric-ca-server这里报错【这里其实是我参考师傅一的博客教程搭建过程中遇到的,后来我结合官方文档搭建的时候其实没用到这个步骤,蛮写下】【归根到底其实就是从GitHub上下东西不完整导致的】

这里如果出错,我找了很多的方法,都不能解决。最终发现其实是前面安装过程中有些安装失败了。(比如我就是因为fabric-ca的安装问题)下面提供一些我报错的一些截图:

image-20240423170402519

image-20240424181207918

发现问题之后,重新安装了fabric-ca,最后编译成功,截图参考如下:

image-20240430124638452

总结

  1. 这个fabric的搭建耗时可能有十几天吧,看了很多博客类教程,踩了很多坑,fabric下了删删了下,甚至为此重装了一个虚拟机。这里建议,整体的安装还是参考官方文档:https://hyperledger-fabric.readthedocs.io/en/latest/test_network.html

  2. fabric的搭建涉及很多前置环境的搭建,为此这里参考的是师傅一的博客以及师傅二

  3. 关于./bootstrap.sh脚本的执行,建议真的还是让他执行成功(挺耗时间),如果实在是不行,可以参考师傅三的博客分开拉(我的确是有用过这个方法的,结果一言难尽。。。。)【要下载的文件:①hyperledger/fabric-samples

    git clone https://github.com/hyperledger/fabric-samples.git ② fabric binaries文件https://github.com/hyperledger/fabric/releases/download/v2.5.7/hyperledger-fabric-linux-amd64-2.5.7.tar.gz

    ③fabric-ca-client binary文件 https://github.com/hyperledger/fabric-ca/releases/download/v1.5.10/hyperledger-fabric-ca-linux-amd64-1.5.10.tar.gz ④脚本实在无法执行,用./bootstrap.sh -b命令Pull Hyperledger Fabric docker images】下载完之后需要解压fabric binaries文件将其bin和config移入fabric-samples文件夹等等(这种手动安装说实话具体不清楚到底怎么操作,失败了无数次)(参考师傅二的步骤试试吧)

  4. 其实最大头也就是./bootstrap.sh脚本的执行,成功的话,一切好说,后面一路顺畅。失败的话,后面。。。。。(可以体会一下::sweat_smile::sweat_smile::sweat_smile:)

  5. 无论如何经历了,所以这里附上一些过程中遇到的些错误,有些没截图了:(你不是一个人!!!!)糟糕!我发现我都找不到截图了,报错之后我是直接复制到浏览器找答案了。总之,如果在运行测试fabric中出现各种错误,大概率大概率就是文件下载问题,这边建议全删重下!!!因为大概率是找不到答案的,或许可以找到一个方法解决当下的报错,但是报错是无止境的。。。

    找到几张:

    image-20240523002015466

    image-20240523002031487

    ②创建通道之后如果.network.sh down后再up,那么创建的通道会消失需要重新创建:

    目前一切没有问题,合约交互的时候报错:

    1
    Error: endorsement failure during invoke. response: status:500 message:"error in simulation: failed to execute transaction 345f9b4d7b04ffbca4ede017f667904dd6ff63845a872daac9224ae619061921: could not launch chaincode basic_1.0:4ec191e793b27e953ff2ede5a8bcc63152cecb1e4c3f301a26e22692c61967ad: error starting container: error starting container: API error (404): network _test not found" 

    这呢,我试着按这个改了,但是无效:

    https://blog.csdn.net/h363659487/article/details/117850567

    最后改回去了,并采用了下面那种方法(这里有效解决了test not found:

    参考博客https://blog.csdn.net/m0_57128752/article/details/120287922【按这教程我确实解决了这个问题】

    ③这下吧,终于解决了_test not found的问题,but 现在创建channel都failed了一直,有点难绷。

    ④真的就是报错无止境,故弃之,全删,重装!

  6. 关于续传:虽然说wget支持断点续传,即从上次中断的地方继续开始下载。但是实践好像不成功,于是添加-c参数强制它续传下载。

    sudo wget -c https://github.com/hypDerledger/fabric/releases/download/v2.5.7/hyperledger-fabric-linux-amd64-2.5.7.tar.gz

写在最后:其实搭建过程相对较简单,但是我花了好久:fist_oncoming:,希望这篇博客可以帮到每一个深陷困境的大家!

-------------本文结束感谢您的阅读-------------