注:素材来自超级账本官方文档
受众:架构师、应用程序和智能合约开发人员
应用程序可以通过将交易提交到帐本或查询帐本内容来与区块链网络进行交互。本主题介绍了应用程序如何执行此操作的机制; 在我们的场景中,组织使用应用程序访问 PaperNet,这些应用程序调用定义在商业票据智能合约中的发行、购买和兑换交易。尽管 MagnetoCorp 的应用发行商业票据是基础功能,但它涵盖了所有主要的理解点。
在本主题中,我们将介绍:
- 从应用程序到调用智能合约
- 应用程序如何使用钱包和身份
- 应用程序如何使用网关连接
- 如何访问特定网络
- 如何构造交易请求
- 如何提交交易
- 如何处理交易响应
基本流程
应用程序使用 Fabric SDK 与区块链网络交互。 以下是应用程序如何调用商业票据智能合约的简化图表:
PaperNet 应用程序调用商业票据智能合约来提交发行交易请求。应用程序必须遵循六个基本步骤来提交交易:
- 从钱包中选择一个身份
- 连接到网关
- 访问所需的网络
- 构建智能合约的交易请求
- 将交易提交到网络
- 处理响应
钱包
钱包拥有一组身份——X.509 数字证书——可用于访问 PaperNet 或任何其他 Fabric 网络。
想想一个钱包里面装着政府身份证,驾照或 ATM 卡的数字等价物。其中的 X.509 数字证书将持有者与组织相关联,从而使他们有权在网络通道中获得权利。
另请注意,钱包不持有任何形式的现金或代币——它们持有身份。
网关
第二个关键类是 Fabric Gateway。最重要的是,网关识别一个或多个提供网络访问的 Peer 节点——在我们的例子中是 PaperNet。了解 issue.js
如何连接到其网关:
await gateway.connect(connectionProfile, connectionOptions);
- connectionProfile:
连接配置文件的文件系统位置,用于将一组 Peer 节点标识为 PaperNet 的网关 - connectionOptions:一组用于控制
issue.js
与 PaperNet 交互的选项
了解客户端应用程序如何使用网关将自身与可能发生变化的网络拓扑隔离开来。网关负责使用连接配置文件和连接选项将交易提案发送到网络中的正确 Peer 节点。
网络通道
在网关 connectionProfile.yaml
中定义的 Peer 节点提供 issue.js
来访问 PaperNet。 由于这些 Peer 节点可以连接到多个网络通道,因此网关实际上为应用程序提供了对多个网络通道的访问!
了解应用程序如何选择特定通道:
const network = await gateway.getNetwork('PaperNet');
从这一点开始, network
将提供对 PaperNet 的访问。 此外,如果应用程序想要访问另一个网络,BondNet
,同时,它很容易:
const network2 = await gateway.getNetwork('BondNet');
现在,我们的应用程序可以访问第二个网络 BondNet
,同时可以访问 PaperNet
!
我们在这里可以看到 Hyperledger Fabric 的一个强大功能——应用程序可以通过连接到多个网关 Peer 节点来加入网络中的网络,每个网关 Peer 节点都连接到多个网络通道。 根据 gateway.connect()
提供的钱包标识,应用程序将在不同的通道中拥有不同的权限。
构造请求
该应用程序现在准备发行商业票据。
要做到这一点,它将再次使CommercialPaperContract
它可以非常直接地访问这个智能合约:
const contract = await network.getContract('papercontract', 'org.papernet.commercialpaper');
如果我们的应用程序同时需要访问 PaperNet 或 BondNet 中的另一个合约,这将很容易:
const euroContract = await network.getContract('EuroCommercialPaperContract');
const bondContract = await network2.getContract('BondContract');
回想一下 MagnetoCorp 用于发行其第一份商业票据的交易:
Txn = issue
Issuer = MagnetoCorp
Paper = 00001
Issue time = 31 May 2020 09:00:00 EST
Maturity date = 30 November 2020
Face value = 5M USD
我们现在将此交易提交给 PaperNet!
提交交易
提交一个交易是对 SDK 的单个方法调用:
const issueResponse = await contract.submitTransaction('issue', 'MagnetoCorp', '00001', '2020-05-31', '2020-11-30', '5000000');
处理响应
回想一下 papercontract.js
如何发行交易返回一个商业票据响应:
return paper.toBuffer();
您会注意到一个轻微的怪癖——新票据需要在返回到应用程序之前转换为缓冲区。请注意 issue.js
如何使用类方法 CommercialPaper.fromBuffer()
将响应缓冲区重新转换为商业票据:
let paper = CommercialPaper.fromBuffer(issueResponse);
这样可以在描述性完成消息中以自然的方式使用票据
:
console.log(`${paper.issuer} commercial paper : ${paper.paperNumber} successfully issued for value ${paper.faceValue}`);