万字解析——区块链hyperledger fabric2.2部署实战教程

一、前言

本教程在ubuntu20版本下运行,请在执行操作前先部署ubuntu20环境,所有部署都按照官方文档hyperledger fabric进行,在运行过程中遇到的问题,我也会逐个说明,如果你对于区块链还不太了解,请先查阅区块链概念,文中若有理解不对的地方,欢迎批评指正。

二、hyperledger fabric介绍

Hyperledger Fabric 是 Hyperledger (超级账本)中的区块链项目之一,也是经典的联盟链之一。它有一个账本,使用智能合约,由参与者管理交易的系统,但它又不完全去中心化,即想要加入联盟的成员们需要从可信赖的成员服务提供者(MSP)注册,以下是一些相关概念的介绍。

名词 解释
资产 记录的数据,通常为json格式表示键值对的集合
链码 业务逻辑,即智能合约,定义修改交易指令
资产 记录的数据,通常为json格式表示键值对的集合
账本特性 基于键、范围和组合查询等特性
隐私 创建的通道之间是相互分隔的,虽然允许组织间共享网络基础设施,但也可以被私有化
安全和成员服务 所有成员公开,可以在更广泛的网络和通道上操作管理数据
共识 从提案和背书到排序、验证和提交,都有共识验证在里面,以保证交易达成共识,防止双花
区块链网络 为应用程序账本及智能合约(链码)服务的技术基础设施

下图为Fabric的结构:

在这里插入图片描述


下图为Hyperledger Fabric 的结构,详解见区块链网络

在这里插入图片描述

三、测试网络示例

3.1 搭建开发环境

1.安装git

sudo apt-get install git

2.安装curl

sudo apt-get install curl

3.安装docker

# 安装并检查版本
sudo apt-get -y install docker-compose
docker --version
docker-compose --version
# 提示,以后只要碰到docker有关的错误,先执行2.3.1步骤
#1.重启docker
sudo systemctl start docker
#设置系统启动时docker启动,可选
sudo systemctl enable docker
#2.将用户添加到docker组,确保在用户命令下可以执行
sudo gpasswd -a $USER docker
#3.更新用户组
newgrp docker   
# docker信息
docker info
# 测试docker,若报错详见文末附加问题1
docker run hello-world 

4.安装go

安装并解压:

mkdir ~/download
cd ~/download
# 下载
wget https://studygolang.com/dl/golang/go1.13.linux-amd64.tar.gz
# 解压
sudo tar -C /usr/local -xzf go1.13.linux-amd64.tar.gz

创建go目录并配置环境:

mkdir $HOME/go
#用vi打开~./bashrc,配置环境变量
vi ~/.bashrc
# 在最下方插入
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
#使配置的环境变量生效
source ~/.bashrc
#检查是否配置正确
go version
# 配置goproxy环境变量加速国内下载
go env -w  GOPROXY=https://goproxy.io

3.2 安装示例、二进制和 Docker 镜像

1.克隆 hyperledger/fabric-samples 仓库

mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
# 获取fabric-samples源码
git clone https://github.com/hyperledger/fabric-samples.git

2.选择适当的版本标签,进入目录,切换分支

cd fabric-samples
# 可自行选择版本
git checkout release-2.2
#查看版本
git branch

在这里插入图片描述


3.将指定版本的 Hyperledger Fabric 平台特定二进制文件和配置文件安装到 fabric-samples 下的 /bin/config 目录中,下载指定版本的 Hyperledger Fabric docker 镜像
先配置镜像源:

sudo vi /etc/docker/daemon.json
#把以下代码加进去
{
"registry-mirrors":["https://registry.docker-cn.com"]
}
#如果你想要最新的生产发布版本,忽略所有的版本标识符。
# curl -sSL https://bit.ly/2ysbOFE | bash -s
# curl -sSL https://bit.ly/2ysbOFE | bash -s -- <fabric_version> <fabric-ca_version> <thirdparty_version>
# 若报错详见文末附加问题2
curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.2.0 1.4.7 0.4.18
# 若不行试试下面这个
curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s  2.2.0 1.4.7 0.4.18

多试几次会成功的!

在这里插入图片描述


我们可以看到全部下载完毕了

在这里插入图片描述

cd chaincode-go
sudo vi go.mod
# 进入文件发现是1.14 自己把改成1.13 ,要与你下载的go版本匹配

在这里插入图片描述

环境变量设置

vi ~/.bashrc
# 添加下面的变量
export PATH=$PATH:$GOPATH/src/github.com/hyperledger/fabric-samples/bin
# 使之生效
source ~/.bashrc
# 检验成功否
fabric-ca-client version

在这里插入图片描述

3.3 使用Fabric测试网络

温馨提示:在你看到这里的时候,说明你的环境已经部署完毕,接下来要使用测试网络,需要注意的是一定要在一个完整的时间段操作,不要断断续续地执行下述操作,否则可能会出现大堆新手难解决的问题!

比较重要的一点,遇到问题时
开启debug模式!
开启debug模式!
开启debug模式!

export FABRIC_LOGGING_SPEC=debug

1.启动测试网络
进入fabric-samples下的test-network
先来分析一下network.sh脚本

# 脚本有500多行,在这讲解脚本里的一些方法
function clearContainers()# 清除容器
function removeUnwantedImages() # 清除不想要的镜像
# 大家仔细看看都能读懂,下面挑几个关键且常用的讲
#创建组织
function createOrgs() {
# 这里包含一些业务逻辑比如
# Create crypto material using cryptogen or Fabric CA
if [ "$CRYPTO" == "cryptogen" ];then...
if [ "$CRYPTO" == "Certificate Authorities" ]; then..
}
# 创建联盟
function createConsortium()
# 开启网络
function networkUp()
# 创建channel
function createChannel()
# 开启链码
function deployCC()
# 最后给出了一些确定操作模式并打印出我们所要求的内容
if [ "$MODE" == "up" ]; then
  infoln "Starting nodes with CLI timeout of '${MAX_RETRY}' tries and CLI delay of '${CLI_DELAY}' seconds and using database '${DATABASE}' ${CRYPTO_MODE}"
elif [ "$MODE" == "createChannel" ]; then
  infoln "Creating channel '${CHANNEL_NAME}'."
  infoln "If network is not up,starting nodes with CLI timeout of '${MAX_RETRY}' tries and CLI delay of '${CLI_DELAY}' seconds and using database '${DATABASE} ${CRYPTO_MODE}"
elif [ "$MODE" == "down" ]; then
  infoln "Stopping network"
elif [ "$MODE" == "restart" ]; then
  infoln "Restarting network"
elif [ "$MODE" == "deployCC" ]; then
  infoln "deploying chaincode on channel '${CHANNEL_NAME}'"
else
  printHelp
  exit 1
fi

if [ "${MODE}" == "up" ]; then
  networkUp
elif [ "${MODE}" == "createChannel" ]; then
  createChannel
elif [ "${MODE}" == "deployCC" ]; then
  deployCC
elif [ "${MODE}" == "down" ]; then
  networkDown
else
  printHelp
  exit 1
fi 

执行以下命令以执行脚本network.sh

./network.sh up

执行完毕后看到,我们创建了排序组织orderer、联盟成员org1的peer0节点和联盟成员org2的peer0节点以及相应的镜像image。

在这里插入图片描述


2.测试网络的组成部分
执行docker ps -a
可以看到创建的三个节点和之前测试的hello-world

在这里插入图片描述


Fabric网络成员的所有组织称为联盟,此测试网络有两个联盟成员org1、2,一个维护网络排序服务的组织orderer,每个组织各运营一个对等节点,peer0.org1.example.com和peer0.org2.example.com。
peer节点是fabric网络的基本组件,最常见的peer节点就是背书节点,对等节点存储区块链账本进行交易之前的验证。
该示例网络使用单节点Raft排序服务,以前的版本有solo模式和kafka模式,此测试仅使用单节点排序服务,但一个真实的网络将有多个排序节点,由一个或多个排序者组织。

3.创建一个channel

使用./network.sh createChannel 在org1和org2之间创建通道并加入他们的对等节点,如下有几种方法:

# 1.不输入自定义名称通道,默认为mychannel
./network.sh createChannel
# 2.输入自定义名称,可以创建多个不同名称通道
./network.sh createChannel -c channel1
./network.sh createChannel -c channel2
# 3.也可以建立网络创建通道一起
./network.sh up createChannel

在这里插入图片描述

4.在通道启动一个链码
在fabric 中,链码就是指的智能合约。
在创建通道后,开始部署链码与通道账本交互,链码包含区块链账本上资产的业务逻辑,用的go语言编写,后面会详细介绍。由成员运行的应用程序网络可以在账本上调用只能合约创建,更改和转让资产。
为确保交易有效,使用智能合约创建的交易需要多个组织签名才能提交到账本,也就是背书,而智能合约也定义了背书策略,比如需要成员2/3同意便通过,一半成员同意通过等等。
创建完通道,现在开始启动链码:

./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
# 出错详见附加问题3

如下图就是链码启动成功了

在这里插入图片描述


5.与网络交互
fabric-samplesbin文件下的二进制文件添加到CLI路径:

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

还需要将fabric-samples代码库中的FABRIC_CFG_PATH设置为指向其中的core.yaml文件:

export FABRIC_CFG_PATH=$PWD/../config/

设置环境变量,允许用户作为org1操作peer的CLI:

# Environment variables for Org1

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
#CORE_PEER_TLS_ROOTCERT_FILE和CORE_PEER_MSPCONFIGPATH环境变量指向Org1的organizations文件夹中的的加密材料。
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

接下来可以调用链码(Go)的 InitLedger 方法来赋予一些账本上的初始资产,运行如下命令,用一些资产来初始化账本:

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

如图,初始化成功!

在这里插入图片描述


接下来可以用CLI工具查询账本:

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

执行完后,我们再查询一下,发现ID为asset6的拥有者已经变成了Christopher,如图:

在这里插入图片描述


接下来我们可以通过org2的peer来查询,在这之前我们先设置一下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

再查询一下

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

结果和org1一样asset6转给了名叫Christopher的人

在这里插入图片描述


至此测试完毕,我们关闭网络./network.sh down

3.4 使用认证机构建立网络

Hyperledger Fabric使用公钥基础设施(PKI)来验证所有网络参与者的行为。 每个节点,网络管理员和用户提交的交易需要具有公共证书和私钥以验证其身份。 这些身份必须具有有效的信任根源,该证书是由作为网络中的成员组织颁发的。
在测试网络中,network.sh在创建节点之前就使用cryptogen工具创建了这些加密材料,现在让我们试试:

./network.sh up -ca

在这里插入图片描述


可以看到脚本启动了三个CA,分别是orderer、org1和org2。感兴趣的朋友在启动后查看一下脚本都做了些什么,在这里不做赘述。
下面我们还可以查看一下org1的MSP文件夹,其中包含了每个身份的证书和私钥:

tree organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/
# 如果没有tree请按照提示安装

在这里插入图片描述

#关闭网络
./network.sh down

四、汽车生产应用

4.1 搭建开发环境

安装python2.7,make,gcc,npm,开启远程服务以查看文档

sudo apt-get install python2.7
sudo apt-get install make
sudo apt-get install gcc
sudo apt install npm
# 安装
sudo apt-get install openssh-server
# 查看,存在sshd说明已启动
sudo ps -e |grep ssh
# 启动
sudo service ssh start

进入fabric-samples仓库下的fabcar,通过javasript版本的脚本来启动智能合约:

cd fabric-samples/fabcar
./startFabric.sh javascript
# 启动若报错,查看附加问题4

启动成功如图

在这里插入图片描述

4.2 注册登记等操作使用

本教程用 javascript 为nodejs编写的示例,先进入javascript文件夹:

cd javascript

该目录包含使用Node.js对应的Fabric SDK 开发的示例程序。运行以下命令安装应用程序依赖项:

npm install

完成后通过命令ls看一眼示例javaScript的应用文件:

在这里插入图片描述


在我们创建网络时,证书授权服务器(CA)将创建一个管理员用户(admin),第一步使用enroll.js生成私钥、公钥和x.509证书:

node enrollAdmin.js

创建完之后,CA管理员的证书保存在wallet目录,可以再admin.id找到证书和私钥。接下来再创建一个新的应用程序用户,它将被用于与区块链交互。 运行以下命令注册和记录一个名为 appUser 的新用户:

node registerUser.js

在这里插入图片描述


接下来我们来查询账本,最常用的查询是查询账本当前值(世界状态),我们先使用query.js来看看:

node query.js

在这里插入图片描述


如图为输出结果,我们可以看到查询数据为键值对,也就是json格式,当然我们也可以通过配置使用数据库(如CouchDB)来使用富查询。
感兴趣的朋友可以把query.js分析一下,里头都是一些定义很容易看懂。

4.3 智能合约

导航到 fabric-samples 仓库里 JavaScript版本的FabCar智能合约:

cd fabric-samples/chaincode/fabcar/javascript/lib

打开fabcar.js,里面描述了智能合约如何使用 Contract 类定义的

在这里插入图片描述


现在我们更改一下query.js的查询范围代码:

const result = await contract.evaluateTransaction('queryAllCars');
#改为
const result = await contract.evaluateTransaction('queryCar', 'CAR4');

这样保存后返回到fabcar/javascrip再执行:

node query.js

我们可以看到查询结构只变成了查询这一个车的数据

Wallet path: ...fabric-samples/fabcar/javascript/wallet
Transaction has been evaluated, result is:
{"color":"black","docType":"car","make":"Tesla","model":"S","owner":"Adriana"}

4.4 更新账本

刚才我们已经完成了一些账本的查询并添加修改查询,现在我们来更新账本(也就是数据库中的“增”)
我们打开invoke.js

在这里插入图片描述


好了,现在我们知道原理后开始执行

node invoke.js

执行完毕后把query.js修改为之前的查询世界状态的代码,再查看

node query.js

如图,我们可以看到CAR12已经被添加进了

在这里插入图片描述


交易功能,把车主把车卖了:

# 这就是invoke.js中的submitTransaction功能,
# 把方法由createCar修改为changeCarOwner
await contract.submitTransaction('changeCarOwner', 'CAR12', 'Dave');

再查询一下node query.js,就可以看到车主已经变成"Dave"了。
至此,结束,返回到fabcar目录,清除数据,关闭测试网络:

./networkDown.sh

五、商业票据应用

本应用包含MagnetoCorp和DigiBank两个组织,它们使用区块链网络PaperNet相互交易商业票据,如图:

在这里插入图片描述


流程是这样的:
我是MagnetoCorp 的员工 Isabella,她将代表公司发行商业票据,然后转换角色,担任 DigiBank 的员工 Balaji,他将购买此商业票据,持有一段时间,再向 MagnetoCorp 赎回该商业票据,以获取小额利润。

5.1 运行网络

进入到fabric-samples中的commercial-paper目录,然后启动网络:

cd fabric-samples/commercial-paper
./network-starter.sh

注意这里的测试网络名称为fabric_test,官方教程写的net_test,注意下

在这里插入图片描述


通过docker ps命令查看Fabric节点在本地机器上的运行情况:

在这里插入图片描述


还可以通过docker network inspect fabric_test命令查看:

在这里插入图片描述

peer0.org1.example.com将属于DigiBank组织
peer0.org2.example.com将属于MagnetoCorp组织
启动的网络称为PaperNet
启动后将有八个容器产生,对应八个不同的IP地址,可以通过docker network inspect net_test命令查看:
1.Org1的peer——peer0.org1.example.com
2.Org2的peer——peer0.org2.example.com
3.Org1的peer对应的CouchDB数据库——couchdb0
4.Org2的peer对应的CouchDB数据库——couchdb1
5.排序服务节点——orderer.example.com
6.Org1的CA——ca_org1
7.Org2的CA——ca_org2
8.排序服务Org的CA——ca_orderer

5.2 以MagnetoCorp身份

管理员身份

先切换到MagnetoCorp目录:

cd commercial-paper/organization/magnetocorp

在MagnetoCorp目录下,运行下列命令以运行monitordocker.sh脚本, 并为运行在fabric_test上的与PaperNet相关联的容器 启动logspout工具:

# 如果是非最高权限用户,请在下列命令前加上sudo
./configuration/cli/monitordocker.sh fabric_test
#如果 monitordocker.sh 中的默认端口已经在使用,可以传入一个端口号
#./monitordocker.sh net_test <port_number>
./monitordocker.sh net_test 8079

在这里插入图片描述

开发人员身份

检查商业票据智能合约:
issue(发行),buy(购买),redeem(赎回)是PaperNet智能合约的三个核心功能。
打开一个新的终端代表MagnetoCorp开发人员:

cd commercial-paper/organization/magnetocorp

在contract/lib下的papercontract.js查看智能合约,其中包含了商业票据智能合约,定义了发行、购买、赎回和查询等交易方法。

在这里插入图片描述


将智能合约部署到通道:
在应用程序调用papercontract之前,必须将合约安装到测试网络中合适的peer节点上,接着在通道上使用Fabric链码生命周期定义它,因此需要以MagnetoCorp和DigiBank的管理员的身份来安装和审批同意链码。

在这里插入图片描述


一个链码中可以定义一个或多个智能合约,安装链码就使得PaperNet中不同组织可以使用其中的智能合约,同时也意味着只有管理员需要关注链码,其他人只需要关注智能合约。
以 MagnetoCorp 的身份安装和批准智能合约:
再打开一个命令端到cd commercial-paper/organization/magnetocorp下,管理员可以通过使用peer容器与PaperNet交互,还需要在命令窗口中设置一些环境变量,以使用正确的peer二进制文件,向MagneoCorp的peer节点的地址发送命令和使用正确的加密资料对请求进行签名:

# 打印完整环境变量并使用生效
source magnetocorp.sh

现在开始以管理员身份与网络交互:

1.安装papercontract智能合约
使用peer lifecycle chaincode package将智能合约打包成链码

# 创建链码包
peer lifecycle chaincode package cp.tar.gz --lang node --path ./contract --label cp_0

使用peer lifecycle chaincode install命令在MagnetoCorp的peer节点上安装链码

peer lifecycle chaincode install cp.tar.gz
# 若报错,见附加问题6

在这里插入图片描述


2.同意(验证)链码定义
先查询一下在peer上的链码的packageID:

peer lifecycle chaincode queryinstalled

在这里插入图片描述


接下来,需要把packageID保存为一个环境变量

export PACKAGE_ID=cp_0:ddca913c004eb34f36dfb0b4c0bcc6d4afc1fa823520bb5966a3bfcf1808f40a

再使用如下命令同意链码定义:

peer lifecycle chaincode approveformyorg --orderer localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name papercontract -v 0 --package-id $PACKAGE_ID --sequence 1 --tls --cafile $ORDERER_CA

为了使用链码定义,通道成员需要同意最重要的链码参数之一是背书策略,背书策略描述了在确定交易有效之前必须背书的组织集合。通过不指定–policy标志而同意papercontract链码,我们在这里同意了使用通道的默认Endorsement策略——要求通道上大多数组织来背书交易,所有的交易无论有效与否都会被记录在区块链账本上,但只有有效的交易才会更新世界状态。

5.3 以 DigiBank 的身份

1.以 DigiBank 的身份安装和批准智能合约
基于mychanner的LifecycleEndorsement策略,Fabric链码生命周期将要求通道上大多数组织将链码提交到通道之前同意链码的定义,即两者都同意(MagnetoCorp和DigiBank)。切换到digibank环境部署:

cd commercial-paper/organization/digibank/
source digibank.sh

现在以DigiBank的身份安装和同意papercontract,操作方法同MagnetoCorp相同:

# 打包链码
peer lifecycle chaincode package cp.tar.gz --lang node --path ./contract --label cp_0
# 安装链码
peer lifecycle chaincode install cp.tar.gz
# 查询安装链码的packageID
peer lifecycle chaincode queryinstalled
# 将id保存为环境变量
# export PACKAGE_ID=cp_0: <packageID>
export PACKAGE_ID=cp_0:ddca913c004eb34f36dfb0b4c0bcc6d4afc1fa823520bb5966a3bfcf1808f40a
# Digibank管理员同意papercontract的链码定义:
peer lifecycle chaincode approveformyorg --orderer localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name papercontract -v 0 --package-id $PACKAGE_ID --sequence 1 --tls --cafile $ORDERER_CA

在这里插入图片描述


至此,两个组织都同意了papernet链码,这也意味着通道上的客户端应用程序就可以调用papercontract链码中的ConmmercialPaper智能合约。在这里我们继续使用DigiBank管理员的身份操作,使用peer lifecycle chaincode commit命令 将papercontract的链码定义提交到mychannel:

peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --peerAddresses localhost:7051 --tlsRootCertFiles ${PEER0_ORG1_CA} --peerAddresses localhost:9051 --tlsRootCertFiles ${PEER0_ORG2_CA} --channelID mychannel --name papercontract -v 0 --sequence 1 --tls --cafile $ORDERER_CA --waitForEvent

在这里插入图片描述


可以看到两个peer节点上启动了papercontract容器,至此已经将papercontract代码部署到通道,接下来使用MagnetoCorp应用程序来发行商业票据。

5.4 应用结构

包含在 papercontract 中的智能合约由 MagnetoCorp 的应用程序 issue.js 调用,我们来看看cd commercial-paper/organization/magnetocorp/application,在这个目录下有个issue.js

在这里插入图片描述


从上图中看到代码前面定义了一些引入,现在我们把这些引入的包先安装下来:

# 切换目录
cd commercial-paper/organization/magnetocorp/application/
# 安装依,这个命令会把当前包下所有js文件中引入的依赖下载
npm install
# 查看目录
ls

在这里插入图片描述


我们查看node_modules会发现已经安装了很多包,这是因为js-yamlfabric-network 本身都被搭建在其他 npm 包中!package-lock.json 文件能准确识别已安装的版本。

5.5 钱包

因为 issue.js 代表 Isabella,所以也就代表 MagnetoCorp, issue.js 将会使用 Isabella 钱包中反应以上事实的身份。现在我们需要执行这个一次性的活动,向 Isabella 的钱包中添 X.509 证书。
运行node enrollUser.js把身份信息添加到她的钱包中:

在这里插入图片描述


我们再通过ls ../identity/user/isabella/wallet/查看钱包里有什么:

在这里插入图片描述


Isabella可以在她的钱包中存储多个身份, 但在我们的示例中,她只使用一个。 wallet文件夹里有一个isabella.id文件, 该文件提供Isabella连接到网络所需的信息。

在这里插入图片描述

5.6 发行应用

Isabella 现在可以用 issue.js 来提交一项交易,该交易将发行 MagnetoCorp 商业票据 00001:

node issue.js

在这里插入图片描述


Process issue transaction response.
{“class”:“org.papernet.commercialpaper”,
“currentState”:1,
“issuer”:“MagnetoCorp”,
“paperNumber”:“00001”,
“issueDateTime”:“2020-05-31”,
“maturityDateTime”:“2020-11-30”,
“faceValue”:5000000,
“mspid”:“Org2MSP”,
“owner”:“MagnetoCorp”}

5.7 DigiBank应用

现在我们使用DigiBank的身份来使用buy和redeem操作:

cd commercial-paper/organization/digibank/application/

详细看看这个目录下的两个文件

在这里插入图片描述


操作过程和MagnetoCorp一样:

# 安装依赖
npm install
# 注册用户
node enrollUser.js

在这里插入图片描述

与Isabella一样,这里添加了一个balaji的身份信息到DigiBank的钱包中,用于买和赎交易,接下来我们来试试买和赎吧!

# 购买
node buy.js
# 赎回
node redeem.js

在这里插入图片描述

最后别忘了把这些数据都清理掉:

cd fabric-samples/commercial-paper
sudo ./network-clean.sh

如果你需要第二次执行,需要手动删除一些文件夹,比如digibank和magnetocorp下的identity文件夹,npm install的包node_moudle,
只有删除了,第二次执行这些代码才能成功,又或者不再执行安装依赖的代码也可以。

附加问题

  1. Got permission denied while trying to connect to the Docker daemon socket at…
    解决办法:
    执行指令的账户没有权限,我在执行指令所使用的账户是普通账户,没有root权限,要么切换成root用户,要么把现在的用户加进来,一定要记得更新用户组!

    	#将用户添加到docker组,确保在用户命令下可以执行
    	sudo gpasswd -a $USER docker
    	#更新用户组
    	newgrp docker
    
  2. curl: (7) Failed to connect to raw.githubusercontent.com port 443: 拒绝连接
    解决办法:
    打开网站: https://www.ipaddress.com/
    查询一下 raw.githubusercontent.com对应的IP 地址

    在这里插入图片描述


    在这里插入图片描述


    到命令行输入sudo vi /etc/hosts

    #添加一行:
    #【查询到的任一 ip 】raw.githubusercontent.com,我这里是:
    185.199.108.133 raw.githubusercontent.com
    

    可能会失败,多试几次,我大概下载命令重复执行了6-8次才成功!

  3. Chaincode installation on peer0.org1 has failed

    在这里插入图片描述


    超过执行的最后日期了 context deadline exceeded,可能其他操作也会造成这个,注意进行这些操作的时候一定要一气呵成,不要挂起虚拟机或者中断操作,否则会有一大堆问题,另一个,记住要备份,快照,这样就可以退回到上一个节点,避免重新删除改来改去。

  4. Error: chaincode install failed with status: 500 - failed to invoke backing implementation of ‘InstallChaincode’: could not build chaincode: docker build failed: docker image build failed: docker build failed: Error returned from build: 1 "+ INPUT_DIR=/chaincode/input
    错误:链码安装失败,状态:500 - 无法调用“InstallChaincode”的支持实现:无法构建链码:docker构建失败:docker映像构建失败:docker构建失败:从构建返回错误:1 “+ INPUT_DIR=/chaincode/input
    这个问题就是docker构建出问题了,因为我之前挂起了虚拟机,docker容器没有重新启动,重新启动试试看:

    systemctl restart docker
    
  5. Could not resolve host: github.com
    拉取镜像发现这个问题,可能是网络没了,看看你右上角的网络图标还在吗?如果不在了,请执行以下命令:

    sudo service network-manager stop
    sudo rm /var/lib/NetworkManager/NetworkManager.state
    sudo gedit /etc/NetworkManager/NetworkManager.conf
    

    在这里插入图片描述

    #把false改成true,再重启网络
    sudo service network-manager restart
    
  6. peer lifecycle chaincode install cp.tar.gzError: chaincode install failed with status: 500 - failed to invoke backing implementation of ‘InstallChaincode’: could not build chaincode: docker build failed: docker image build failed: docker build failed: Error returned from build: 1 "+ INPUT_DIR=/chaincode/input+ OUTPUT_DIR=/chaincode/output+ cp -R /chaincode/input/src/. /chaincode/output+ cd /chaincode/output+ ‘[’ -f package-lock.json -o -f npm-shrinkwrap.json ]+ npm install --production
    npm ERR! code EAI_AGAIN
    npm ERR! errno EAI_AGAIN
    npm ERR! request to https://registry.npmjs.org/fabric-shim failed,reason: getaddrinfo EAI_AGAIN registry.npmjs.org
    npm ERR! A complete log of this run can be found in:
    npm ERR! /root/.npm/_logs/2022-05-24T06_09_07_419Z-debug.log

    在这里插入图片描述


    查了很多外网资料,都说是go的版本问题,换到go1.13即可,我之前用的是go1.18。

结语

以上就是所有官方示例的解析与操作,本人已经把官方教程的坑基本踩完,供各位新接触hyperledger fabric的朋友参考,后续学习以及本人即将要部署的区块链项目还会更新在区块链专题中。如有不对之处,欢迎指正;如有其他问题欢迎留言,如对您有帮助的话,请帮我点个赞!

原文地址:https://blog.csdn.net/weixin_44165950

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读903次。文章主要介绍了收益聚合器Beefy协议在币安智能链测试网网上的编译测试部署流程,以Pancake上的USDC-BUSD最新Curve版流动池的农场质押为例,详细介绍了完整的操作流程。_怎么在bsc网络上部署应用
文章浏览阅读952次。比特币的主要思路是,构建一个无中心、去信任的分布式记账系统。交易签名只能保证交易不是他人伪造的,却不能阻止交易的发起者自己进行多重交易,即交易的发起者将一个比特币同时转账给两个人,也就是所谓的双花。比特币应用的区块链场景也叫做公链,因为这个区块链对所有人都是公开的。除此之外,还有一种区块链应用场景,被称作联盟链。区块链的出现,使得低成本,去信任的跨组织合作成为可能,将重构组织间的关系,这个关系既包括企业间的关系,也包括政府和企业间的关系,还有政府部门间的关系。
文章浏览阅读2.5k次。虚拟人从最初的不温不火,到现在步入“出生高峰期”,元宇宙可以说是功不可没。此前,量子位发布了《虚拟数字人深度产业报告》,报告显示,到2030年我国虚拟数字人整体市场规模将达到2700亿元。其中,“身份型虚拟人”市场规模预计达到1750亿元,占主导地位,而“服务型虚拟人”总规模也将超过950亿元。得益于AI、VR/AR 等技术的发展,虚拟人的应用场景正在从传统的虚拟偶像等娱乐行业迈向更多元化的领域。_最喜欢的虚拟角色
文章浏览阅读1.3k次,点赞25次,收藏13次。通过调查和分析用户需求、兴趣和行为,你可以更好地定位你的目标受众,并在市场中找到你的定位。在设计你的Web3.0项目时,注重用户界面的友好性、交互流畅性和功能的创新性,以提供独特的用户体验。通过与有影响力的人或组织进行合作,推广你的Web3.0项目。通过与他们分享你的项目并抓住他们的推荐,可以迅速获得更多的关注度。通过优化你的网站和内容,将有助于提高你的排名,并增加有机流量。通过提供奖励激励计划,如空投、奖励机制等,激励用户参与你的Web3.0项目。的人或组织合作,可以增加你的项目的曝光度。
文章浏览阅读1.7k次。这个智能合约安全系列提供了一个广泛的列表,列出了在 Solidity 智能合约中容易反复出现的问题和漏洞。Solidity 中的安全问题可以归结为智能合约的行为方式不符合它们的意图。我们不可能对所有可能出错的事情做一个全面的列表。然而,正如传统的软件工程有常见的漏洞主题,如 SQL 注入、缓冲区超限和跨网站脚本,智能合约中也有反复出现的。_solidity安全漏洞
文章浏览阅读1.3k次。本文描述了比特币核心的编译与交互方法_编译比特币
文章浏览阅读884次。四水归堂,是中国建筑艺术中的一种独特形式。这种形式下,由四面房屋围出一个天井,房屋内侧坡向天井内倾斜,下雨时雨水会从东西南北四方流入天井,从而起到收集水源,防涝护屋的作用,寓意水聚天心,天人合一。在科技产业当中,很多时候我们需要学习古人的智慧与意蕴,尝试打通各个生态,聚四方之力为我所用,这样才能为最终用户带来最大化价值。随着数字化、智能化的发展,算力成为生产力的根基。在这一大背景下,算力需要贯通软..._超聚变csdn
文章浏览阅读1k次,点赞24次,收藏19次。云计算和区块链是当代科技领域两个备受关注的核心技术。本文将深入探讨云计算和区块链的发展历程,详细剖析其起初阶段的奠基、面临的问题、业务内容、当前研究方向、用到的技术、实际应用场景、未来发展趋势,并提供相关链接供读者深入了解。
文章浏览阅读1.5k次。融入对等网络的奥妙,了解集中式、全分布式和混合式对等网络的差异,以及区块链网络的结构与协议,让你跃入区块链的连结网络。揭开密码学的神秘面纱,探寻对称密码学、非对称密码学、哈希函数、数字签名等关键技术,让你了解信息安全的核心。解码共识算法的精髓,从理论到实践,从PoW、PoS到PBFT,让你深入了解区块链如何达成共识。探索智能合约的世界,从定义到生命周期,从执行引擎到开发与部署,带你进入无限可能的合约领域。了解令人惊叹的区块链世界,从概念到价值,从发展历程到政策法规,一篇章串联出区块链的精髓。
文章浏览阅读777次。8 月份,加密货币市场经历了明显的波动,比特币价格波动幅度较大。与此同时,NFT 市场出现大幅下跌,引发了人们对这一新兴行业未来发展趋势的担忧
文章浏览阅读8.8k次,点赞53次,收藏37次。近二十年来,我国信息科技发展日益成熟,出现的网络完全问题也是“百花齐放”。而元宇宙作为5G技术、AR/VR技术、云计算以及区块链等技术的组合体,其安全性指定会被人们所广泛关注。根据前面所讲,元宇宙融合了虚拟世界和现实世界,通过数据将现实世界的各种元素映射到数字化的虚拟世界中。所以没有数据,就等于没有元宇宙的一切;没有信息安全,元宇宙的社会生产、生活就不能正常有序地进行。所以足以可见数据安全、信息安全对元宇宙发展起到的重要作用!!_元宇宙 安全计算
文章浏览阅读1.4k次。最早使用历史 1991年采用 时间戳 追溯 数字文档,之后 2009年后创始人**中本聪** (satoshi nakamoto )日裔美国人,在设计比特币数字货币中将此理念写入应用程序中_web3.0学习
文章浏览阅读1.7k次。DeFi收益来源全面概述_drfi收益
文章浏览阅读941次,点赞17次,收藏21次。号外:教链内参1.28《从BTC现货ETF的近期数据看到的》隔夜BTC经历现货ETF通过后的情绪冷静,一度破位40k后又逐渐修复至42k上方。请珍惜42k的BTC吧。也许到下个周期,我们将不再有机会见到这个高度的BTC了。下面,让我们重温,42k的BTC,在过去四年穿越牛熊的过程中,带给我们的启迪吧。需要提醒的是,历史文字,自有历史局限性,回顾,也须带着批判性的目光阅读和审视。2021年2月8日,...
文章浏览阅读1.2k次,点赞23次,收藏21次。其实一开始我也是这么想的,但根据PoW算法机制,如果你的计算量不够大,是无法控制区块链的走向的,也就是说,即使你投入了大量的成本用于完成任务,也不能保证自己成功。例如,你持有100个币,总共持有了30天,那么,此时你的币龄就为3000,这个时候,如果你发现了一个PoS区块,那么你的币龄就会被减去一定的值,每减少365个币龄,将会从区块中获得0.05个币的利息(可理解为年利率5%),那么在这个案例中,利息=3000×5%/365=0.41个币。前面说过,谁的算力强,谁最先解决问题的概率就越大。
文章浏览阅读1.9k次。这里主要实现的部分继续下去,对 Blockchain 这个对象有一些修改,如果使用 TS 的话可能要修改对应的 interface,但是如果是 JS 的话就无所谓了。需要安装的依赖有:express现在的 express 已经不内置 body-parser,需要作为单独的依赖下载request不下载会报错,是使用 request-promise 所需要的依赖和已经 deprecated 了,具体 reference 可以参考。_js区块链
文章浏览阅读1k次,点赞19次,收藏19次。作者:Zach Pandl Grayscale编译:象牙山首席村民 碳链价值以太坊在2023年取得了丰厚的回报。但表现不如比特币以及其他一些智能合约公链代币。我们认为,这反映了今年比特币特有的积极因素以及以太坊链上活动的缓慢复苏。尽管以太坊的涨幅低于比特币,但从绝对值和风险调整值来看,今年以太坊的表现优于传统资产类别。以太坊不断增长的L2生态系统的发展可能会吸引新用户,并在2024年支撑以太币的...
文章浏览阅读908次,点赞20次,收藏20次。通证是以数字形式存在,代表的是一种权利、一种固有和内在的价值。徐教授告诉我:多年的职业经历,多年的为易货贸易的思考,认识到在处理贸易和经济领域的关系时,应以提高人民生活水平、保证社会成员充分就业、保证就业成员实际收入和有效需求的大幅稳定增长、实现世界资源的充分利用以及扩大货物的生产和交换为目的,期望通过达成互惠互利安排,实行公开、公平、公正的“三公原则”,开展国家与国家、企业与企业之间的易货贸易,规避因信用问题引起的各类风险,消除国际贸易中的歧视待遇,促进全球国家的经济发展,从而为实现上述目标做出贡献。
文章浏览阅读2.5k次。由于webase文档原因,查找起来比较局限,有时候想找一个api却又忘了在哪个模块的目录下,需要一步一步单独点,而利用文档自带的检索功能又因为查找文档全部信息,显得十分缓慢,所以整理了有关WeBASE的api列表但不可否认,现在只有列表,没有对应的页面跳转,文章目的也只是为了多了解webase的接口_webase私钥管理里获取
文章浏览阅读1.4k次,点赞28次,收藏21次。基于​openzeppelin来构建我们的NFT,并用一个例子来手把手的说明如何在opensea快速发布自己的NFT智能合约(ERC721)。