Fabric-samples 1.4商业票据教程详细过程(Commercial paper tutorial)
本文已在公众号Fabric技术分享原创首发。
转载请标明出处:
https://blog.****.net/qq_27818541/article/details/86725708
本文出自:【BigManing的博客】
文章目录
前言
node >= 8.9.0
docker >= 18.06
fabric组件版本 1.4
作者系统 Ubuntu 16.04
官方为了更好的展示应用开发的编程模型 新引进了一个事例。例子是用node编写的 ,里面引入了一些新的NPM官方包,使得开发者更加便捷的编写应用。这里记录下整个过程,来了解下新的编程模型。
一、下载fabric-samples
mkdir -p $GOPATH/src/github.com/hyperledger/
cd $GOPATH/src/github.com/hyperledger/
git clone https://github.com/hyperledger/fabric-samples.git
#基于1.4 来操作
git checkout release-1.4
二、启动网络
cd fabric-samples/basic-network
./start.sh
执行效果
..........
# 创建通道
docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/[email protected]/msp" peer0.org1.example.com peer channel create -o orderer.example.com:7050 -c mychannel -f /etc/hyperledger/configtx/channel.tx
2019-01-28 12:16:12.237 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2019-01-28 12:16:12.299 UTC [cli.common] readBlock -> INFO 002 Received block: 0
# 把peer加入到channel中
docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/[email protected]/msp" peer0.org1.example.com peer channel join -b mychannel.block
2019-01-28 12:16:12.439 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2019-01-28 12:16:12.619 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel
docker ps
查看网络组件
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
ba58407bf096 hyperledger/fabric-peer "peer node start" 5 minutes ago Up 5 minutes 0.0.0.0:7051->7051
/tcp, 0.0.0.0:7053->7053/tcp peer0.org1.example.com
f7939f8f6d6a hyperledger/fabric-ca "sh -c 'fabric-ca-se…" 5 minutes ago Up 5 minutes 0.0.0.0:7054->7054
/tcp ca.example.com
81e1265e79d9 hyperledger/fabric-orderer "orderer" 5 minutes ago Up 5 minutes 0.0.0.0:7050->7050
/tcp orderer.example.com
c753d3d1c468 hyperledger/fabric-couchdb "tini -- /docker-ent…" 5 minutes ago Up 5 minutes 4369/tcp, 9100/tcp
, 0.0.0.0:5984->5984/tcp couchdb
三、启动监控容器
这里使用logspout来监控docker日志的输出,它能把不同docker输出集中到一处。
执行下面命令
cd ../commercial-paper/organization/magnetocorp/configuration/cli/
./monitordocker.sh net_basic
执行后的效果
Starting monitoring on all containers on the network net_basic
373d4ef718bc92aefe9c9af409df59b582701ab21b744680887290162558d779
# 阻塞在这里
这个命令会阻塞在这里,这个窗口将显示docker容器的输出,所以后续的操作需要启动另一个终端窗口。
monitordocker.sh
核心逻辑如下
# 每次执行 清除旧的容器
docker kill logspout 2> /dev/null 1>&2 || true
docker rm logspout 2> /dev/null 1>&2 || true
# 启动 logspout 容器
docker run -d --name="logspout" \
--volume=/var/run/docker.sock:/var/run/docker.sock \
--publish=127.0.0.1:${PORT}:80 \
# 监听 哪个网络里的容器
--network ${DOCKER_NETWORK} \
gliderlabs/logspout
sleep 3
# 执行这个命令 会阻塞等待输出
curl http://127.0.0.1:${PORT}/logs
四、启动MagnetoCorp组织的cli
cd commercial-paper/organization/magnetocorp/configuration/cli/
docker-compose -f docker-compose.yml up -d cliMagnetoCorp
创建这个cli
是为了模拟MagnetoCorp组织进行合约操作
五、合约
1、合约预览
主要合约逻辑是在commercial-paper/organization/magnetocorp/contract/lib/papercontract.js
里
新特点:
- 从1.4开始新增了
fabric-contract-api
NPM包,包含Contract, Context
两个新概念以及高级API接口 详情请点击链接查看。
2. 以前实现合约需要实现 init invoke (定义路由实现) - 集成
Contract
后只要定义合约方法即可,内部自动实现路由。
2、合约安装
docker exec cliMagnetoCorp peer chaincode install -n papercontract -v 0 -p /opt/gopath/src/github.com/contract -l node
这里是模拟cliMagnetoCorp
这个组织来操作合约,局限于当前basic-network
单组织的网络,taget使用peer0,管理员也是org1的admin。官方后期会完善 多组织的basic-network
。
3、合约初始化
docker exec cliMagnetoCorp peer chaincode instantiate -n papercontract -v 0 -l node -c '{"Args":["org.papernet.commercialpaper:instantiate"]}' -C mychannel -P "AND ('Org1MSP.member')"
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
// 初始化的合约
88aacad81e24 dev-peer0.org1.example.com-papercontract-0-d96abb966a1ed760663cf0a061700a902284832716c55b4cb05eca53054fe011 "/bin/sh -c 'cd /usr…" 3 minutes ago Up 3 minutes dev-peer0.org1.example.com-papercontract-0
// cliMagnetoCorp 组织的操作cli
27cc187a260f hyperledger/fabric-tools "/bin/bash" 10 minutes ago Up 9 minutes cliMagnetoCorp
700e8233483b gliderlabs/logspout "/bin/logspout" 10 minutes ago Up 10 minutes 127.0.0.1:8000->80/tcp logspout
673f35c34210 hyperledger/fabric-peer "peer node start" 11 minutes ago Up 11 minutes 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer0.org1.example.com
6018fee5cc3d hyperledger/fabric-ca "sh -c 'fabric-ca-se…" 11 minutes ago Up 11 minutes 0.0.0.0:7054->7054/tcp ca.example.com
4126234e1fc6 hyperledger/fabric-couchdb "tini -- /docker-ent…" 11 minutes ago Up 11 minutes 4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp couchdb
3bd62c3f639c hyperledger/fabric-orderer "orderer" 11 minutes ago Up 11 minutes 0.0.0.0:7050->7050/tcp orderer.example.com
六、magnetocorp组织的Application
定位到commercial-paper/organization/magnetocorp/application
1、文件结构
.
├── addToWallet.js // 添加证书、秘钥到制定wallet账户
├── issue.js // magnetocorp组织 发布票据的 功能 引入了fabric-network新包
└── package.json
2、 安装依赖
npm install
3、 导入钱包
node addToWallet.js
# 就是把`basic-network`里面org1的user1 账户信息导入到wallet中
查看效果
../identity/user/isabella/wallet/
└── [email protected]
├── c75bd6911aca808941c3557ee7c97e90f3952e379497dc55eb903f31b50abc83-priv
├── c75bd6911aca808941c3557ee7c97e90f3952e379497dc55eb903f31b50abc83-pub
└── [email protected]
4、 发布商业票据
node issue.js
执行效果
Connect to Fabric gateway.
Use network channel: mychannel.
Use org.papernet.commercialpaper smart contract.
Submit commercial paper issue transaction.
2019-01-31T11:24:00.954Z - info: [TransactionEventHandler]: _strategySuccess: strategy success for transaction "df49ec6d7c32cde93a1c6a7067400eaa0155a2f6d205ec6b3250660ad4a54f6e"
Process issue transaction response.
MagnetoCorp commercial paper : 00001 successfully issued for value 5000000
Transaction complete.
Disconnect from Fabric gateway.
Issue program complete.
5、整体架构
七、启动DigiBank组织的cli
magnetocorp组织发布票据, DigiBank组织购买票据,我们需要启动一个属于DigiBank组织的cli
cd commercial-paper/organization/digibank/configuration/cli/
docker-compose -f docker-compose.yml up -d cliDigiBank
八、DigiBank组织的application
定位到commercial-paper/organization/digibank/application
1、文件结构
.
├── addToWallet.js // 添加证书、秘钥到制定wallet账户
├── buy.js // 购买票据
├── package.json
└── redeem.js // 赎回票据
2、安装依赖
npm install
3、 导入钱包
node addToWallet.js
# 就是把`basic-network`里面org1的user1 账户信息导入到wallet中
4、 购买票据
node buy.js
执行效果
Connect to Fabric gateway.
Use network channel: mychannel.
Use org.papernet.commercialpaper smart contract.
Submit commercial paper buy transaction.
2019-01-31T12:01:40.246Z - info: [TransactionEventHandler]: _strategySuccess: strategy successfor transaction "baaeeee699ccf128409c83455630774885e7b8fd3661bb2aa54c20d34cb39484"
Process buy transaction response.
MagnetoCorp commercial paper : 00001 successfully purchased by DigiBank
Transaction complete.
Disconnect from Fabric gateway.
Buy program complete.
5、 赎回票据
node redeem.js
执行效果
Connect to Fabric gateway.
Use network channel: mychannel.
Use org.papernet.commercialpaper smart contract.
Submit commercial paper redeem transaction.
2019-01-31T12:01:48.293Z - info: [TransactionEventHandler]: _strategySuccess: strategy successfor transaction "2321608a020c967e986f157a3a2cf8319a26dfe8656b2e31b8ebe3cf1796f95b"
Process redeem transaction response.
MagnetoCorp commercial paper : 00001 successfully redeemed with MagnetoCorp
Transaction complete.
Disconnect from Fabric gateway.
Redeem program complete.