Fabric学习二 (编写应用 FabCar+商业票据)

一、FabCar

1.启动网络

cd $GOPATH/src/github.com/hyperledger/fabric-samples/fabcar

./startFabric.sh javascript

 部署两个peer节点和一个排序节点以部署Fabric测试网络,使用证书颁发机构启动测试网络,而不是使用cryptogen工具,出错看最后

2.示例应用 

cd javascript

npm install

 将安装应用程序的主要依赖,这些依赖定义在 package.json 中。其中最重要的是 fabric-network 类;它使得应用程序可以使用身份、钱包和连接到通道的网关,以及提交交易和等待通知。本教程也将使用 fabric-ca-client 类来注册用户以及他们的授权证书,生成一个 fabric-network 在后边会用到的合法身份

3.登记管理员用户

node enrollAdmin.js

 这个命令将 CA 管理员的证书保存在 wallet 目录,可以在 wallet/admin.id 文件中找到管理员的证书和私钥

4.注册和登记应用程序用户

node registerUser.js

 与admin注册类似,该程序使用CSR注册 appUser 并将其凭证与 admin 凭证一起存储在钱包中。 现在,我们有了两个独立用户的身份—— admin 和 appUser ——它们可以被我们的应用程序使用

查询 

node query.js

5.更新账本

//增加新的车辆信息
node invoke.js

await contract.submitTransaction('createCar', 'CAR12', 'Honda', 'Accord', 'Black', 'Tom');

 submitTransaction 比 evaluateTransaction 更加复杂。除了跟一个单独的 peer 进行互动外,SDK 会将 submitTransaction 提案发送给在区块链网络中的每个需要的组织的 peer。其中的每个 peer 将会使用这个提案来执行被请求的智能合约,以此来产生一个建议的回复,它会为这个回复签名并将其返回给 SDK。SDK 搜集所有签过名的交易反馈到一个单独的交易中,这个交易会被发送给排序节点。排序节点从每个应用程序那里搜集并将交易排序,然后打包进一个交易的区块中。接下来它会将这些区块分发给网络中的每个 peer,在那里每笔交易会被验证并提交。最后,SDK 会被通知,这允许它能够将控制返回给应用程序

更改车辆主人

修改 invoke.js:await contract.submitTransaction('changeCarOwner', 'CAR12', 'Dave');

node invoke.js
{"Key":"CAR12","Record":{"color":"Black","docType":"car","make":"Honda","model":"Accord","owner":"Tom"}}
变成
{"Key":"CAR12","Record":{"color":"Black","docType":"car","make":"Honda","model":"Accord","owner":"Dave"}}

 6.清除数据

./networkDown.sh

 该命令将关闭我们创建的网络的CA、peer节点和排序节点。 它还将删除保存在 wallet 目录中的 admin 和 appUser 加密资料。 请注意,帐本上的所有数据都将丢失。 如果您想再次学习本教程,您将会以初始状态的形式启动网络

二、商业票据

1.创建网络

//打开fabric-simples下的商业票据文件夹

cd $GOPATH/src/github.com/hyperledger/fabric-samples/commercial-paper

//启动网络
./network-starter.sh

 出现同FabCar启动网络时一样的错误,应该是couchDB不能使用,一样地去脚本中注释掉couchDB

2.以 MagnetoCorp 的身份管理网络 

商业票据教程允许您通过为DigiBank和MagnetoCorp 提供两个单独的文件夹来充当两个组织。 这两个文件夹包含每个组织的智能合约和应用程序文件。 由于这两个组织在商业票据交易中有不同的角色, 所以每个组织的应用程序文件也不同

以 MagnetoCorp 的角色监控 PaperNet 网络中的组件

使用 logspout工具可以将不同输出流采集到一个地方,从而在一个窗口中就可以轻松看到正在发生的事情

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

cd organization/magnetocorp/


./configuration/cli/monitordocker.sh fabric_test //2.0.1版本
./configuration/cli/monitordocker.sh net_test //2.2以上版本

然后这个窗口作为日志输入窗口,再打开一个新的窗口 

3.以 MagnetoCorp 的身份安装和批准智能合约

//到目录下
cd $GOPATH/src/github.com/hyperledger/fabric-samples/commercial-paper/organization/magnetocorp/

//安装智能合约
peer lifecycle chaincode package cp.tar.gz --lang node --path ./contract --label cp_0

//安装链码
peer lifecycle chaincode install cp.tar.gz

出现:023-07-24 20:00:50.336 PDT [cli.lifecycle.chaincode] submitInstallProposal -> INFO 001 Installed remotely: response:<status:200 payload:"\nEcp_0:16a99d986c680e106abd02aff59e6a8dc26dba6369a11536c49feb96b4dc9533\022\004cp_0" > 
2023-07-24 20:00:50.336 PDT [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code package identifier: cp_0:16a99d986c680e106abd02aff59e6a8dc26dba6369a11536c49feb96b4dc9533

安装成功 

查询packageID,并保存为环境变量

//查询id
peer lifecycle chaincode queryinstalled

//保存为环境变量

sudo vim /etc/profile
export PACKAGE_ID=cp_0:16a99d986c680e106abd02aff59e6a8dc26dba6369a11536c49feb96b4dc9533
source /etc/profile

 为MagnetoCorp同意链码定义

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

 

 成功

4.以 DigiBank 的身份安装和批准智能合约

cd commercial-paper/organization/digibank/

//设置环境变量
source digibank.sh

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

//安装
peer lifecycle chaincode install cp.tar.gz

//查询id
peer lifecycle chaincode queryinstalled

//设置环境变量
export PACKAGE_ID=上面的id


//同意链码定义
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

 

5.将链码定义提交到通道

//将链码提交到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

6.应用程序依赖

//安装依赖包
cd commercial-paper/organization/magnetocorp/application/

npm install

 7.把身份信息添加到钱包中

//在 Isabella 的终端窗口中运行 addToWallet.js 程序来把身份信息添加到她的钱包中

node enrollUser.js

 8.发行应用

node issue.js

 

 9.以digibank的身份运行

//为digibank安装应用
npm install

//安装依赖
node enrollUser.js


//balaji进行交易
node buy.js


//赎回
node redeem.js

错误及原因

1.启动网络时:fabric-ca-client binary not found..

没有ca-client的二进制文件,去下面的网站看教程下一个,或者下面的代码 

//创建目录
mkdir -p $HOME/go/src/github.com/<your_github_userid>
cd $HOME/go/src/github.com/<your_github_userid>

//获取脚本
curl -sSLO https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh && chmod +x install-fabric.sh



//下载二进制文件
./install-fabric.sh --fabric-version 2.0.1 --ca-version 1.4.6 binary


//复制到/bin目录中并更改权限
cd bin/

sudo cp fabric-ca-client /usr/local/bin/fabric-ca-client

sudo chmod +x  /usr/local/bin/fabric-ca-client

再回到fabcar目录中重新执行命令

2.启动网络时:After 5 attempts, peer0.org1 has failed to join channel 'mychannel' 

error getting endorser client for channel: endorser client failed to connect to localhost:7051: failed to create new connection: connection error: desc = "transport: error while dialing: dial tcp 127.0.0.1:7051: connect: connection refused"
After 5 attempts, peer0.org1 has failed to join channel 'mychannel' 

 不知道什么原因,修改startFabric.sh文件中这行即可

//注释使用couchdb这块
./network.sh up createChannel -ca #-s couchdb

3.登记管理员用户出错:Error: Cannot find module 'fabric-ca-client'

 

 npm 版本太低啊,需要升级npm

npm update

4.启动logspout工具失败 :docker: Error response from daemon: network net_test not found.
curl: (7) Failed to connect to 127.0.0.1 port 8000: Connection refused

2.0.1版本中docker网络命名为fabric_test,或者

需要手动创建docker网络net_test,并将容器添加到其中

//创建网络
docker network inspect fabric_test

//创建网络
docker network create -d bridge net_test

//查看所有容器
docker ps

//添加所有容器
docker network connect net_test [容器名]//以上所有容器

docker network connect net_test cbf85c71fd37
docker network connect net_test a85ffe23eea4
docker network connect net_test e9d998ccd1e0
docker network connect net_test 33deea8f1f7e
docker network connect net_test 2cb3edc0ef18
docker network connect net_test 476563ed9af7
docker network connect net_test 35a6584011e2

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值