一、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