Fabric学习一 (基本概念+搭建测试网络+踩的坑)

目录

一、简介

        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)平台,专为在企业环境中使用而设计,与其他流行的分布式账本或区块链平台相比,它有一些主要的区别。

        1.模块化

Hyperledger Fabric 被专门设计为模块化架构。无论是可插拔的共识、可插拔的身份管理协议(如 LDAP 或 OpenID Connect)、密钥管理协议还是加密库,该平台的核心设计旨在满足企业业务需求的多样性。

        2.许可和非许可区块链

在一个非许可区块链中,几乎任何人都可以参与,每个参与者都是匿名的。在这样的情况下,区块链状态达到不可变的区块深度前不存在信任。为了弥补这种信任的缺失,非许可区块链通常采用“挖矿”或交易费来提供经济激励,以抵消参与基于“工作量证明(PoW)”的拜占庭容错共识形式的特殊成本。

另一方面,许可区块链在一组已知的、已识别的且经常经过审查的参与者中操作区块链,这些参与者在产生一定程度信任的治理模型下运作。许可区块链提供了一种方法来保护具有共同目标,但可能彼此不完全信任的一组实体之间的交互。通过依赖参与者的身份,许可区块链可以使用更传统的崩溃容错(CFT)或拜占庭容错(BFT)共识协议,而不需要昂贵的挖掘。

另外,在许可的情况下,降低了参与者故意通过智能合约引入恶意代码的风险。首先,参与者彼此了解对方以及所有的操作,无论是提交交易、修改网络配置还是部署智能合约都根据网络中已经确定的背书策略和相关交易类型被记录在区块链上。与完全匿名相比,可以很容易地识别犯罪方,并根据治理模式的条款进行处理

        3.智能合约(链码)

智能合约在 Fabric 中称之为“链码”,作为受信任的分布式应用程序,从区块链中获得信任,在节点中达成基本共识。它是区块链应用的业务逻辑

        4.新架构

针对交易 Fabric 引入了一种新的架构,我们称为执行-排序-验证。为了解决顺序执行模型面临的弹性、灵活性、可伸缩性、性能和机密性问题,它将交易流分为三个步骤:

  • 执行一个交易并检查其正确性,从而给它背书,
  • 通过(可插拔的)共识协议将交易排序
  • 提交交易到账本前先根据特定应用程序的背书策略验证交易

        5.隐私和保密性

Hyperledger Fabric 是一个许可平台,通过其通道架构和 私有数据特性实现保密。在通道方面,Fabric 网络中的成员组建了一个子网络,在子网络中的成员可以看到其所参与到的交易。因此,参与到通道的节点才有权访问智能合约(链码)和交易数据,以此保证了隐私性和保密性。私有数据通过在通道中的成员间使用集合,实现了和通道相同的隐私能力并且不用创建和维护独立的通道。

        6.可插拔共识

交易的排序被委托给模块化组件以达成共识,该组件在逻辑上与执行交易和维护帐本的节点解耦。具体来说,就是排序服务。由于共识是模块化的,可以根据特定部署或解决方案的信任假设来定制其实现。这种模块化架构允许平台依赖完善的工具包进行 CFT(崩溃容错)或 BFT(拜占庭容错)的排序。

Fabric 目前提供了一种基于etcd 库 中 Raft 协议 的 CFT 排序服务的实现。更多当前可用的排序服务请查阅排序服务概念文档

另外,请注意,这些并不相互排斥。一个 Fabric 网络中可以有多种排序服务以支持不同的应用或应用需求。

        7.性能和可拓展性

一个区块链平台的性能可能会受到许多因素的影响,例如交易大小、区块大小、网络大小以及硬件限制等。Hyperledger Fabric 性能和规模工作组 正在开发一个叫 Hyperledger Caliper的基准测试框架。

已经发表了一些研究和测试 Hyperledger Fabric 性能的文章。最新的一篇是 将 Fabric 扩展到 20000 笔交易每秒(Scaled Fabric to 20,000 transactions per second)

二、重点概念

太多了,见:关键概念 — hyperledger-fabricdocs master 文档

三、搭建测试网络

1.安装虚拟机 Ubuntu 20.04

        省略部分步骤

        进入配置目录,编辑源、更新源


cd /etc/apt

sudo cp sources.list sources_backup.list

sudo gedit sources.list

sudo apt update

2.Fabric所需环境搭建

        a.安装git

sudo apt update
sudo apt install git

        b.安装cURL

sudo apt install curl

        c.安装Docker

//安装docker
sudo apt install docker.io

//检查docker版本
docker --version

        d. 安装Docker-compose

sudo apt install docker-compose

docker-compose --version

        e.安装Golang

                下载出错的可以去更改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

        f.安装make

sudo apt install make

        g.安装g++

sudo apt install g++

        h.安装libltdl-dev 库

sudo apt-get install libltdl-dev

3.以源码方式编译安装fabric2.0

        a.下载fabric2.0组件版本

//创建并打开目录
mkdir -p $GOPATH/src/github.com/hyperledger/
cd $GOPATH/src/github.com/hyperledger/


//从gitee上克隆



git clone https://gitee.com/Hospital-Ledger/Software-Packages.git

        b.下载fabric源码

git clone -b release-2.0 https://gitee.com/mirrors/hyperledger-fabric.git

//把hyperledger-fabric改为fabric
sudo mv hyperledger-fabric fabric

        c.编译fabric

//编译
cd fabric
make release

//检查编译是否成功
ll release/linux-amd64/bin/

  

编译时出错:(make: *** [release/linux-amd64/bin/configtxgen] Error 1)

go版本不对,需要1.14.4

见 四、遇见的错误、原因及解决方法

        d.下载fabric-ca源码

git clone -b release-1.4 https://gitee.com/zhangsen999/fabric-ca.git

        e.编译fabric-ca

cd fabric-ca
make fabric-ca-server
make fabric-ca-client

        f.查看是否编译成功

ll bin/

成功后有 

        g.下载fabric-samples并切换成release-2.2版

//先下载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

        4.测试网络

a.启动测试网络

cd ~/go/src/github.com/hyperledger/fabric-samples/test-network/

./network.sh up

启动成功,创建了一个由两个对等节点和一个排序节点组成的Fabric网络,但是没有任何channel 

b.创建一个channel

./network.sh createChannel

出错 :

scripts/createChannel.sh: line 44: osnadmin: command not found
Channel creation failed 

fabric 和 fabric-sample版本不匹配,更改版本后

c.在通道启动一个链码

./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go

成功启动链码 

 d.与网络交互

        配置环境变量

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/Admin@org1.example.com/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/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051

source /etc/profile

        查询

peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'

 查询成功

e.关停网络

./network.sh down

四、遇见的错误、原因及解决方法

        1.编译fabric时出错

 go版本不对,需要更换成1.14.4

        2.启动测试网络出错

       

大概是因为试图通过socket去连接docker时权限不被允许 

解决方法:添加docker的用户组,把当前用户加入组中

sudo groupadd docker               #添加用户组
sudo gpasswd -a username docker    #将当前用户添加至用户组
newgrp docker                      #更新用户组

3.创建频道时出错

 fabric-sample版本不对

git checkout release-2.2

4.在通道上启动链码出错

        4.1 unknown flag: -ccn

        fabric-samples版本不对,解决方法如上

        4.2 failed to normalize chaincode path

出错:failed to normalize chaincode path: 'go list' failed with: go: github.com/golang/protobuf@v1.3.2: 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/godog@v0.8.0/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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值