wefantasy / FabricLearn

本项目虚拟了一个工作室联盟链需求并将逐步实现,致力于提供一个易理解、可复现的Fabric学习项目,其中项目部署步骤的各个环节都拆解至清晰可见,并且将所有实验打包为脚本使之能够被快速复现在任何一台具备基础环境的主机上。
https://ifantasy.net/tags/fabriclearn/
55 stars 16 forks source link

如何用 peer channel 替代 osnadmin 完成通道加入? #3

Closed ZoomQuiet closed 1 year ago

ZoomQuiet commented 2 years ago

background

无法在 arm64 环境中启动 CA 容器

降级为 Fabric 2.1.0 网络, 所以, 没有 osnadmin 指令配套

goal

继续, 完成网络配置, 以及基本 golang 版本 chaincode 检验, 和 gateway 测试

ask

osnadmin 加入通道指令 的对应 peer channel 指令 是如何的?

wefantasy commented 2 years ago

创建通道并使组织加入的一个经典流程为:

  1. 创建通道配置文件 configtx.yaml
  2. 根据通道配置文件生成对应通道的交易文件 *.tx
  3. 通过 configtx.yaml 中配置有权限组织的 peer节点的 peer channel create 命令创建通道并生成通道创世区块文件 *.block
  4. 在其他组织中使用 peer channel join 加入通道

相关命令的使用可以参考实验 2_FabricNetworkUpdate 中的 3_Configtxgen.sh 文件内容:
image

ZoomQuiet commented 2 years ago

@wefantasy 多谢指引, 综合考虑, 对应改写 6_ContractGatewayAndSDK 中的指令比较吻合当前规划, 但是报错:

$ peer channel create -o orderer1.council.ifantasy.net:7052 -c testchannel -f $LOCAL_ROOT_PATH/data/testchannel.tx --outputBlock $LOCAL_ROOT_PATH/data/testchannel.block --tls --cafile $ORDERER_CA Error: failed to create deliver client for orderer: orderer client failed to connect to orderer1.council.ifantasy.net:7052: failed to create new connection: context deadline exceeded

无法访问对应容器服务?

已经按照 3_Configtxgen.sh 中先导指令逐一运行成功, 当前 容器:

CONTAINER ID   IMAGE                                  COMMAND                  CREATED          STATUS          PORTS                                                                                                                                       NAMES
212aebbff966   hyperledger/fabric-orderer:arm64-2.1   "orderer"                58 minutes ago   Up 58 minutes   7050/tcp, 0.0.0.0:7057->7057/tcp, :::7057->7057/tcp, 0.0.0.0:7058->8888/tcp, :::7058->8888/tcp, 0.0.0.0:7059->9999/tcp, :::7059->9999/tcp   orderer3.council.ifantasy.net
3b1d1ac1cdd3   hyperledger/fabric-orderer:arm64-2.1   "orderer"                58 minutes ago   Up 58 minutes   7050/tcp, 0.0.0.0:7054->7054/tcp, :::7054->7054/tcp, 0.0.0.0:7055->8888/tcp, :::7055->8888/tcp, 0.0.0.0:7056->9999/tcp, :::7056->9999/tcp   orderer2.council.ifantasy.net
4e0e38e57fed   hyperledger/fabric-orderer:arm64-2.1   "orderer"                58 minutes ago   Up 58 minutes   7050/tcp, 0.0.0.0:7051->7051/tcp, :::7051->7051/tcp, 0.0.0.0:7052->8888/tcp, :::7052->8888/tcp, 0.0.0.0:7053->9999/tcp, :::7053->9999/tcp   orderer1.council.ifantasy.net
1dc33ac8f32b   hyperledger/fabric-peer:arm64-2.1      "peer node start"        59 minutes ago   Up 58 minutes   7051/tcp, 0.0.0.0:7351->7351/tcp, :::7351->7351/tcp                                                                                         peer1.web.ifantasy.net
7a3012c7701d   hyperledger/fabric-peer:arm64-2.1      "peer node start"        59 minutes ago   Up 58 minutes   7051/tcp, 0.0.0.0:7451->7451/tcp, :::7451->7451/tcp                                                                                         peer1.hard.ifantasy.net
117682b158c4   hyperledger/fabric-peer:arm64-2.1      "peer node start"        59 minutes ago   Up 58 minutes   7051/tcp, 0.0.0.0:7251->7251/tcp, :::7251->7251/tcp                                                                                         peer1.soft.ifantasy.net
174cca6321ea   hyperledger/fabric-ca:arm64-1.4.3      "sh -c 'fabric-ca-se…"   18 hours ago     Up 18 hours     7054/tcp, 0.0.0.0:7250->7050/tcp, :::7250->7050/tcp                                                                                         soft.ifantasy.net
c5d01f4000e3   hyperledger/fabric-ca:arm64-1.4.3      "sh -c 'fabric-ca-se…"   18 hours ago     Up 18 hours     7054/tcp, 0.0.0.0:7350->7050/tcp, :::7350->7050/tcp                                                                                         web.ifantasy.net
d53b661fc70a   hyperledger/fabric-ca:arm64-1.4.3      "sh -c 'fabric-ca-se…"   18 hours ago     Up 18 hours     7054/tcp, 0.0.0.0:7450->7050/tcp, :::7450->7050/tcp                                                                                         hard.ifantasy.net
6ace1f61d68d   hyperledger/fabric-ca:arm64-1.4.3      "sh -c 'fabric-ca-se…"   18 hours ago     Up 18 hours     0.0.0.0:7050->7050/tcp, :::7050->7050/tcp, 7054/tcp                                                                                         council.ifantasy.net

当前 系统环境: $ env | grep ORD

ORDERER_ADMIN_TLS_SIGN_CERT=/home/zoomq/go/src/github.com/hyperledger/k8s2hlf/FabricLearn/6_ContractGatewayAndSDK/orgs/council.ifantasy.net/registers/orderer1/tls-msp/signcerts/cert.pem
ORDERER_CA=/home/zoomq/go/src/github.com/hyperledger/k8s2hlf/FabricLearn/6_ContractGatewayAndSDK/orgs/soft.ifantasy.net/assets/tls-ca-cert.pem
ORDERER_ADMIN_TLS_PRIVATE_KEY=/home/zoomq/go/src/github.com/hyperledger/k8s2hlf/FabricLearn/6_ContractGatewayAndSDK/orgs/council.ifantasy.net/registers/orderer1/tls-msp/keystore/key.pem

当前参数: $ echo $ORDERER_CA /home/zoomq/go/src/github.com/hyperledger/k8s2hlf/FabricLearn/6_ContractGatewayAndSDK/orgs/soft.ifantasy.net/assets/tls-ca-cert.pem

$ ls $LOCAL_ROOT_PATH/data/testchannel.tx /home/zoomq/go/src/github.com/hyperledger/k8s2hlf/FabricLearn/6_ContractGatewayAndSDK/data/testchannel.tx

ls $LOCAL_ROOT_PATH/data/testchannel.block /home/zoomq/go/src/github.com/hyperledger/k8s2hlf/FabricLearn/6_ContractGatewayAndSDK/data/testchannel.block

$ peer version peer: Version: 2.1.0 Commit SHA: f293f92b4 Go version: go1.14.1 OS/Arch: linux/arm64 Chaincode: Base Docker Label: org.hyperledger.fabric Docker Namespace: hyperledger

当前端口: $ sudo netstat -nltp

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:7050            0.0.0.0:*               LISTEN      31699/docker-proxy
tcp        0      0 0.0.0.0:7051            0.0.0.0:*               LISTEN      6624/docker-proxy
tcp        0      0 127.0.0.1:44491         0.0.0.0:*               LISTEN      1175/containerd
tcp        0      0 0.0.0.0:7052            0.0.0.0:*               LISTEN      6563/docker-proxy
tcp        0      0 0.0.0.0:7053            0.0.0.0:*               LISTEN      6530/docker-proxy
tcp        0      0 0.0.0.0:7054            0.0.0.0:*               LISTEN      6745/docker-proxy
tcp        0      0 0.0.0.0:7055            0.0.0.0:*               LISTEN      6646/docker-proxy
tcp        0      0 0.0.0.0:7056            0.0.0.0:*               LISTEN      6582/docker-proxy
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1247/nginx: master
tcp        0      0 0.0.0.0:7057            0.0.0.0:*               LISTEN      6787/docker-proxy
tcp        0      0 0.0.0.0:7058            0.0.0.0:*               LISTEN      6692/docker-proxy
tcp        0      0 0.0.0.0:7250            0.0.0.0:*               LISTEN      31763/docker-proxy
tcp        0      0 0.0.0.0:7059            0.0.0.0:*               LISTEN      6603/docker-proxy
tcp        0      0 0.0.0.0:7251            0.0.0.0:*               LISTEN      6069/docker-proxy
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      722/systemd-resolve
tcp        0      0 0.0.0.0:7350            0.0.0.0:*               LISTEN      31570/docker-proxy
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      2806/sshd
tcp        0      0 0.0.0.0:7351            0.0.0.0:*               LISTEN      6100/docker-proxy
tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN      1138/postgres
tcp        0      0 0.0.0.0:7450            0.0.0.0:*               LISTEN      31601/docker-proxy
tcp        0      0 0.0.0.0:7451            0.0.0.0:*               LISTEN      6134/docker-proxy
tcp        0      0 0.0.0.0:1022            0.0.0.0:*               LISTEN      5264/sshd
tcp6       0      0 :::7050                 :::*                    LISTEN      31708/docker-proxy
tcp6       0      0 :::7051                 :::*                    LISTEN      6630/docker-proxy
tcp6       0      0 :::7052                 :::*                    LISTEN      6570/docker-proxy
tcp6       0      0 :::7053                 :::*                    LISTEN      6538/docker-proxy
tcp6       0      0 :::7054                 :::*                    LISTEN      6752/docker-proxy
tcp6       0      0 :::7055                 :::*                    LISTEN      6668/docker-proxy
tcp6       0      0 :::7056                 :::*                    LISTEN      6590/docker-proxy
tcp6       0      0 :::80                   :::*                    LISTEN      1247/nginx: master
tcp6       0      0 :::7057                 :::*                    LISTEN      6799/docker-proxy
tcp6       0      0 :::7058                 :::*                    LISTEN      6715/docker-proxy
tcp6       0      0 :::7250                 :::*                    LISTEN      31787/docker-proxy
tcp6       0      0 :::7059                 :::*                    LISTEN      6611/docker-proxy
tcp6       0      0 :::7251                 :::*                    LISTEN      6075/docker-proxy
tcp6       0      0 :::7350                 :::*                    LISTEN      31576/docker-proxy
tcp6       0      0 :::22                   :::*                    LISTEN      2806/sshd
tcp6       0      0 :::7351                 :::*                    LISTEN      6107/docker-proxy
tcp6       0      0 :::5432                 :::*                    LISTEN      1138/postgres
tcp6       0      0 :::7450                 :::*                    LISTEN      31608/docker-proxy
tcp6       0      0 :::7451                 :::*                    LISTEN      6173/docker-proxy
tcp6       0      0 :::1022                 :::*                    LISTEN      5264/sshd

当前域名: $ cat /etc/hosts

127.0.0.1       localhost
...
127.0.0.1       council.ifantasy.net
127.0.0.1       soft.ifantasy.net
127.0.0.1       web.ifantasy.net
127.0.0.1       hard.ifantasy.net
127.0.0.1       orderer1.council.ifantasy.net
127.0.0.1       orderer2.council.ifantasy.net
127.0.0.1       orderer3.council.ifantasy.net
127.0.0.1       peer1.soft.ifantasy.net
127.0.0.1       peer1.web.ifantasy.net
127.0.0.1       peer1.hard.ifantasy.net

进入对应 orderer1 探查: $ docker exec -it 4e0e38e57fed sh

/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 orderer
   23 root      0:00 sh
   29 root      0:00 ps
/ # orderer version
orderer:
 Version: 2.1.0
 Commit SHA: f7f505b
 Go version: go1.14.1
 OS/Arch: linux/arm64

/ # netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.11:42849        0.0.0.0:*               LISTEN      -
tcp        0      0 :::7051                 :::*                    LISTEN      1/orderer
tcp        0      0 :::9999                 :::*                    LISTEN      1/orderer

看起来都正常, 为什么无法完成通道创建?

以及, 既然规划是 3org, 但是, 都加入同一通道, 以便完成数据互通, 可为什么要给3个orderer 分别创建不同通道呢?

ZoomQuiet commented 2 years ago

@wefantasy

PS:

根据端口观察尝试修改为 orderer1.council.ifantasy.net:7053 也一样 error:

Error: failed to create deliver client for orderer: orderer client failed to connect to orderer1.council.ifantasy.net:7053: failed to create new connection: context deadline exceeded

如果修订为 :7051 则是无系统通道的错误:

2022-08-14 15:42:50.570 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized Error: got unexpected status: BAD_REQUEST -- channel creation request not allowed because the orderer system channel is not yet defined

wefantasy commented 2 years ago

@ZoomQuiet 这里主要需要清楚 osnadminpeer channel create 的差异:osnadmin用来管理 orderer节点,使用时对接的端口为 admin的专属端口,如 orderer1的 7052 端口,目前主要在无系统通道启动网络中用到;peer用来管理 peer节点,使用时对接的 peer 通用端口,如 peer1.soft 的 7251 , peer channel create 主要在有系统通道启动网络中用到;
这里尝试基于实验 6_ContractGatewayAndSDK 修改网络,而该实验的总体配置是无系统通道启动,所以便无法直接将 osnadmin命令替换成 peer channel create 命令,因为与之对应的其它文件也需要修改。一个可能的修改是将 docker-base.yaml 文件中的相关注释取消(除此之外可能其它配置文件也需要修改):

  orderer-base:
    image: hyperledger/fabric-orderer:${FABRIC_BASE_VERSION}
    environment:
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=${DOCKER_CA_PATH}/orderer/genesis.block

如果以上修改仍然无法成功运行的话,建议先运行以有系统通道启动的实验案例,比如 1_3Org2Peer1Orderer1TLS 2_FabricNetworkUpdate

wefantasy commented 2 years ago

既然规划是 3org, 但是, 都加入同一通道, 以便完成数据互通, 可为什么要给3个orderer 分别创建不同通道呢?

@ZoomQuiet 在各个实验中并没有将3个orderer分别创建不同通道——它们都属于同一个组织并且都加入了(必须)相同的通道 testchannel 。只是在实验 Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务、多组织共同运行维护Orderer 中尝试了让3个 orderer 由不同组织维护,但最终发现这样不合理。

ZoomQuiet commented 2 years ago

既然规划是 3org, 但是, 都加入同一通道, 以便完成数据互通, 可为什么要给3个orderer 分别创建不同通道呢?

@ZoomQuiet 在各个实验中并没有将3个orderer分别创建不同通道——它们都属于同一个组织并且都加入了(必须)相同的通道 testchannel 。只是在实验 Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务、多组织共同运行维护Orderer 中尝试了让3个 orderer 由不同组织维护,但最终发现这样不合理。

怪不得, 那就明白了, 这样可以对应修改网络结构;

所以, 这里从 0 到 6 正如文章所言, 都是一组设想的检验, 并不能作为生产用网络配置过程来使用, 但是, 理解后对应修订才可以真正完成一个可用 HLF 网络的创建..

其实现在主要的问题在: configtxgen configtxlator cryptogen discover idemixgen orderer osnadmin peer fabric-ca-client fabric-ca-server

这组工具, 都必须通过 官方仓库 clone 到本地来编译; 前8从要从 fabric , 但是, 反复检验发现: 只能在 v2.3.3 tag 中可以正确编译出(不包含osnadmin); 其它分支都有各种问题;

而后两个只能从 fabric-ca 仓库中编译, 而反复检验, 又只能从 v1.5.2 分支中正常编译出, 其它分支都有各种问题;

而从其它类似案例中可下载到 arm64 版本的工具也都有问题, 比如: busan15/fabric-binaries-pi: AArch64/ARM64 binaries of Hyperledger Fabric for use with the Raspberry Pi 2/3/4. 中的 fabric-ca-* 不可用; chinyati/Hyperledger-Fabric-ARM64-images: These are Hyperledger Fabric arm64 images and binaries for use on Raspberry Pi 4+ running Raspbian OS 64 Bit. 中的也一样...

wefantasy commented 2 years ago

抱歉,由于条件限制,我只在 x86 机器上完成了所有实验,且所用工具皆为官方编译后的工具,所以可能无法在类似的不同架构编译问题上提供建议