Hyperledger Fabric1.4.4开发应用程序-应用程序

受众:架构师,应用程序和智能合约开发人员

应用程序可以通过将交易提交到分类账或查询分类账内容来与区块链网络进行交互。本主题涵盖了应用程序如何执行此操作的机制。在我们的方案中,组织使用调用商业票据智能合约中定义的发行购买赎回交易的应用程序访问PaperNet 。尽管MagnetoCorp发行商业票据的申请是基本的,但它涵盖了所有主要的理解要点。

在本主题中,我们将介绍:

为了帮助您理解,我们将参考Hyperledger Fabric随附的商业纸样应用程序。您可以下载它在本地运行它。它是用JavaScript和Java编写的,但是逻辑是完全独立于语言的,因此您可以轻松地看到发生了什么!(该示例也将适用于Go。)

基本流程

应用程序使用Fabric SDK与区块链网络进行交互。这是应用程序如何调用商业票据智能合约的简化图:

开发应用

PaperNet应用程序调用商业票据智能合约以提交发行交易请求。

申请必须遵循六个基本步骤才能提交交易:

  • 从钱包中选择一个身份
  • 连接到网关
  • 访问所需的网络
  • 构建智能合约的交易请求
  • 将交易提交到网络
  • 处理回应

您将看到典型的应用程序如何使用Fabric SDK执行这六个步骤。您将在issue.js文件中找到应用程序代码。 在浏览器中查看它,如果已下载,则在您喜欢的编辑器中将其打开。花一些时间查看应用程序的整体结构;即使有注释和空格,也只有100行代码!

钱包

在的顶部issue.js,您将看到两个Fabric类进入了作用域:

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

您可以fabric-networknode SDK文档中阅读有关这些类的 信息,但是现在,让我们看看如何使用它们将MagnetoCorp的应用程序连接到PaperNet。该应用程序使用Fabric Wallet类,如下所示:

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

查看如何在本地文件系统中wallet找到钱包。从钱包中检索到的身份显然适用于正在使用该issue应用程序的名为Isabella的用户。钱包包含一组身份(X.509数字证书),可用于访问PaperNet或任何其他Fabric网络。如果您运行本教程,并查看此目录,则将看到Isabella的身份凭证。

想象一下一个钱包,里面装有政府身份证,驾驶执照或ATM卡的数字等效物。其中的X.509数字证书将使持有者与组织相关联,从而使他们具有网络通道中的权利。例如,Isabella可能是MagnetoCorp的管理员,这可能给她比Balaji来自DigiBank 的其他用户更多的特权。此外,智能合约可以使用交易上下文在智能合约处理期间检索此身份。

还要注意,钱包不持有任何形式的现金或代币-它们持有身份。

网关

第二个关键类是结构网关。最重要的是, 网关标识一个或多个提供对网络访问权限的对等点-在我们的示例中为PaperNet。查看如何issue.js连接到其网关:

await gateway.connect(connectionProfile, connectionOptions);

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

  • connectionProfile连接配置文件的文件系统位置,该 连接配置文件将一组对等方标识为PaperNet的网关
  • connectionOptions:一组用于控制issue.js 与PaperNet交互方式的选项

了解客户端应用程序如何使用网关将自身与网络拓扑隔离,这可能会发生变化。网关负责使用连接配置文件连接选项将交易建议发送到网络中正确的对等节点 。

花一些时间检查连接 配置文件 ./gateway/connectionProfile.yaml。它使用 YAML,使其易于阅读。

它已加载并转换为JSON对象:

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

目前,我们仅对个人资料的channels:peers:部分感兴趣:(我们对细节进行了一些修改,以更好地解释发生了什么。)

channels:
  papernet:
    peers:
      peer1.magnetocorp.com:
        endorsingPeer: true
        eventSource: true

      peer2.digibank.com:
        endorsingPeer: true
        eventSource: true

peers:
  peer1.magnetocorp.com:
    url: grpcs://localhost:7051
    grpcOptions:
      ssl-target-name-override: peer1.magnetocorp.com
      request-timeout: 120
    tlsCACerts:
      path: certificates/magnetocorp/magnetocorp.com-cert.pem

  peer2.digibank.com:
    url: grpcs://localhost:8051
    grpcOptions:
      ssl-target-name-override: peer1.digibank.com
    tlsCACerts:
      path: certificates/digibank/digibank.com-cert.pem

了解如何channel:识别PaperNet:网络通道及其两个对等端。MagnetoCorp peer1.magenetocorp.com和DigiBank具有 peer2.digibank.com,两者都具有对同伴的支持作用。通过peers:密钥链接到这些对等设备,该密钥包含有关如何连接到它们的详细信息,包括它们各自的网络地址。

连接配置文件包含很多信息-不仅包括对等信息-而且还包含网络通道,网络订购者,组织和CA,因此如果您不了解所有信息,请不要担心!

现在让我们将注意力转向该connectionOptions对象:

let connectionOptions = {
  identity: userName,
  wallet: wallet
}

了解如何指定标识userName和钱包wallet用于连接网关。这些是在代码的前面分配的值。

应用程序还可以使用其他连接选项来指示SDK代表其智能操作。例如:

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

在这里,commitTimeout告诉SDK等待100秒以了解事务是否已提交。并指定SDK可以在单个MagnetoCorp对等方确认交易后通知应用程序,而相反,这要求MagnetoCorp和DigiBank的所有对等方确认交易。strategy: EventStrategies.MSPID_SCOPE_ANYFORTX``strategy: EventStrategies.NETWORK_SCOPE_ALLFORTX

如果您愿意,请阅读更多有关连接选项如何允许应用程序指定面向目标的行为的信息,而不必担心如何实现。

网络渠道

在网关上定义的同龄人connectionProfile.yaml提供 issue.js与接入PaperNet。因为这些对等方可以加入多个网络通道,所以网关实际上为应用程序提供了对多个网络通道的访问权限!

查看应用程序如何选择特定频道:

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

从那时起,network将提供对PaperNet的访问。此外,如果应用程序要同时访问另一个网络BondNet,则很容易:

const network2 = await gateway.getNetwork('BondNet');

现在我们的应用程序可以访问到第二网络,BondNet同时有PaperNet

我们可以在这里看到Hyperledger面料的强大的功能-应用程序可以参加一个在网络的网络,通过连接到多个网关同行,每一个连接到多个网络渠道。根据中提供的钱包身份,应用程序将在不同渠道中拥有不同的权利gateway.connect()

构造要求

该应用程序现在准备发布商业票据。为此,它将CommercialPaperContract再次使用,访问此智能合约相当简单:

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

注意应用程序如何提供名称papercontract–和明确的合同名称:org.papernet.commercialpaper!我们将看到合同名称如何从papercontract.js 包含许多合同的链码文件中挑选出一个合同。在PaperNet中,papercontract.js已使用名称安装并实例化了名称papercontract,如果您有兴趣,请阅读如何安装和实例化包含多个智能合约的链码。

如果我们的应用程序同时需要访问PaperNet或BondNet中的另一个合同,这将很容易:

const euroContract = await network.getContract('EuroCommercialPaperContract');

const bondContract = await network2.getContract('BondContract');

在这些示例中,请注意我们如何不使用合格合同名称-每个文件只有一个智能合同,并且getContract()将使用找到的第一个合同。

回顾一下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');

查看submitTransaction()参数如何与事务请求的参数匹配。这些值将传递给issue()智能合约中的方法,并用于创建新的商业票据。回顾其签名:

async issue(ctx, issuer, paperNumber, issueDateTime, maturityDateTime, faceValue) {...}

在应用程序发布后不久,智能合约可能会收到控制权submitTransaction(),但事实并非如此。在幕后,SDK使用connectionOptionsconnectionProfile详细信息将交易建议发送到网络中正确的对等方,在这里它可以获取所需的认可。但是,应用程序无需担心所有这些问题submitTransaction,它只需要发布就可以了,SDK会处理一切!

请注意,submitTransactionAPI包含用于侦听事务提交的过程。需要侦听提交,因为没有提交,您将不知道您的交易是否已成功排序,验证并提交到分类账。

现在让我们将注意力转移到应用程序如何处理响应上!

流程响应

回想一下发行交易papercontract.js如何返回商业票据响应:

return paper.toBuffer();

您会注意到一个小怪癖–新的新数据paper需要在返回到应用程序之前转换为缓冲区。请注意,如何issue.js使用类方法CommercialPaper.fromBuffer()为响应缓冲纸补充水分,作为商业论文:

let paper = CommercialPaper.fromBuffer(issueResponse);

这允许paper在描述性完成消息中以自然的方式使用:

console.log(`${paper.issuer} commercial paper : ${paper.paperNumber} successfully issued for value ${paper.faceValue}`);

了解paper在应用程序合约和智能合约中如何使用相同的类–如果您像这样构造代码,它将真正帮助提高可读性和重用性。

与交易建议一样,智能合约完成后,应用程序似乎很快就会收到控制权,但事实并非如此。在幕后,SDK管理整个共识过程,并根据strategyconnectionOption 通知应用程序完成。如果您对SDK的幕后操作感兴趣,请阅读详细的 交易流程

而已!在本主题中,您已经了解了如何通过检查MagnetoCorp的应用程序如何在PaperNet中发布新的商业论文来从示例应用程序中调用智能合约。现在,检查关键分类账和智能合约数据结构是根据其背后的体系结构主题设计的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352