下图简单地展示了一个应用程序通过SDK调用商业票据智能合约的过程:
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');
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提议发送到正确的对等节点上。
网关connectionProfile.yaml配置文件中定义的peers提供了issue.js接入PaperNet的途径,因为这些对等点可以加入多个网络通道,因此网关实际上提供了应用程序接入多个网略通道的途径。
应用程序选择特定的某个通道:
const network = await gateway.getNetwork('PaperNet');
应用程序可以加入网络中的一个子网络,通过连接到多网关的对等点。每个对等点加入到多个网络通道中,应用程序根据它们不同的wallet身份在不同的通道中有不同的权限。
应用程序直接连接到CommercialPaperContract这个智能合约:
const contract = await network.getContract('papercontract', 'org.papernet.commercialpaper');
papercontract.js是一个包含多个智能合约的链码文件,papercontract是该链码文件安装和部署在通道上的名字,通过智能合约的名称从papercontract.js链码中选出需要的智能合约。getContract()方法会默认使用它发现的链码上的第一个智能合约,因此当链码中只有一个智能合约时,可以省略合约名。
提交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是否已经成功地完成排序,验证并提交到账本中。
和transaction提议一样,可能看起来应用程序在智能合约调用后很快获得了控制权,但是事实并不是这样,同样背后的共识等过程由SDK完成。