赞
踩
puyijun@vmubuntu2204:~$ uname -a
Linux vmubuntu2204 5.15.0-91-generic #101-Ubuntu SMP Tue Nov 14 13:29:11 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux
5.15.0-91-generic
是内核的具体版本号,其中 generic
表示这是一个通用内核版本,适用于各种硬件。aarch64
,也就是64位的ARM架构。这种架构常见于ARM处理器,这种处理器通常用于移动设备、一些服务器和最近的一些个人电脑。1) docker:https://download.docker.com/linux/static/stable/
这里有多个架构的镜像:
1. armel -- 全称:ARM EABI (Embedded Application Binary Interface);架构:通常指32位的旧ARM处理器,如ARMv5;用途:`armel`是为较老的、性能较低的ARM设备设计的,支持没有硬件浮点运算的处理器;兼容性:与较老的ARM设备兼容。
2. armhf -- 全称:ARM Hard Float;架构:指32位的较新ARM处理器,如ARMv7;用途:`armhf`代表“硬浮点”,意味着这些处理器支持硬件浮点运算,这对于许多计算任务来说更高效;兼容性:与支持硬件浮点运算的较新ARM设备兼容。
3. aarch64 -- 全称:ARM 64-bit Architecture;架构:指64位的ARM处理器,如ARMv8;用途:`aarch64`为64位处理器设计,提供了更高的性能和更大的内存地址空间;兼容性:与64位ARM处理器兼容,常见于现代移动设备和一些服务器。
根据我的虚拟机架构,选择 aarch64 的架构的镜像下载
2)docker-compose:https://github.com/docker/compose/releases
![image-20240126121920303](https://img-blog.csdnimg.cn/img_convert/bcb6bebf90306986b02a9b1d321c8419.png)
我选择了 2.17.2 版本的 aarch64 架构的
3)准备 docker.service 配置文件
docker.service [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not support the cgroup feature set required # for containers run by docker ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID # Having non-zero Limit*s causes performance problems due to accounting overhead # in the kernel. We recommend using cgroups to do container-local accounting. LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity # Uncomment TasksMax if your systemd version supports it. # Only systemd 226 and above support this version. #TasksMax=infinity TimeoutStartSec=0 # set delegate yes so that systemd does not reset the cgroups of docker containers Delegate=yes # kill only the docker process, not all processes in the cgroup KillMode=process # restart the docker process if it exits prematurely Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target
解压 docker ,并移动到 /usr/bin 目录下
tar -xvf docker-20.10.7.tar
sudo cp -p docker/* /usr/bin
将 docker-compose 复制到 /usr/local/bin 目录下,重命名为 docker-compose,并设置权限
sudo cp docker-compose-linux-aarch64 /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
将 docker.service 移到 /etc/systemd/system/ 目录,并设置权限
sudo cp docker.service /etc/systemd/system/
sudo chmod +x /etc/systemd/system/docker.service
加载配置文件,启动 docker,设置 docker 开机启动
systemctl daemon-reload
systemctl start docker
systemctl enable docker.service
我下载的是1.20.13 版本 arm64 架构的
tar -xf go1.20.13.linux-arm64.tar
sudo mkdir /usr/lib/golang
sudo cp go/* /usr/lib/golang/ -rf
vim /etc/profile
# 文件尾部添加
export GOROOT=/usr/lib/golang
export PATH=$PATH:$GOROOT/bin
# 启用修改
source /etc/profile
mkdir test-fabric
cd test-fabric
curl -sSLO https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh && chmod +x install-fabric.sh
-f, --fabric-version <arg>
:指定要安装的 Hyperledger Fabric 的版本。如果没有指定,默认为 '2.5.4'
。
-c, --ca-version <arg>
:指定要安装的 Hyperledger Fabric CA(证书颁发机构)的版本。如果没有指定,默认为 '1.5.7'
。
<comp-1> [<comp-2>] ... [<comp-n>]
指定要安装的组件。可以是下列一个或多个:
docker
:安装 Docker 镜像。
binary
:安装 Fabric 二进制文件。
samples
:安装 Fabric 示例。
podman
:安装使用 Podman(类似 Docker 的容器工具)的相关设置。
也可以只使用每个组件名称的首字母(例如,d
代表 docker
)。
如果没有指定任何组件,则默认安装 docker
、binary
和 samples
。
具体命令可以是
sudo ./install-fabric.sh d s b
sudo ./network.sh up
一个拥有两个 peer 节点和一个 orderer 节点的网络就起来了
通道是特定网络成员之间的私有通信层,只有被邀请加入通道的组织才能使用通道,对网络的其他成员来说这些通道是不可见的。每个通道都有一个单独的区块链账本,被邀请的组织会把它们的节点加入到通道中,以存储通道账本并验证通道上的交易。
直接使用 network.sh 脚本中的函数创建一个通道:
# 创建一个名为 mychannel 的通道
./network.sh createChannel
链码也就是智能合约,它用来与通道中的账本进行交互。智能合约包含了控制区块链账本上资产的业务逻辑,网络成员运行的应用程序可以调用智能合约在账本上创建资产以及更改和转移资产,应用程序还可以查询智能合约以读取账本上的数据。
使用智能合约创建的交易通常需要多个组织的签名才能提交到通道账本,多重签名是 Fabric 信任模型的核心部分。对交易要求多方背书可以防止通道上的某个组织篡改其节点上的账本或使用未经同意的业务逻辑。为了签署交易,每个组织需要在其节点上调用并执行智能合约,然后对交易的输出进行签名,如果输出一致且已由足够多的组织签名,交易就可以提交到账本。指定需要执行智能合约的通道上的一组组织的政策称为背书政策,这是作为链码定义的一部分设置的。
在 Fabric 中,智能合约以称为链码的包形式在网络上部署。链码安装在组织的节点上(install),然后部署到通道上,在那里它可以用来背书交易和与区块链账本进行交互。在链码部署到通道之前,通道的成员需要对链码定义达成一致(approve)。当所需数量的组织同意后,链码定义可以提交到通道(commit),链码准备就绪并可用。
具体的操作为在 /scripts/deployCC.sh 以及其他的文件如 utils.sh 中,使用方法比较简单:
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
这个命令直接在 peer0.org1.example.com 和 peer0.org2.example.com 上安装 asset-transfer (basic) 链码,并将链码部署在 mychannel 通道上,-ccl 指定 go 语言,具体的链码在 fabric-samples 目录中的 asset-transfer-basic 中
可能遇到的问题(第一次安装时遇到了,后来又干了一些事情之后再回来就没问题,即使直接用 sudo 也不会出现 go 的路径问题):
参考博客 link
使用 sudo 命令 gopath 有问题
Error: failed to normalize chaincode path: failed to determine module root: exec: "go": executable file not found in $PATH
但如果不适用 sudo 出现权限的问题
./scripts/packageCC.sh: line 90: log.txt: Permission denied
解决方法:修改 fabric-samples 目录的权限:
sudo chmod 777 -R /home/puyijun/test-fabric/fabric-samples
不用 sudo 执行命令即可
# 添加上级目录中的二进制 bin 工具集
export PATH=${PWD}/../bin:$PATH
# 设置 FABRIC_CFG_PATH
export FABRIC_CFG_PATH=$PWD/../config/
# 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
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":[]}'
# 调用 GetAllAssets 函数获取账本信息
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
# 调用 TransferAsset 函数进行一个转账操作
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"]}'
处理 docker 镜像的时候出现空间不足的问题
No space left on device
解决方法:
sudo docker system prune -a
最后发现是我给虚拟机之分了20G的磁盘大小,感觉有点太小了,所以现在进行扩容,扩容过程详见另一篇博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。