根据 GitHub显示Hyperledger Fabric官方维护两个 LTS版本,v1.4.x 版本仅支持到2021年4月,也就说其实已经到期了,v2.x 当前的 LTS 版本为 v2.2.x。而目前很多收费课程还是基于1.x 的,Fabric v2.x方面的视频教程看起来还很少,于是去油管找了份带咖喱味的挑战下英语听力。通常三哥们的技术都是很棒的,值得我辈学习,下面就让我来试试水有多深。
前置准备
基础知识
- 掌握一些基础编程概念
- 文本编辑器
- cli命令客户端
- 最好熟悉 Java, Python, JavaScript 或 Go 中的一种语言
- 掌握区块链的基本概念
- 数据库、端到端(p2p)网络
- 共识机制、基本加密知识(如加密技术、签名和哈希)
工具
基本都可以考虑使用比这里更新的版本:
- 操作系统:64位Ubuntu Linux 14.04/16.04 LTS或 macOS
- 最新版 curl 工具
- git
- Docker 引擎: 17.06.2-ce或以上
- Docker Compose:1.14或以上
- Go:1.13.x
- Node:8.9或以上(注:不支持9,但支持10.15.3或以上)
- npm:5.x
- Python:2.7
安装
Ubuntu 16.04的LTS都已经过了,大部分公司生产都不使用这个版本了吧?我们就使用18.04吧。
安装基础环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
sudo apt update # sudo apt-get install curl -y # 安装 Docker curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun sudo usermod -aG docker $USER # 配置文件镜像加速: /etc/docker/daemon.json {"registry-mirrors":["https://hub-mirror.c.163.com/"]} systemctl start docker #安装Docker compose sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose # Go 语言(暂不建议安装1.16) wget https://golang.google.cn/dl/go1.15.11.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.15.11.linux-amd64.tar.gz # 环境变量 export PATH=$PATH:/usr/local/go/bin # 国内加速 go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct # nodejs & npm curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - sudo apt-get install -y nodejs |
安装示例、二进制和 Docker 镜像
1 2 3 4 |
mkdir fabric-demo && cd fabric-demo # curl -sSL https://bit.ly/2ysbOFE | bash -s -- <fabric_version> <fabric-ca_version> <thirdparty_version> curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s export PATH=$HOME/fabric-demo/fabric-samples/bin/:$PATH |
fabric-samples/bin内的二进制文件
1 2 3 4 5 6 7 8 9 10 11 |
fabric-samples/bin/ ├── configtxgen # 创建通道配置文件(artifacts),如 genesis.block(创世块),channel.tx ├── configtxlator # 生成通道配置的工具 ├── cryptogen # 生成密钥/证书文件的工具 ├── discover # 用于服务发现的命令行客户端 ├── fabric-ca-client # 创建注册用户的客户端 ├── fabric-ca-server ├── idemixgen # 生成身份混合器MSP使用的密钥文件的工具 ├── orderer # 排序节点 ├── osnadmin └── peer # peer(对等)节点 |
peer 节点包含 Leader Peer 和 Anchor Peer两种类型
- Leader Peer
1234peer:gossip:useLeaderElection: true # 为 true 时进行动态选举,对应环境变量为 CORE_PEER_GOSSIP_USELEADERELECTIONorgLeader: false # 为 true 时进行静态指定,对应环境变量为 CORE_PEER_GOSSIP_ORGLEADER - Anchor Peer:某一加入通道的组织,主要用于跨组织的 peer 节点发现
项目目录结构
https://github.com/adhavpavan/BasicNetwork-2.0
crypto-config.yaml
1 2 3 4 5 |
cryptogen showtemplate > crypto-config.yaml sed -i 's/EnableNodeOUs: false/EnableNodeOUs: true/g' crypto-config.yaml sed -i 's/example.com/alanhou.org/g' crypto-config.yaml # 同一组织下如需多个peer,修改Template 下的 Count cryptogen generate --config=./crypto-config.yaml --output=./crypto-config/ |
生成的排序节点证书文件:
1 2 3 4 5 6 7 |
crypto-config/ordererOrganizations/alanhou.org/msp/ ├── admincerts # 管理员证书 ├── cacerts # 根CA服务器的证书 │ └── ca.alanhou.org-cert.pem ├── config.yaml └── tlscacerts # TLS根CA的证书 └── tlsca.alanhou.org-cert.pem |
configtx.yaml
通道 Policy 类型
Signature
:指定需要签名的用户来满足条件,例:
1234Policies:MyPolicy: # 自定义的名称Type: SignatureRule: "OR('Org1.peer', 'Org2.peer')" # peer, client, member, admin,对应前面配置文件应设置EnableNodeOUs: trueImplicitMeta
: 所指定的由 Signature 策略聚合而成,支持<ALL|ANY|MAJORITY> <sub_policy>
,如ANY Readers
- etcdraft:排荐使用,采取Leader and Follower 模式,从排序节点复制主排序节点的决策,比已淘汰的kafka模式简单,同时可防崩溃。raft 有三种状态 follower, candidate, leader
- solo:单排序节点,通常仅在测试时使用
进一步了解 raft共识机制:http://thesecretlivesofdata.com/raft/
1 2 3 4 5 6 7 8 9 |
SYS_CHANNEL="sys-channel" CHANNEL_NAME="mychannel" # 生成创世块 configtxgen -profile OrdererGenesis -configPath . -channelID $SYS_CHANNEL -outputBlock ./channel-artifacts/genesis.block # 生成通道配置块 configtxgen -profile BasicChannel -configPath . -outputCreateChannelTx ./channel-artifacts/mychannel.tx -channelID $CHANNEL_NAME # 生成组织1和组织2的锚点文件 configtxgen -profile BasicChannel -configPath . -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP configtxgen -profile BasicChannel -configPath . -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP |
docker-compose.yaml
因已指定创世块,请记得指定为文件,并做好路径的映射:
1 2 3 4 5 6 7 8 9 |
orderer.alanhou.org: ... environment: ... - ORDERER_GENERAL_GENESISMETHOD=file - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/genesis.block ... volumes: - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/genesis.block |
启动服务
1 2 3 |
docker-compose up -d # 创建、加入通道 cmd/create-channel.sh |
部署链码(chaincode)
链码的生命周期
Package->Install->Query->Approve->Check Commit Readiness->Commit->Query Committed->Invoke Init->Invoke->Query
可自行尝试其中的命令
1 |
cmd/deploy-chaincode.sh |
另外因为我们使用了 CouchDB,可以在网页端进行访问,如http://192.168.xx.xx:5984/_utils/
部分改造后的代码参见 GitHub
添加多 Raft 排序节点,需修改 docker-compose.yaml(如在services下新增orderer2.alanhou.org和orderer3.alanhou.org) 及 configtx.yaml(Profiles下的EtcdRaft及 Order 下的EtcdRaft)