商业票据
搭建完了fabric1.4版本,根据官方教程商业票据教程,运行了一下,该教程官网介绍的十分详细,便于熟悉fabric平台以及工作流程,以下为详细操作过程:
该教程主要结构如下图所示:两个组织MagnetoCorp和DigiBank使用PaperNet(一种Hyperledger Fabric区块链网络)相互交易商业票据。
首先MagnetoCorp的员工Isabella代表MagnetoCorp发行商业票据。DigiBank员工Balaji购买此商业票据,持有一段时间后与MagnetoCorp一起以小额利润进行兑换。
一、先决条件
node版本8.9.0或更高版本
Docker版本18.06或更高版本
二、下载样本
首先下载存储库。
创建相对于将安装$GOPATH位置的目录fabric-samples:
$ mkdir -p $GOPATH/src/github.com/hyperledger/
$ cd $GOPATH/src/github.com/hyperledger/
使用该命令将存储库复制到此位置
$ git clonehttps://github.com/hyperledger/fabric-samples.git
检查以下目录结构fabric-samples:
$ cd fabric-samples
$ ls
CODE_OF_CONDUCT.md balance-transfer fabric-ca
CONTRIBUTING.md basic-network first-network
Jenkinsfile chaincode high-throughput
LICENSE chaincode-docker-devmode scripts
MAINTAINERS.md commercial-paper README.md
fabcar
commercial-paper是我们的样本所在的位置
三、创建网络
Hyperledger Fabric基本网络包括对等体及其分类帐数据库,订购者和证书颁发机构(CA)。这些组件中的每一个都作为docker容器运行。对等体,其分类帐,订货人和CA均在其自己的docker容器中运行。在生产环境中,组织通常使用与其他系统共享的CA。
使用fabric-samples\basic-network目录中包含的命令和配置来管理基本网络。使用start.shshell脚本在本地计算机上启动网络:
$cd go/src/github.com/hyperledger/fabric/fabric-samples
$ cd basic-network
$ ./start.sh
显示如下:
# don't rewrite paths for Windows Git Bash users
export MSYS_NO_PATHCONV=1
docker-compose -f docker-compose.yml down
Removing network net_basic
WARNING: Network net_basic not found.
docker-compose -f docker-compose.yml up -dca.example.comorderer.example.compeer0.org1.example.comcouchdb
Creating network "net_basic" with the default driver
Creatingorderer.example.com... done
Creating couchdb ... done
Creatingca.example.com ... done
Creatingpeer0.org1.example.com... done
# wait for Hyperledger Fabric to start
# incase of errors when running later commands, issue export FABRIC_START_TIMEOUT=
export FABRIC_START_TIMEOUT=10
#echo ${FABRIC_START_TIMEOUT}
sleep ${FABRIC_START_TIMEOUT}
# Create the channel
docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/[email protected]/msp"peer0.org1.example.compeer channel create -oorderer.example.com:7050-c mychannel -f /etc/hyperledger/configtx/channel.tx
2019-04-03 08:26:24.956 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2019-04-03 08:26:25.032 UTC [cli.common] readBlock -> INFO 002 Received block: 0
# Joinpeer0.org1.example.comto the channel.
docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/[email protected]/msp"peer0.org1.example.compeer channel join -b mychannel.block
2019-04-03 08:26:25.266 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2019-04-03 08:26:25.443 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel
使用以下命令列出运行基本网络组件的docker容器:docker ps
上图可以看出:
对等peer0.org1.example.com体正在容器中运行99b62198d527
订货人orderer.example.com正在集装箱中运行8c2f02a19878
CouchDB数据库couchdb正在容器中运行460bef2fa1a7
CA ca.example.com正在容器中运行c9ca1844db50
四、MagnetoCorp工作
要监控PaperNet的MagnetoCorp组件,管理员可以使用该logspout 工具查看来自一组docker容器的聚合输出。它将不同的输出流收集到一个地方,从而可以轻松查看单个窗口中发生的情况。监控PaperNet作为MagnetoCorp管理员。在fabric-samples目录中打开一个新窗口,找到并运行该monitordocker.sh 脚本以启动logspout与docker网络关联的PaperNet docker容器的工具net_basic:
$ cd go/src/github.com/hyperledger/fabric/fabric-samples
$ cd commercial-paper/organization/magnetocorp/configuration/cli/
$ ./monitordocker.sh net_basic
这个命令会阻塞在这里,这个窗口将显示docker容器的输出,后续的操作启动另一个终端窗口。
要与PaperNet交互,MagnetoCorp管理员需要使用Hyperledger Fabric命令。使用docker-compose 命令为管理员启动MagnetoCorp特定的docker容器:
$ cd commercial-paper/organization/magnetocorp/configuration/cli/
$ docker-compose -f docker-compose.yml up -d cliMagnetoCorp
$ docker ps
MagnetoCorp管理员将使用容器中的命令行 bdd2b37483ab与PaperNet进行交互。
logspout容器 68a74abda1e4是捕获monitordocker.sh命令的所有其他docker容器的输出。
五、智能合约
issue,buy并且redeem是在PaperNet智能合同的三个功能。应用程序使用它来提交相应地在分类帐上发行,购买和兑换商业票据的交易。
检查这个智能合约:
打开一个新的终端窗口来代表MagnetoCorp开发人员,并切换到包含MagnetoCorp智能合约副本的目录。
$ cd commercial-paper/organization/magnetocorp/contract
$ code .
#使用VS Code查看它,在lib文件夹的目录中,papercontract.js文件包含商业票据智能合约。
关键程序行:
const { Contract, Context } = require('fabric-contract-api');
该声明涵盖了两个关键的Hyperledger Fabric类 Contract和Context。
class CommercialPaperContract extends Contract {
这定义了CommercialPaperContract基于内置Fabric Contract类的智能合约类。其落实的关键交易的方法issue,buy和redeem商业票据是这个类中定义。
async issue(ctx, issuer, paperNumber, issueDateTime, maturityDateTime...) {
此方法定义issuePaperNet 的商业票据交易。传递给此方法的参数将用于创建新的商业票据。
let paper = CommercialPaper.createInstance(issuer, paperNumber, issueDateTime...);
在issue事务中,此语句使用CommercialPaper具有提供的事务输入的类在内存中创建新的商业票据。
await ctx.paperList.addPaper(paper);
此语句使用在初始化智能合约上下文时创建ctx.paperList的PaperList类的实例,将新的商业票据添加到分类帐 CommercialPaperContext。
return paper.toBuffer();
此语句返回二进制缓冲区作为issue 事务的响应,以供智能合约的调用者处理。
六、安装合同
在papercontract可以由应用程序调用之前,须将其安装到PaperNet中的相应对等节点上。
MagnetoCorp管理员使用该命令将智能合约从其本地计算机的文件系统复制到目标对等方的docker容器中的文件系统。一旦智能合约安装在对等端并在通道上实例化, 就可以由应用程序调用,并通过putState() 和getState() Fabric API 与分类帐数据库交互 。
现在为MagnetoCorp管理员安装papercontract。在MagnetoCorp管理员的命令窗口中,使用该命令在容器中运行命令:
$docker exec cliMagnetoCorp peer chaincode install -n papercontract -v 0 -p /opt/gopath/src/github.com/contract-l node
所述cliMagnetCorp容器具有设置CORE_PEER_ADDRESS=peer0.org1.example.com:7051到目标其命令peer0.org1.example.com,并且指示 已经在此对等体已成功安装。
七、实例化合同
MagnetoCorp管理员实例化papercontract包含智能合约的链码。将创建一个新的docker chaincode容器来运行 papercontract。
该MagnetoCorp管理员使用命令来实例化:
$ docker exec cliMagnetoCorp peer chaincode instantiate -n papercontract -v 0 -l node -c '{"Args":["org.papernet.commercialpaper:instantiate"]}' -C mychannel -P "AND ('Org1MSP.member')"
八、应用结构
包含papercontract在内的智能合约由MagnetoCorp的应用程序调用issue.js。伊莎贝拉使用此应用程序向发行商业票据的分类帐提交交易00001。
网关允许应用程序关注事务生成,提交和响应。它协调不同网络组件之间的事务提议,排序和通知处理。Isabella提交issue交易,首先从她的钱包中检索Isabella的X.509证书,issue 应用程序可以利用网关在channel上提交交易。Hyperledger Fabric SDK提供 网关抽象,以便应用程序可以专注于应用程序逻辑,同时将网络交互委派给网关。
为Isabella打开一个单独的终端窗口,找到MagnetoCorp /application文件夹:
$ cd go/src/github.com/hyperledger/fabric/fabric-samples
$ cd commercial-paper/organization/magnetocorp/application/
$ ls
显示如下:
addToWallet.js issue.js package.json
addToWallet.js是伊莎贝拉将将她的身份加载到她的钱包中的程序,issue.js将使用此身份,00001代表MagnetoCorp通过调用创建商业票据papercontract。
切换到包含MagnetoCorp应用程序副本的目录 issue.js,并使用代码编辑器检查它:
$cd commercial-paper/organization/magnetocorp/application
$ code issue.js
注意以下关键程序行issue.js
const { FileSystemWallet, Gateway } = require('fabric-network');
该语句将两个关键的Hyperledger Fabric SDK类纳入范围 - Wallet和Gateway。因为Isabella的X.509证书在本地文件系统中,所以应用程序使用FileSystemWallet。
const wallet = new FileSystemWallet('../identity/user/isabella/wallet');
此语句标识应用程序isabella在连接到区块链网络通道时将使用钱包。应用程序将在isabella钱包中选择特定身份。(钱包必须装有伊莎贝拉的X.509证书 - 就是addToWallet.js 这样。)
await gateway.connect(connectionProfile, connectionOptions);
这行代码使用标识的网关连接到网络 connectionProfile,使用中提到的标识ConnectionOptions。
const network = await gateway.getNetwork('mychannel');
此连接应用到网络信道mychannel,其中,所述 papercontract先前实例化。
const issueResponse = await contract.submitTransaction('issue', 'MagnetoCorp', '00001'...);
这行代码使用issue 智能合约中定义的事务将事务提交给网络。MagnetoCorp,00001...是issue交易用于创建新商业票据的值。
let paper = CommercialPaper.fromBuffer(issueResponse);
此语句处理来自issue事务的响应。
九、安装应用程序依赖
用命令安装这些软件包
$ cd commercial-paper/organization/magnetocorp/application/
$ npm install
十、钱包
将身份信息添加到Isabella的钱包中:
$ node addToWallet.js
$ ls ../identity/user/isabella/wallet/
$ ls ../identity/user/isabella/wallet/[email protected]
查看Isabella身份信息 - [email protected]。
c75bd6911a...-priv——伊莎贝拉签署交易的私钥。
公共密钥c75bd6911a...-pub 完全包含在伊莎贝拉的X.509证书中。
证书[email protected]包含伊莎贝拉的公共密钥和证书在创建由证书颁发机构增加了其他X.509属性。此证书将分发到网络,以便不同时间的不同参与者可以加密验证由Isabella的私钥创建的信息。
十一、发行申请
伊莎贝拉现在可以issue.js用来提交发行MagnetoCorp商业票据的交易00001:
$ node issue.js
十二、DigiBank工作
现在,00001MagnetoCorp发布了商业票据。创建一个配置为与PaperNet交互的控制台。然后,最终用户Balaji使用Digibank的buy应用程序购买商业票据00001。
打开一个单独的终端。在fabric-samples目录下:
$ cd go/src/github.com/hyperledger/fabric/fabric-samples
$ cd commercial-paper/organization/digibank/configuration/cli/
$ docker-compose -f docker-compose.yml up -d cliDigiBank
为Balaji打开一个单独的终端窗口。
$ cd go/src/github.com/hyperledger/fabric/fabric-samples
$ cd commercial-paper/organization/digibank/application/
DigiBank的buy.js应用程序在结构上与MagnetoCorp非常相似,issue.js有两个重要区别:
身份:用户是DigiBank用户Balaji而不是MagnetoCorp Isabella
事务:调用的事务buy而不是issue
安装应用程序依赖项:
$ npm install
在Balaji的终端窗口中,运行addToWallet.js程序将身份信息添加到他的钱包中:
$ node addToWallet.js
购买申请
Balaji现在可以buy.js用来提交将MagnetoCorp商业票据的所有权转让00001给DigiBank的交易。
$ node buy.js
赎回票据
商业票据生命周期中的最后一笔交易00001是DigiBank用MagnetoCorp兑换它。Balaji用于redeem.js提交交易以在智能合约中执行赎回逻辑。
$ node redeem.js
完成!