Hyperledger Fabric学习笔记——应用程序

1、基本流程

下图简单地展示了一个应用程序通过SDK调用商业票据智能合约的过程:

2、Wallet

Wallet中的X.509数字证书将组织和持有者联系起来,使得持有者能够有权限连接到网络,不同的持有者身份拥有不同的权限,并且智能合约可以在执行期间通过transaction context获得这个身份。wallet中不存放任何现金或代币,只存放身份。

应用程序使用FileSystemWallet和Gateway类连接到区块链网络,在issue.js的最上面可以看到包括了这两个类。

const { FileSystemWallet, Gateway } = require('fabric-network');

应用程序使用Wallet类:

const wallet = new FileSystemWallet('../identity/user/isabella/wallet');

3、Gateway

issue.js连接到它的的网关:

await gateway.connect(connectionProfile, connectionOptions);

gateway.connect()有两个重要参数:

connectionProfile:标识了一系列对等节点网关的connection profile文件的系统位置。为了方便读使用了YAML,通过下面的代码加载转换为JSON对象。

let connectionProfile = yaml.safeLoad(file.readFileSync('./gateway/connectionProfile.yaml', 'utf8'));

connectionOptions:一系列用来控制issue.js(应用程序代码)如何连接到区块链网络的设置。它指定了连接到网关需要的了身份,userName和wallet,还可以通过SDK实现一些智能的行为。

let connectionOptions = {
  identity: userName,
  wallet: wallet,
  eventHandlerOptions: {
    commitTimeout: 100,
    strategy: EventStrategies.MSPID_SCOPE_ANYFORTX
  },
}

网关负责使用connect profile和connection options将transaction提议发送到正确的对等节点上。

4、Network channel

网关connectionProfile.yaml配置文件中定义的peers提供了issue.js接入PaperNet的途径,因为这些对等点可以加入多个网络通道,因此网关实际上提供了应用程序接入多个网略通道的途径。

应用程序选择特定的某个通道:

const network = await gateway.getNetwork('PaperNet');

应用程序可以加入网络中的一个子网络,通过连接到多网关的对等点。每个对等点加入到多个网络通道中,应用程序根据它们不同的wallet身份在不同的通道中有不同的权限。

5、构建一个提议

应用程序直接连接到CommercialPaperContract这个智能合约:

const contract = await network.getContract('papercontract', 'org.papernet.commercialpaper');

papercontract.js是一个包含多个智能合约的链码文件,papercontract是该链码文件安装和部署在通道上的名字,通过智能合约的名称从papercontract.js链码中选出需要的智能合约。getContract()方法会默认使用它发现的链码上的第一个智能合约,因此当链码中只有一个智能合约时,可以省略合约名。

6、提交transaction提议

提交transaction提议是对SDK一个单独的方法调用:

const issueResponse = await contract.submitTransaction('issue', 'MagnetoCorp', '00001', '2020-05-31', '2020-11-30', '5000000');

看起来好像是智能合约在应用程序调用submitTransaction()后很快就获得了控制权,但事实并不是这样。在幕后,SDK使用connectionOptions和connectionProfile来将transaction提议发送到网络中正确的节点上。但是应用程序并不用管这些,只需要发起submitTransaction然后SDK完成剩下的所有操作。

注意,submitTransactionAPI包括了一个监听transaction提交的进程,这是有必要的,因为如果没有就无法知道transaction是否已经成功地完成排序,验证并提交到账本中。

7、处理响应

和transaction提议一样,可能看起来应用程序在智能合约调用后很快获得了控制权,但是事实并不是这样,同样背后的共识等过程由SDK完成。

发布了23 篇原创文章 · 获赞 0 · 访问量 1256

猜你喜欢

转载自blog.csdn.net/Nemoosi/article/details/104708877