官方安装教程:https://hyperledger-fabric.readthedocs.io/en/latest/install.html
1、安装docker,docker-compose,golang
docker版本号:20.10.1
docker-compose版本号:1.24.1
golang版本号:1.15.5
2、Download the latest release of Fabric samples, docker images, and binaries
(1)由于网络被墙,链接可能无法打开,如果没VPN跳过此步骤:
$ curl -sSL https://bit.ly/2ysbOFE | bash -s]
(2)打开下面的链接,新建bootstrap.sh文件,并把网页的内容复制进去:
# https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh
$ chmod -R 0777 bootstrap.sh
$ ./bootstrap.sh
================================打印日志开始================================
root@aa:~/block# ./bootstrap.sh
Clone hyperledger/fabric-samples repo
===> Cloning hyperledger/fabric-samples repo
Cloning into 'fabric-samples'...
remote: Enumerating objects: 8272, done.
remote: Counting objects: 100% (547/547), done.
remote: Compressing objects: 100% (347/347), done.
remote: Total 8272 (delta 248), reused 410 (delta 190), pack-reused 7725
Receiving objects: 100% (8272/8272), 4.91 MiB | 10.21 MiB/s, done.
Resolving deltas: 100% (4282/4282), done.
fabric-samples v2.3.3 does not exist, defaulting to main. fabric-samples main branch is intended to work with recent versions of fabric.
Pull Hyperledger Fabric binaries
===> Downloading version 2.3.3 platform specific fabric binaries
===> Downloading: https://github.com/hyperledger/fabric/releases/download/v2.3.3/hyperledger-fabric-linux-amd64-2.3.3.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 680 100 680 0 0 2645 0 --:--:-- --:--:-- --:--:-- 2635
100 69.2M 100 69.2M 0 0 594k 0 0:01:59 0:01:59 --:--:-- 4830k
==> Done.
===> Downloading version 1.5.2 platform specific fabric-ca-client binary
===> Downloading: https://github.com/hyperledger/fabric-ca/releases/download/v1.5.2/hyperledger-fabric-ca-linux-amd64-1.5.2.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 652 100 652 0 0 1179 0 --:--:-- --:--:-- --:--:-- 1179
100 25.4M 100 25.4M 0 0 19251 0 0:23:08 0:23:08 --:--:-- 17463
==> Done.
Pull Hyperledger Fabric docker images
FABRIC_IMAGES: peer orderer ccenv tools baseos
===> Pulling fabric Images
====> hyperledger/fabric-peer:2.3.3
2.3.3: Pulling from hyperledger/fabric-peer
Digest: sha256:fc9a143aaf528e407817baf658aff3b258f632464ad32bcfd0d17054b352b782
Status: Image is up to date for hyperledger/fabric-peer:2.3.3
docker.io/hyperledger/fabric-peer:2.3.3
====> hyperledger/fabric-orderer:2.3.3
2.3.3: Pulling from hyperledger/fabric-orderer
Digest: sha256:e5192e8619b9b0abd03ec6ce8babe65493d7db7e71faee3c1c8714bddf19b507
Status: Image is up to date for hyperledger/fabric-orderer:2.3.3
docker.io/hyperledger/fabric-orderer:2.3.3
====> hyperledger/fabric-ccenv:2.3.3
2.3.3: Pulling from hyperledger/fabric-ccenv
Digest: sha256:e95a727aed88456b496a4e4b1ddbc77e81c26a0cc7ff234c7d3d085dafd637cd
Status: Image is up to date for hyperledger/fabric-ccenv:2.3.3
docker.io/hyperledger/fabric-ccenv:2.3.3
====> hyperledger/fabric-tools:2.3.3
2.3.3: Pulling from hyperledger/fabric-tools
Digest: sha256:634c66833a264939b9920cfa0a47b028c20b39475d0bc7ca02841137ea2c4e86
Status: Image is up to date for hyperledger/fabric-tools:2.3.3
docker.io/hyperledger/fabric-tools:2.3.3
====> hyperledger/fabric-baseos:2.3.3
2.3.3: Pulling from hyperledger/fabric-baseos
Digest: sha256:3af16c343deaa5b837e2581b6b72523643e8572fd2981ed6bfea4a9fbf43bd20
Status: Image is up to date for hyperledger/fabric-baseos:2.3.3
docker.io/hyperledger/fabric-baseos:2.3.3
===> Pulling fabric ca Image
====> hyperledger/fabric-ca:1.5.2
1.5.2: Pulling from hyperledger/fabric-ca
Digest: sha256:faa3b743d9ed391c30f518a7cc1168160bf335f3bf60ba6aaaf1aa49c1ed023e
Status: Image is up to date for hyperledger/fabric-ca:1.5.2
docker.io/hyperledger/fabric-ca:1.5.2
===> List out hyperledger docker images
hyperledger/fabric-ca 1.5 4ea287b75c63 7 weeks ago 69.8MB
hyperledger/fabric-ca 1.5.2 4ea287b75c63 7 weeks ago 69.8MB
hyperledger/fabric-ca latest 4ea287b75c63 7 weeks ago 69.8MB
hyperledger/fabric-tools 2.3 98fa0bfb0fd2 7 weeks ago 445MB
hyperledger/fabric-tools 2.3.3 98fa0bfb0fd2 7 weeks ago 445MB
hyperledger/fabric-tools latest 98fa0bfb0fd2 7 weeks ago 445MB
hyperledger/fabric-peer 2.3 a491b5ab42f6 7 weeks ago 53.3MB
hyperledger/fabric-peer 2.3.3 a491b5ab42f6 7 weeks ago 53.3MB
hyperledger/fabric-peer latest a491b5ab42f6 7 weeks ago 53.3MB
hyperledger/fabric-orderer 2.3 9e1952b8840d 7 weeks ago 35.4MB
hyperledger/fabric-orderer 2.3.3 9e1952b8840d 7 weeks ago 35.4MB
hyperledger/fabric-orderer latest 9e1952b8840d 7 weeks ago 35.4MB
hyperledger/fabric-ccenv 2.3 56fa403e02ee 7 weeks ago 502MB
hyperledger/fabric-ccenv 2.3.3 56fa403e02ee 7 weeks ago 502MB
hyperledger/fabric-ccenv latest 56fa403e02ee 7 weeks ago 502MB
hyperledger/fabric-baseos 2.3 b35a8ef578c0 7 weeks ago 6.87MB
hyperledger/fabric-baseos 2.3.3 b35a8ef578c0 7 weeks ago 6.87MB
hyperledger/fabric-baseos latest b35a8ef578c0 7 weeks ago 6.87MB
root@aa:~/block#
================================打印日志结束==================================
(3)bootstrap.sh脚本一共有三个部分:
第一部分:下载fabric的源文件,源码;
download() {}
第二部分:把fabric测试用例从github 上克隆下来;
cloneSamplesRepo() {}
第三部分:把fabric所需的所有镜像下载下来;
pullDockerImages() {}
(4)执行成功之后会在当前目录下,多出一个fabric-samples文件夹,
root@aa:~/block# tree fabric-samples -L 2
fabric-samples-------------包含了fabric的测试项目,以及fabric的二进制文件
├── asset-transfer-abac
│ ├── chaincode-go
│ └── README.md
├── asset-transfer-basic
│ ├── application-gateway-typescript
│ ├── application-go
│ ├── application-java
│ ├── application-javascript
│ ├── application-typescript
│ ├── application-typescript-hsm
│ ├── chaincode-external
│ ├── chaincode-go
│ ├── chaincode-java
│ ├── chaincode-javascript
│ └── chaincode-typescript
├── asset-transfer-events
│ ├── application-javascript
│ ├── chaincode-java
│ ├── chaincode-javascript
│ └── README.md
├── asset-transfer-ledger-queries
│ ├── application-java
│ ├── application-javascript
│ ├── chaincode-go
│ └── chaincode-javascript
├── asset-transfer-private-data
│ ├── application-javascript
│ ├── chaincode-go
│ └── chaincode-java
├── asset-transfer-sbe
│ ├── application-javascript
│ ├── chaincode-java
│ ├── chaincode-typescript
│ └── README.md
├── asset-transfer-secured-agreement
│ ├── application-javascript
│ └── chaincode-go
├── auction-dutch
│ ├── application-javascript
│ ├── chaincode-go
│ ├── chaincode-go-auditor
│ └── README.md
├── auction-simple
│ ├── application-javascript
│ ├── chaincode-go
│ └── README.md
├── bin--------------------------------------fabric的二进制文件在bin目录下(用来生成证书,通道的文件,初始块文件)
│ ├── configtxgen
│ ├── configtxlator
│ ├── cryptogen
│ ├── discover
│ ├── fabric-ca-client
│ ├── fabric-ca-server
│ ├── idemixgen
│ ├── orderer
│ ├── osnadmin
│ └── peer
├── chaincode
│ ├── abstore
│ ├── fabcar
│ ├── marbles02
│ ├── marbles02_private
│ ├── README.md
│ └── sacc
├── CHANGELOG.md
├── ci
│ ├── azure-pipelines.yml
│ ├── scripts
│ └── templates
├── CODE_OF_CONDUCT.md
├── CODEOWNERS
├── commercial-paper
│ ├── img
│ ├── network-clean.sh
│ ├── network-starter.sh
│ ├── organization
│ └── README.md
├── config
│ ├── configtx.yaml
│ ├── core.yaml
│ └── orderer.yaml
├── CONTRIBUTING.md
├── fabcar
│ ├── go
│ ├── java
│ ├── javascript
│ ├── networkDown.sh
│ ├── startFabric.sh
│ └── typescript
├── high-throughput
│ ├── application-go
│ ├── chaincode-go
│ ├── networkDown.sh
│ ├── README.md
│ └── startFabric.sh
├── interest_rate_swaps
│ ├── chaincode
│ ├── network
│ └── README.md
├── LICENSE
├── MAINTAINERS.md
├── off_chain_data
│ ├── addAssets.js
│ ├── blockEventListener.js
│ ├── blockProcessing.js
│ ├── config.json
│ ├── couchdbutil.js
│ ├── deleteAsset.js
│ ├── enrollAdmin.js
│ ├── network-clean.sh
│ ├── package.json
│ ├── README.md
│ ├── registerUser.js
│ ├── startFabric.sh
│ └── transferAsset.js
├── README.md
├── scripts
│ └── changelog.sh
├── SECURITY.md
├── test-application
│ └── javascript
├── test-network
│ ├── addOrg3
│ ├── configtx
│ ├── docker
│ ├── network.sh
│ ├── organizations
│ ├── README.md
│ ├── scripts
│ ├── setOrgEnv.sh
│ └── system-genesis-block
├── test-network-k8s
│ ├── chaincode
│ ├── config
│ ├── docs
│ ├── kube
│ ├── network
│ ├── README.md
│ └── scripts
├── test-network-nano-bash
│ ├── configtx.yaml
│ ├── crypto-config.yaml
│ ├── generate_artifacts.sh
│ ├── orderer1.sh
│ ├── orderer2.sh
│ ├── orderer3.sh
│ ├── peer1admin.sh
│ ├── peer1.sh
│ ├── peer2admin.sh
│ ├── peer2.sh
│ ├── peer3admin.sh
│ ├── peer3.sh
│ ├── peer4admin.sh
│ ├── peer4.sh
│ ├── README.md
│ └── terminal_setup.png
├── token-erc-1155
│ ├── chaincode-go
│ └── README.md
├── token-erc-20
│ ├── chaincode-go
│ ├── chaincode-javascript
│ └── README.md
├── token-erc-721
│ ├── chaincode-javascript
│ └── README.md
└── token-utxo
├── chaincode-go
└── README.md
3、把整个bin目录下的文件复制到/usr/local/bin当中<这样我们就可以全局使用这些二进制命令了>
$ cd fabric-samples/bin
$ cp * /usr/local/bin
==============================================================
root@aa:~/block/fabric-samples/bin# pwd
/root/block/fabric-samples/bin
root@aa:~/block/fabric-samples/bin# ls
configtxgen cryptogen fabric-ca-client idemixgen osnadmin
configtxlator discover fabric-ca-server orderer peer
root@aa:~/block/fabric-samples/bin#
# 至此fabric 的下载,安装就完成了!!!
==============================================================
4、运行一个测试网络-Bring up the test network
参考文档:https://hyperledger-fabric.readthedocs.io/en/latest/getting_started_run_fabric.html
(1)进入测试网络路径
$ cd fabric-samples/test-network
(2)开启测试网络 < ./network.sh down 停掉网络,删除所有运行容器>
$ ./network.sh up
================================打印日志开始==================================
Creating network "fabric_test" with the default driver
Creating volume "docker_orderer.example.com" with default driver
Creating volume "docker_peer0.org1.example.com" with default driver
Creating volume "docker_peer0.org2.example.com" with default driver
Creating peer0.org1.example.com ... done
Creating peer0.org2.example.com ... done
Creating orderer.example.com ... done
Creating cli ... done
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec81cda0949c hyperledger/fabric-tools:latest "/bin/bash" 1 second ago Up Less than a second cli
cd7a7b1a4fe9 hyperledger/fabric-orderer:latest "orderer" 3 seconds ago Up 1 second 0.0.0.0:7050->7050/tcp, 0.0.0.0:7053->7053/tcp, 0.0.0.0:17050->17050/tcp orderer.example.com
caf0c13fb9e9 hyperledger/fabric-peer:latest "peer node start" 3 seconds ago Up 1 second 0.0.0.0:7051->7051/tcp, 0.0.0.0:17051->17051/tcp peer0.org1.example.com
c1685ba46ca3 hyperledger/fabric-peer:latest "peer node start" 3 seconds ago Up 1 second 0.0.0.0:9051->9051/tcp, 7051/tcp, 0.0.0.0:19051->19051/tcp peer0.org2.example.com
root@aa:~/block/fabric-samples/test-network#
================================打印日志结束==================================
可以看到开启了2个peer 节点的容器和1个orderer节点的容器
(3)创建一个通道-Creating a channel
# ./network.sh createChannel -c channel1 加 -c 指定创建的channel名,默认创建的channel名为mychannel
$ ./network.sh createChannel
================================打印日志开始==================================
2021-11-03 10:34:02.196 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2021-11-03 10:34:02.236 UTC [channelCmd] update -> INFO 002 Successfully submitted channel update
Anchor peer set for org 'Org2MSP' on channel 'mychannel'
Channel 'mychannel' joined
================================打印日志结束==================================
5、创建好通道后,就可以在通道上部署链码了-Starting a chaincode on the channel
# you can start a chaincode on the channel using the following command
$ ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
-ccn 指定链码的名称 basic
-ccp 指定链码的路径 ../asset-transfer-basic/chaincode-go
-ccl 指定链码所使用的语言 go
# 如果直接运行这条命令,是会报错的,这是官方测试用例的一个小BUG,因为在/asset-transfer-basic/chaincode-go这个目录下,链码是没有安装go依赖的
# 解决办法
(1)进入链码目录
$ cd fabric-samples/asset-transfer-basic/chaincode-go
$ ls
assetTransfer.go chaincode go.mod go.sum
(2)安装go 依赖,生成vendor文件夹
# go 语言镜像加速
$ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn,direct
# 生成vendor文件
$ go mod vendor
(3)执行成功之后会在当前目录下,多出一个vendor文件夹,go语言所需要的依赖包
root@aa:~/fabric-samples/asset-transfer-basic/chaincode-go# ls
assetTransfer.go chaincode go.mod go.sum vendor
(4)在通道上部署链码
$ cd fabric-samples/test-network
$ ls
addOrg3 configtx log.txt organizations scripts system-genesis-block
channel-artifacts docker network.sh README.md setOrgEnv.sh
$ ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
================================打印日志开始==================================
Committed chaincode definition for chaincode 'basic' on channel 'mychannel':
Version: 1.0, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true]
Query chaincode definition successful on peer0.org2 on channel 'mychannel'
Chaincode initialization is not required
================================打印日志结束==================================
至此链码部署成功!!!
6、客户端要与我们的Org1(组织1)交互-Interacting with the network
(1)添加两个环境变量,确保它可以找到你的配置文件的路径
# Use the following command to add those binaries to your CLI Path
$ export PATH=${PWD}/../bin:$PATH
# 配置文件的路径
$ export FABRIC_CFG_PATH=$PWD/../config/
# root@aa:~/fabric-samples/test-network# export PATH=${PWD}/../bin:$PATH
# root@aa:~/fabric-samples/test-network# export FABRIC_CFG_PATH=$PWD/../config/
(2)客户端要与我们的Org1(组织1)交互,我们需要将Org1(组织1)的一些环境变量添加进来
You can now set the environment variables that allow you to operate the peer CLI as Org1:
# 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
(3)现在Org1(组织1)就可以与链码做一些交互
@1、Run the following command to initialize the ledger with assets:
$ 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":[]}'
# If successful, you should see similar output to below:
# -> INFO 001 Chaincode invoke successful. result: status:200
@2、调用链码,查询,得到所有的资产信息
# You can now query the ledger from your CLI. Run the following command to get the list of assets that were added to your channel ledger:
$ peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
# If successful, you should see the following output:
[
{"ID": "asset1", "color": "blue", "size": 5, "owner": "Tomoko", "appraisedValue": 300},
{"ID": "asset2", "color": "red", "size": 5, "owner": "Brad", "appraisedValue": 400},
{"ID": "asset3", "color": "green", "size": 10, "owner": "Jin Soo", "appraisedValue": 500},
{"ID": "asset4", "color": "yellow", "size": 10, "owner": "Max", "appraisedValue": 600},
{"ID": "asset5", "color": "black", "size": 15, "owner": "Adriana", "appraisedValue": 700},
{"ID": "asset6", "color": "white", "size": 15, "owner": "Michel", "appraisedValue": 800}
]
@3、添加(组织2)与链码通信---Set the following environment variables to operate as Org2
# 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
@4、You can now query the asset-transfer (basic) chaincode running on peer0.org2.example.com:
$ peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'
# The result will show that "asset6" was transferred to Christopher:
{"ID":"asset6","color":"white","size":15,"owner":"Christopher","appraisedValue":800}
7、测试网络结束-Bring down the network
# When you are finished using the test network, you can bring down the network with the following command:
# 把所有的网络关闭
$ cd fabric-samples/test-network
$ ./network.sh down
超级账本 hyperledger fabric v2.x 安装与搭建一个测试网络
于 2021-11-03 17:14:51 首次发布