前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Fabric示例——first network

Fabric示例——first network

作者头像
zhayujie
发布2020-04-29 10:14:36
1.9K0
发布2020-04-29 10:14:36
举报
文章被收录于专栏:ZYJ的技术专栏ZYJ的技术专栏

运行fabric-samples中的示例:创建第一个网络(Building Your First Network)。 该网络共有4个peer节点,划分为2个组织(organizations),以及1个单独的orderer节点,此外还需要一个cli容器来与网络节点交互。

准备

1.环境部署

包括需要的软件环境以及docker镜像,具体参考https://cloud.tencent.com/developer/article/1622339

2.fabric-samples下载

从github上克隆fabric-samples(v1.1):

代码语言:javascript
复制
mkdir -p ~/go/src/github.com/hyperledger      // 如果没有该目录需要创建
cd ~/go/src/github.com/hyperledger
git clone -b master https://github.com/hyperledger/fabric-samples.git
cd fabric-samples

3.二进制工具下载

下载地址:https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric

选择合适的版本下载,将解压后的bin目录放置于fabric-samples目录下,并加入环境变量:

代码语言:javascript
复制
vim ~/.bash_profile            // Ubuntu中是.profile
添加:export PATH=$HOME/hyperledger/fabric-samples/bin:$PATH

脚本自动运行

1.生成网络配置信息

该命令利用cryptogen和configtxgen工具生成网络成员的证书和秘钥,排序服务创世区块,通道配置交易,并且更新Org1和Org2的锚节点。

代码语言:javascript
复制
cd ~/hyperledger/fabric-samples/first-network
./byfn.sh -m generate

2.启动网络

该步完成的操作有:启动网络所有节点,创建通道后将节点加入,安装、实例化chaincode,然后进行一系列查询和交易。

代码语言:javascript
复制
./byfn.sh -m up

3.关闭网络

该命令会删除所有容器、生成的配置文件以及chaincode镜像。

代码语言:javascript
复制
./byfn.sh -m down

手动分步运行

为了更好理解fabric网络创建的具体过程,可以手动一步步完成上述脚本中包含的所有操作。

一.生成配置文件

1.生成证书

当前路径位于first-network目录下,运行以下命令会根据crypto-config.yaml配置文件生成crypto-config目录(MSP目录,包含成员的证书和私钥):

代码语言:javascript
复制
// 如果已加入环境变量可直接执行cryptogen generate
../bin/cryptogen generate --config=./crypto-config.yaml

2.生成创世区块

会创建channel-artifacts目录,并在该目录下生成genesis.block,创世区块用于启动网络中的排序节点。

代码语言:javascript
复制
export FABRIC_CFG_PATH=$PWD     // 需指明configtx.yaml的路径
../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

3.生成通道配置交易

该步会在channel-artifacts目录下生成channel.tx,该通道配置交易会在创建通道时从本地读取发送给orderer节点。

代码语言:javascript
复制
export CHANNEL_NAME=mychannel    // 设置通道名称
../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME

4.生成锚节点配置交易

锚节点(anchor peer),用于不同组织间的gossip通信(区块同步)。该步会在channel-artifacts目录下生成Org1MSPanchors.txOrg2MSPanchors.tx,这两个配置交易会在设置锚节点时使用。

代码语言:javascript
复制
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP

二.启动网络

1.启动节点容器

运行之前需要修改docker-compose-cli.yaml文件,注释掉cli容器部分的一行配置:

代码语言:javascript
复制
command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME} ${DELAY}; sleep $TIMEOUT'

因为该行命令会使cli容器在运行的时候自动执行script.sh脚本,自动完成所有操作,而这里我们选择手动执行,所以将其注释即可。

启动网络中所有节点:

代码语言:javascript
复制
docker-compose -f docker-compose-cli.yaml up -d

2.创建channel

注意:CLI容器默认连接的是peer0.org1.example.com,操作所需要的环境变量已经设置好了,但如果需要对其他peer或者orderer节点进行操作,则需要重新设置这些环境变量。

首先进入cli容器中,之后的所有命令都是在该容器内部进行的:

代码语言:javascript
复制
docker exec -it cli bash

执行以下命令创建通道,其中--cafile参数制定了orderer节点的TLS根CA证书的路径,用于TLS传输的验证。

代码语言:javascript
复制
export CHANNEL_NAME=mychannel
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

3.加入通道

创建通道命令会在cli容器中生成一个<channel-ID.block>,在这里是mychannel.block,这是通道创世区块,是该channel内每个节点链上的第一个区块,join channel操作会将该区块发送给指定节点。

现将节点peer0.org1.example.com加入channel:

代码语言:javascript
复制
peer channel join -b mychannel.block

当需要加入其它节点的时候,需要修改环境变量(包括该节点的ip:port,证书路径等),这里以加入peer0.org2.example.com为例。

代码语言:javascript
复制
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp CORE_PEER_ADDRESS=peer0.org2.example.com:7051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
peer channel join -b mychannel.block

4.安装链码

chaincode在cli容器内部的路径为(安装时以实际路径为准):

代码语言:javascript
复制
github.com/chaincode/chaincode_example02/go/chaincode_example02.go

执行命令将链码文件安装到指定peer节点的文件系统中(这里只在peer0.example.org1.com安装了):

代码语言:javascript
复制
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

5.实例化链码

实例化链码的操作是channel层面上的,会将channel和该chaincode绑定起来,一份链码的实例化在一个通道上只能执行一次。对于指定的目标节点会生成chaincode镜像并运行该容器,而通道内其它安装了链码的节点则会在指定该节点查询或交易时自动生成镜像和容器。

代码语言:javascript
复制
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"

其中-p参数设置了背书策略,这里是OR ('Org1MSP.member','Org2MSP.member'),表示交易需要Org1或Org2中的任意一个peer进行一次背书,该交易就是有效的。

-c参数表示将调用链码的init接口,将a、b的值分别设置为100和200。

6.查询

查询a的值,这里假设cli的环境变量连接的仍是peer0.org1.example.com:

代码语言:javascript
复制
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

查询结果为:

代码语言:javascript
复制
Query Result:100

7.交易

从a账户转移10个数额到b账户,该步会发送交易到orderer节点,在区块链中添加新的区块,并更新至状态数据库。

代码语言:javascript
复制
peer chaincode invoke -o orderer.example.com:7050  --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem  -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'

完成交易后,可以指定不同节点再次查询a的数值,可以得到结果为90,表明不同peer的账本数据是互相同步的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备
  • 脚本自动运行
  • 手动分步运行
    • 一.生成配置文件
      • 二.启动网络
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档