目录
一、简介
1.模块化
2.许可和非许可区块链
3.智能合约(链码)
4.新架构
5.隐私和保密性
6.可插拔共识
7.性能和可拓展性
二、重点概念
三、搭建测试网络
1.安装虚拟机 Ubuntu 20.04
2.Fabric所需环境搭建
a.安装git
b.安装cURL
c.安装Docker
d. 安装Docker-compose
e.安装Golang
f.安装make
g.安装g++
h.安装libltdl-dev 库
3.以源码方式编译安装fabric2.0
a.下载fabric2.0组件版本
b.下载fabric源码
c.编译fabric
d.下载fabric-ca源码
e.编译fabric-ca
f.查看是否编译成功
g.下载fabric-samples并切换成release-2.2版
4.测试网络
a.启动测试网络
b.创建一个channel
c.在通道启动一个链码
d.与网络交互
e.关停网络
四、遇见的错误、原因及解决方法
1.编译fabric时出错
2.启动测试网络出错
3.创建频道时出错
4.在通道上启动链码出错
4.1 unknown flag: -ccn
4.2 failed to normalize chaincode path
Hyperledger Fabric 是一个开源的企业级许可分布式账本技术(Distributed Ledger Technology,DLT)平台,专为在企业环境中使用而设计,与其他流行的分布式账本或区块链平台相比,它有一些主要的区别。
Hyperledger Fabric 被专门设计为模块化架构。无论是可插拔的共识、可插拔的身份管理协议(如 LDAP 或 OpenID Connect)、密钥管理协议还是加密库,该平台的核心设计旨在满足企业业务需求的多样性。
在一个非许可区块链中,几乎任何人都可以参与,每个参与者都是匿名的。在这样的情况下,区块链状态达到不可变的区块深度前不存在信任。为了弥补这种信任的缺失,非许可区块链通常采用“挖矿”或交易费来提供经济激励,以抵消参与基于“工作量证明(PoW)”的拜占庭容错共识形式的特殊成本。
另一方面,许可区块链在一组已知的、已识别的且经常经过审查的参与者中操作区块链,这些参与者在产生一定程度信任的治理模型下运作。许可区块链提供了一种方法来保护具有共同目标,但可能彼此不完全信任的一组实体之间的交互。通过依赖参与者的身份,许可区块链可以使用更传统的崩溃容错(CFT)或拜占庭容错(BFT)共识协议,而不需要昂贵的挖掘。
另外,在许可的情况下,降低了参与者故意通过智能合约引入恶意代码的风险。首先,参与者彼此了解对方以及所有的操作,无论是提交交易、修改网络配置还是部署智能合约都根据网络中已经确定的背书策略和相关交易类型被记录在区块链上。与完全匿名相比,可以很容易地识别犯罪方,并根据治理模式的条款进行处理
智能合约在 Fabric 中称之为“链码”,作为受信任的分布式应用程序,从区块链中获得信任,在节点中达成基本共识。它是区块链应用的业务逻辑
针对交易 Fabric 引入了一种新的架构,我们称为执行-排序-验证。为了解决顺序执行模型面临的弹性、灵活性、可伸缩性、性能和机密性问题,它将交易流分为三个步骤:
Hyperledger Fabric 是一个许可平台,通过其通道架构和 私有数据特性实现保密。在通道方面,Fabric 网络中的成员组建了一个子网络,在子网络中的成员可以看到其所参与到的交易。因此,参与到通道的节点才有权访问智能合约(链码)和交易数据,以此保证了隐私性和保密性。私有数据通过在通道中的成员间使用集合,实现了和通道相同的隐私能力并且不用创建和维护独立的通道。
交易的排序被委托给模块化组件以达成共识,该组件在逻辑上与执行交易和维护帐本的节点解耦。具体来说,就是排序服务。由于共识是模块化的,可以根据特定部署或解决方案的信任假设来定制其实现。这种模块化架构允许平台依赖完善的工具包进行 CFT(崩溃容错)或 BFT(拜占庭容错)的排序。
Fabric 目前提供了一种基于etcd 库 中 Raft 协议 的 CFT 排序服务的实现。更多当前可用的排序服务请查阅排序服务概念文档。
另外,请注意,这些并不相互排斥。一个 Fabric 网络中可以有多种排序服务以支持不同的应用或应用需求。
一个区块链平台的性能可能会受到许多因素的影响,例如交易大小、区块大小、网络大小以及硬件限制等。Hyperledger Fabric 性能和规模工作组 正在开发一个叫 Hyperledger Caliper的基准测试框架。
已经发表了一些研究和测试 Hyperledger Fabric 性能的文章。最新的一篇是 将 Fabric 扩展到 20000 笔交易每秒(Scaled Fabric to 20,000 transactions per second)。
太多了,见:关键概念 — hyperledger-fabricdocs master 文档
省略部分步骤
进入配置目录,编辑源、更新源
cd /etc/apt
sudo cp sources.list sources_backup.list
sudo gedit sources.list
sudo apt update
sudo apt update
sudo apt install git
sudo apt install curl
//安装docker
sudo apt install docker.io
//检查docker版本
docker --version
sudo apt install docker-compose
docker-compose --version
下载出错的可以去更改go版本
//1.20.1版,后续编译fabric源码时会出现错误,需要使用1.14版
//下载包
wget https://go.dev/dl/go1.20.1.linux-amd64.tar.gz
//解压包
sudo tar -zxvf go1.20.1.linux-amd64.tar.gz -C /usr/local/
//1.14.4版
wget https://studygolang.com/dl/golang/go1.14.4.linux-amd64.tar.gz
sudo tar -zxvf go1.14.4.linux-amd64.tar.gz -C /usr/local/
配置环境变量:
没有安装vim的,先安装vim
sudo apt install vim
修改配置文件
sudo vim /etc/profile
向末尾追加
export GOPATH=$HOME/go
export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH
source一下
source /etc/profile
检验
go --version
sudo apt install make
sudo apt install g++
libltdl-dev
库sudo apt-get install libltdl-dev
//创建并打开目录
mkdir -p $GOPATH/src/github.com/hyperledger/
cd $GOPATH/src/github.com/hyperledger/
//从gitee上克隆
git clone https://gitee.com/Hospital-Ledger/Software-Packages.git
git clone -b release-2.0 https://gitee.com/mirrors/hyperledger-fabric.git
//把hyperledger-fabric改为fabric
sudo mv hyperledger-fabric fabric
//编译
cd fabric
make release
//检查编译是否成功
ll release/linux-amd64/bin/
编译时出错:(make: *** [release/linux-amd64/bin/configtxgen] Error 1)
go版本不对,需要1.14.4
见 四、遇见的错误、原因及解决方法
git clone -b release-1.4 https://gitee.com/zhangsen999/fabric-ca.git
cd fabric-ca
make fabric-ca-server
make fabric-ca-client
ll bin/
成功后有
//先下载fabric-slample
git clone https://github.com/hyperledger/fabric-samples.git
//切换到release2-2版本,不然巨多坑
cd fabric-samples
git checkout release-2.2
下载二进制文件并解压
wget https://github.com/hyperledger/fabric/releases/download/v2.0.1/hyperledger-fabric-linux-amd64-2.0.1.tar.gz
tar -xzvf hyperledger-fabric-linux-amd64-2.0.1.tar.gz
cd ~/go/src/github.com/hyperledger/fabric-samples/test-network/
./network.sh up
启动成功,创建了一个由两个对等节点和一个排序节点组成的Fabric网络,但是没有任何channel
./network.sh createChannel
出错 :
scripts/createChannel.sh: line 44: osnadmin: command not found
Channel creation failed
fabric 和 fabric-sample版本不匹配,更改版本后
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
成功启动链码
配置环境变量
sudo vim /etc/profile
//将以下内容追加到文件末尾
export PATH=${PWD}/../bin:$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/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051
//使环境变量生效
source /etc/profile
初始化资产
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":[]}'
成功:PDT [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200
查询账本
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
更改资产
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"]}'
成功:PDT [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200
把这个查询链码的机会通过 Org2 的 peer 来运行:
配置Org2的环境变量
sudo vim /etc/profile
# 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/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:9051
source /etc/profile
查询
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'
./network.sh down
go版本不对,需要更换成1.14.4
大概是因为试图通过socket去连接docker时权限不被允许
解决方法:添加docker的用户组,把当前用户加入组中
sudo groupadd docker #添加用户组
sudo gpasswd -a username docker #将当前用户添加至用户组
newgrp docker #更新用户组
fabric-sample版本不对
git checkout release-2.2
fabric-samples版本不对,解决方法如上
出错:failed to normalize chaincode path: 'go list' failed with: go: github.com/golang/[email protected]: Get "https://proxy.golang.org/github.com/golang/protobuf/@v/v1.3.2.mod": dial tcp 172.217.160.81:443: connect: connection refused: exit status 1
Chaincode packaging has failed
Deploying chaincode failed
需要更换go代理,更换完后
Error: failed to normalize chaincode path: 'go list' failed with: verifying github.com/cucumber/[email protected]/go.mod: checksum mismatch
downloaded: h1:FQ2MobPXycdSajAK3inNgLSAKGFmZqbE4S/CExz41Ys=
go.sum: h1:Cp3tEV1LRAyH/RuCThcxHS/+9ORZ+FMzPva2AZ5Ki+A=
尝试更换go版本 1.20.1
更换完之后再进行尝试换go代理
参考文档:A Blockchain Platform for the Enterprise — hyperledger-fabricdocs main documentation