Hyperledger Fabric v2.0 小型demo搭建与功能测试

联盟链及Hyperledger Fabric简介

联盟链

定义

根据去中心化程度的不同,区块链分化出三种不同应用场景下的种类:

  1. 公有链:全网公开,广大用户均可参与
  2. 私有链:所有网络节点都掌握在一家机构中
  3. 联盟链:用于多个机构之间,允许授权的节点加入网络,可根据权限查询或修改信息

优缺点

相比于公有链,联盟链在效率和灵活性上更有优势

  • 交易成本低,交易只需被几个受信的高算力节点验证即可,无需全网确认
  • 节点规模小,故障可以通过人工干预较快修复
  • 使用确定型的共识算法并缩短区块生成时间使得交易更快完成
  • 读写权限受控制,提供更为安全的隐私保护
  • 联盟链的参与者可以更容易地达成一致来更新链上规则、还原交易、修改余额等
  • 相比于公有链,联盟链去中心化程度不够高

Hyperledger Fabric(超级账本)

简介

  • Hyperledger是一个区块链跨行业应用的开源项目,而其中Fabric是最成功的子项目。
  • 支持以通用编程语言(Go/Java/Node.js)而非受约束的领域特定语言(DSL)编写智能合约。
  • 支持可插拔的共识协议以适应特定的信任模型,节点的授权加入方便网络管理,无需发行加密货币来激励记账。

账本 Ledger

  • Fabric的账本由两个不同但相关的部分组成,分别是世界状态和区块链。
  • 世界状态(World-State)保存了账本数据的当前值,同时可以被更改,其本质是一个数据库,支持LevelDB和CouchDB。
  • 区块链(Blockchain)记录了所有更改日志,日志写入后无法被修改,这便于管理人员进行历史追踪。

身份与成员资格 Identity and Membership

  • Fabric使用X.509格式的证书作为身份验证,通过证书来标识整个网络中的所有参与者,并提供用于确定许可权的一些属性,证书通过证书颁发机构(CA)来颁发。
  • Fabric提供了一个成员资格服务提供商(MSP),用于确定哪些CA是受信任的、列出组织成员身份、识别参与者在组织内扮演的特定角色、定义网络和通道访问权限等。

智能合约与链码 Smart Contracts and Chaincode

  • 智能合约用来定义业务交易逻辑,在世界状态下放置、获取、删除状态或者查询区块链交易记录。
  • 链码是用于安装和实例化智能合约的技术容器,一个链码可以包含多个智能合约。

对等节点 Peer Node

  • 对等节点(简称Peer)组件是Fabric区块链网络的基本元素,它托管着账本和智能合约,且可以同时托管多个账本和多个智能合约。
  • 区块链网络拥有多个组织下的多个对等节点,对等方节点具有通过特定CA颁发的数字证书分配的身份。

通道 Channel

  • 通道允许一组特定的对等节点和应用程序在区块链网络内相互通信,通道并不实际存在,而是由物理对等节点集合形成的逻辑结构。
  • 每个通道都有一个完全独立的账本,这说明每个通道都有一个完全独立的区块链,以及完全独立的世界状态。
  • 一个组织可以加入多个通道,从而参与多个独立的区块链网络。

排序服务 Ordering Service

  • Fabric 采用称为排序服务的特殊节点来执行交易的排序并生成区块,形成一种确定性的共识机制,由排序服务生成的任何块都可以保证是最终且正确的,不会产生分支。
  • 排序服务维护着允许创建通道的组织列表,还对通道实施基本的访问控制,从而限制了谁可以对其进行数据读写和配置。
  • 排序服务有三种实现,使排序节点之间对严格的交易顺序达成共识:
    - Solo: 只有一个排序节点,无法容错,但可以用于开发测试环境,
    - Kafka:崩溃容错(CFT)机制,选举领导者节点,跟随者复制其决策,
    - Raft: 也是崩溃容错(CFT)机制,比Kafka易于配置和管理。

Fabric v2.0 test network功能简介与测试

说明

Hyperledger Fabric平台通过其通道体系结构和私有数据功能来实现机密性。在通道(channel)中,Fabric网络上的参与者建立了一个子网,每个成员都可以查看特定的一组交易。因此,只有那些参与通道的节点(node)才能访问智能合约(chaincode)和交易的数据,从而保留了两者的隐私和机密性。私有数据允许在通道上的成员之间进行收集,从而在不增加创建和维护单独通道的维护开销的情况下,提供与通道相同的保护。

test network

此部分将简要说明一些经过项目组测试的功能。该demo使用Docker Compose部署了一个Fabric网络,由于节点在Docker Compose网络中是隔离的,因此未将test network配置为连接到其他正在运行的Fabric节点。在运行test network之前,需要配置好必要的条件。

启动test network

进入到对应目录下

cd go/src/github.com/tmp/scripts/fabric-samples/test-network

在启动网络前,需要关闭或删除以前的容器

./network.sh down

启动网络(此命令会创建一个由两个peer节点(一个orderer节点)组成的结构网络)

./network.sh up

如果命令成功完成,将看到正在创建的节点日志

Starting nodes with CLI timeout of '5' tries and CLI delay of '3' seconds and using database 'leveldb' with crypto from 'cryptogen'
LOCAL_VERSION=2.2.0
DOCKER_IMAGE_VERSION=2.2.1
Local fabric binaries and docker images are out of  sync. This may cause problems.
/home/fabric/go/src/github.com/tmp/scripts/fabric-samples/test-network/../bin/cryptogen
Generate certificates using cryptogen tool
Create Org1 Identities
+ cryptogen generate --config=./organizations/cryptogen/crypto-config-org1.yaml --output=organizations
org1.example.com
+ res=0
Create Org2 Identities
+ cryptogen generate --config=./organizations/cryptogen/crypto-config-org2.yaml --output=organizations
org2.example.com
+ res=0
Create Orderer Org Identities
+ cryptogen generate --config=./organizations/cryptogen/crypto-config-orderer.yaml --output=organizations
+ res=0
Generate CCP files for Org1 and Org2
/home/fabric/go/src/github.com/tmp/scripts/fabric-samples/test-network/../bin/configtxgen
Generating Orderer Genesis block
+ configtxgen -profile TwoOrgsOrdererGenesis -channelID system-channel -outputBlock ./system-genesis-block/genesis.block
2020-10-19 23:12:05.772 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration
2020-10-19 23:12:05.797 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 002 orderer type: etcdraft
2020-10-19 23:12:05.797 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 Orderer.EtcdRaft.Options unset, setting to tick_interval:"500ms" election_tick:10 heartbeat_tick:1 max_inflight_blocks:5 snapshot_interval_size:16777216 
2020-10-19 23:12:05.797 CST [common.tools.configtxgen.localconfig] Load -> INFO 004 Loaded configuration: /home/fabric/go/src/github.com/tmp/scripts/fabric-samples/test-network/configtx/configtx.yaml
2020-10-19 23:12:05.799 CST [common.tools.configtxgen] doOutputBlock -> INFO 005 Generating genesis block
2020-10-19 23:12:05.799 CST [common.tools.configtxgen] doOutputBlock -> INFO 006 Writing genesis block
+ res=0
Creating network "net_test" with the default driver
Creating volume "net_peer0.org1.example.com" with default driver
Creating volume "net_peer0.org2.example.com" with default driver
Creating volume "net_orderer.example.com" with default driver
Creating peer0.org2.example.com
Creating peer0.org1.example.com
Creating orderer.example.com
CONTAINER ID        IMAGE                               COMMAND             CREATED             STATUS                  PORTS                              NAMES
a3505668e1f3        hyperledger/fabric-orderer:latest   "orderer"           4 seconds ago       Up 1 second             0.0.0.0:7050->7050/tcp             orderer.example.com
c4a9d98d381e        hyperledger/fabric-peer:latest      "peer node start"   4 seconds ago       Up Less than a second   0.0.0.0:7051->7051/tcp             peer0.org1.example.com
8d4bf3aa9af7        hyperledger/fabric-peer:latest      "peer node start"   4 seconds ago       Up 1 second             7051/tcp, 0.0.0.0:9051->9051/tcp   peer0.org2.example.com

测试网络的组成部分

检查network.sh脚本创建的三个节点是否在启动后运行

docker ps -a

与Fabric网络交互的每个节点和用户都必须属于网络成员的组织(organization)。属于Fabric网络成员的组织群通常称为联盟(consortium)。test network有两个联盟成员,Org1和Org2。该demo还包括维护网络订购服务的一个订购者(orderer)组织。

Peer节点是任何Fabric网络的基本组成部分。Peer节点存储区块链帐本(ledger)并在将交易提交到分帐之前对其进行验证。Peer节点运行包含业务逻辑的智能合约,该业务逻辑用于管理区块链账本上的资产。

建立通道

启动网络后,服务器上运行着Peer节点和Orderer节点,我们可以使用该脚本为Org1和Org2之间的事务创建Fabric通道。通道是特定网络成员之间的专用通信层。通道只能由受邀加入该通道的组织使用,并且对网络的其他成员不可见。每个通道都有一个单独的区块链账本。被邀请的组织将其他组织“加入”通道以存储通道帐本并验证通道上的交易。

在Org1和Org2之间创建通道并将他们的Peer节点加入通道(未指定名称时将使用默认名称:mychannel

./network.sh createChannel

在日志中可以看到

========= Channel successfully joined ===========

当然,为了区分不同通道,也可以创建自定义名称的通道(例如:fabricchannel)

./network.sh createChannel -c fabricchannel

熟悉test network之后,可以在启动网络时直接创建通道

./network.sh up createChannel

在channel上部署并启动chaincode

创建通道后,可以开始使用智能合约与通道账本进行交互。智能合约包含管理区块链账本上资产的业务逻辑。网络成员可以调用智能合约以在账本上创建资产,以及更改和转移这些资产,还可以调用智能合约以查询并读取账本上的数据。

在通道上启动智能合约

./network.sh deployCC

测试功能

启动test network之后,可以使用peer CLI与其进行交互,peer CLI允许用户调用已部署的智能合约,更新通道,安装和部署新的智能合约。
test-network目录下,将一些二进制文件添加到CLI路径下:

export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/

设置环境变量来允许用户以Org1的形式来操作peer CLI:

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

通过资产信息来初始化账本

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":[]}'

执行后可以看到

-> INFO 001 Chaincode invoke successful. result: status:200

现在可以从CLI查询账本

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

将看到

[
  {"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}
]

转移或更改账上资产的所有者

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"]}'

将看到

EST [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200

之后我们可以使用另一个查询来查看该调用如何更改了账上资产。对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

查询运行在peer0.org2.example.com的资产转移智能合约

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

可以看到“asset6”已经转移到Christopher下

{"ID":"asset6","color":"white","size":15,"owner":"Christopher","appraisedValue":800}

关闭网络

./network.sh down
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值