Fabric-商业票据项目说明

商业票据项目 

PaperNet network

PaperNet是一个商业票据网络,允许适当授权的参与者发行、交易、赎回和评级商业票据。

 

 

PaperNet 商业票据网络: 6个机构参与, 行为有 发行, 购买, 出售,赎回,评级.

  1. MagentoCorp发行和赎回商业票据。
  2. DigiBank、BigFund、BrokerHouse和HedgeMatic都相互进行商业票据交易。
  3. RateM为商业票据提供各种风险度量。

参与者介绍

MagnetoCorp是一家备受尊敬的无人驾驶电动汽车制造商。2020年4月初,MagnetoCorp赢得了一份大订单,为个人运输市场的新进入者Daintree生产1万辆Model D汽车。尽管该订单对MagnetoCorp来说是一场重大胜利,但在11月1日开始交付之前,Daintree将不必为这些汽车付款,而此时距离MagnetoCorp与Daintree正式达成协议已有6个月时间。

为了制造这些汽车,MagnetoCorp将需要雇佣1000名工人,工作时间至少为6个月。这给公司的财务带来了短期的压力——它将需要每月额外的500万美元来支付这些新员工的工资。商业票据的设计是为了帮助MagnetoCorp克服其短期融资需求——用于支付每月的工资,因为该公司预计,当Daintree开始支付新款Model D汽车时,公司将拥有充裕的现金。

金融的比较懂: 有产业(或者没产业),没钱,先借钱,后还钱,再还利息.

在5月底,MagnetoCorp需要500万美元来支付5月1日雇佣的额外员工的工资。为此,它发行一份面值500万美元的商业票据,到期日为未来6个月——届时它预计将从Daintree获得现金流。DigiBank认为MagnetoCorp信用良好,因此不需要比中央银行2%的基准利率高出太多,按照现在的495万美元,6个月后将达到500万美元。因此,它以494万美元的价格购买了MagnetoCorp的6个月商业票据——与其价值495万美元相比略有折扣。DigiBank完全期望在6个月内能够从MagnetoCorp赎回500万美元,这将使其获得1万美元的利润,以承担与该商业票据相关的增加风险。这额外的1万美元意味着它能获得2.4%的投资回报率——远高于2%的无风险回报率。

6月底,当MagnetoCorp发行一份500万美元的新商业票据来支付6月份的工资时,它被BigFund以494万美元的价格收购。这是因为6月份的商业环境与5月份大致相同,导致大基金对MagnetoCorp商业票据的估值与5月份的DigiBank相同。

此后的每个月,MagnetoCorp都可以发行新的商业票据,以满足其支付工钱的义务,而这些票据可能由DigiBank或PaperNet商业票据网络的任何其他参与者——BigFund、HedgeMatic或BrokerHouse——购买。这些机构可能会为商业票据支付或多或少的费用,这取决于两个因素——央行的基本利率,以及与MagnetoCorp相关的风险。后一个数字取决于多种因素,比如D型汽车的产量,以及评级机构RateM对MagnetoCorp的信用评级。

PaperNet中的组织机构扮演着不同的角色,MagnetoCorp发行票据、DigiBank、BigFund、HedgeMatic和BrokerHouse交易票据以及RateM rates票据。同一角色的机构,如DigiBank、Bigfund、HedgeMatic和BrokerHouse都是竞争对手。组织不同的角色不一定是竞争对手,但可能仍有反对商业利益,例如MagentoCorp将欲望高评级的论文以高价卖给他们,而DigiBank将受益于较低的评级,这样它能以较低的价格买进。可见,即使像PaperNet这样看似简单的网络,也可能存在复杂的信任关系。区块链有助于在竞争对手或商业利益对立的组织之间建立信任,这些组织可能会导致争端。特别是Fabric具有捕获甚至细粒度信任关系的方法。

让我们暂停一下MagnetoCorp的故事,开发客户端应用程序和智能合同,PaperNet使用它们来发行、购买、出售和赎回商业票据,并获取组织之间的信任关系。我们稍后会回到评级机构RateM的角色。

分析

我们更详细地分析一下商业票据。PaperNet的参与者,如MagnetoCorp和DigiBank,使用商业票据交易来实现他们的商业目标——让我们来研究一下商业票据的结构以及随着时间的推移对其产生影响的交易。我们还将考虑PaperNet中的哪些组织需要根据网络中组织之间的信任关系签署交易。稍后我们将关注资金如何在买家和卖家之间流动;现在,让我们关注MagnetoCorp发行的第一份文件。

 

商业票据生命周期

00001号文件由MagnetoCorp于5月31日发行。花一些时间看看本文的第一个状态,它有不同的属性和值:

Issuer = MagnetoCorp
Paper = 00001
Owner = MagnetoCorp
Issue date = 31 May 2020
Maturity = 30 November 2020
Face value = 5M USD
Current state = issued

这种票据状态是发行交易的结果,它带来了MagnetoCorp的第一个商业票据的存在!请注意,该债券的面值为500万美元,可在今年晚些时候赎回。当发行票据00001时,看看发行人和所有者是如何相同的。注意,这种纸张可以唯一地标识为MagnetoCorp00001——发行者和纸张属性的组合。最后,查看属性Current state = issued如何快速识别MagnetoCorp票据00001在其生命周期中的阶段。

发行后不久,该债券就被DigiBank收购。花点时间看看同样的商业票据是如何因这次购买交易而改变的:


Issuer = MagnetoCorp
Paper = 00001
Owner = DigiBank
Issue date = 31 May 2020
Maturity date = 30 November 2020
Face value = 5M USD
Current state = trading

 

最重大的变化是所有者的变化——看看最初由MagnetoCorp拥有的报纸现在是如何由DigiBank拥有的吧。我们可以想象,该报纸随后可能会被出售给经纪公司或HedgeMatic,以及相应的所有者变动。请注意,当前的状态使我们能够很容易地识别出该文件正在交易。

 

6个月后,如果DigiBank仍持有商业票据,则可与MagnetoCorp进行赎回:


Issuer = MagnetoCorp
Paper = 00001
Owner = MagnetoCorp
Issue date = 31 May 2020
Maturity date = 30 November 2020
Face value = 5M USD
Current state = redeemed

最后的赎回交易结束了商业票据的生命周期——可以认为已经结束。通常必须对赎回的商业票据进行记录,而赎回的状态使我们能够迅速识别这些票据。通过将所有者与事务创建者的身份进行比较,可以使用文件所有者的值对赎回事务执行访问控制。

交易

我们已经看到,票据00001的生命周期相对简单——它在发行、交易和因发行、购买或赎回交易而赎回之间移动。这三次交易由MagnetoCorp和DigiBank发起(两次),并驱动00001纸的状态变化。让我们更详细地看看影响本文的交易:

Issue

查看Issue事物具有怎样的属性和值.

 


Txn = issue
Issuer = MagnetoCorp
Paper = 00001
Issue time = 31 May 2020 09:00:00 EST
Maturity date = 30 November 2020
Face value = 5M USD

唯一参与发行交易的机构是MagnetoCorp。当然,MagnetoCorp需要在这笔交易上签字。一般来说,发行票据的人必须在发行新票据的交易上签字。

Buy

接下来,检查将纸张00001的所有权从MagnetoCorp转移到DigiBank的购买交易:

​
Txn = buy
Issuer = MagnetoCorp
Paper = 00001
Current owner = MagnetoCorp
New owner = DigiBank
Purchase time = 31 May 2020 10:00:00 EST
Price = 4.94M USD

如果被BigFund 购买,就是这样的


Txn = buy
Issuer = MagnetoCorp
Paper = 00001
Current owner = DigiBank
New owner = BigFund
Purchase time = 2 June 2020 12:20:00 EST
Price = 4.93M USD

 

如果被HedgeMatic购买

 


Txn = buy
Issuer = MagnetoCorp
Paper = 00001
Current owner = BigFund
New owner = HedgeMatic
Purchase time = 3 June 2020 15:59:00 EST
Price = 4.90M USD

看看票据所有者是如何变化的,以及在我们的例子中,价格是如何变化的。你能想出MagnetoCorp商业票据价格下跌的原因吗?

直观地说,购买交易要求买卖双方都要在交易上签字,以证明交易双方达成了协议。

 

Redeem

票据00001的赎回事务表示其生命周期的结束。在我们这个相对简单的例子中,HedgeMatic启动将商业票据转回给MagnetoCorp的交易:

 


Txn = redeem
Issuer = MagnetoCorp
Paper = 00001
Current owner = HedgeMatic
Redeem time = 30 Nov 2020 12:00:00 EST

 

再一次,注意赎回交易是如何只有很少的属性;对票据00001的所有更改都可以通过赎回事务逻辑计算数据:发行者将成为新的所有者,当前状态将更改为赎回。在我们的示例中指定了Current owner属性,以便可以根据纸张的当前持有者对其进行检查。

 

从信任的角度来看,buy交易的相同推理也适用于赎回指令:交易涉及的两个组织都需要签署它

 

账本

我们已经了解了事务和最终的票据状态成为PaperNet中两个最重要的概念。实际上,我们将在任何超级账本结构分布式账本中看到这两个基本元素—世界状态(包含所有对象的当前值)和区块链(记录导致当前世界状态的所有事务的历史)。

在将一笔交易附加到分类账之前,要对各项规则进行评估。只有当需要的签名存在时,Fabric才会接受有效的事务。

 

流程和数据设计

生命周期

重要概念,事物和状态, 所有账本都以这两个为核心.

 

查看状态图如何描述商业票据如何随时间变化,以及特定的事务如何管理生命周期转换。在超账本结构中,智能合同实现了商业票据在不同状态之间转换的交易逻辑。商业票据状态实际上是在世界状态中持有的;所以让我们仔细看看它们。

账本状态

看看MagnetoCorp的票据00001是如何表示为根据不同交易刺激而转变的状态向量:

请注意,每一个票据是如何以空状态开始的,从技术上来说,这是一篇票据的nil状态,因为它不存在!看看00001票据是如何通过发行交易产生的,以及它随后是如何在购买和赎回交易中更新的。

注意每个状态是如何自我描述的;每个属性都有一个名称和一个值。虽然目前我们所有的商业票据都具有相同的属性,但这并不需要一直如此,因为Hyperledger Fabric支持具有不同属性的不同状态。这使得同一分类账世界状态包含同一资产的不同形式以及不同类型的资产。它还可以更新一个状态的结构;想象一下,一个新的法规需要一个额外的数据字段。灵活的状态属性支持数据随时间演化的基本需求。

 

状态key

 

在大多数实际应用程序中,状态将具有在给定上下文中唯一标识它的属性组合——这是关键。商业票据的关键是由发行机构和票据属性的串联构成;MagnetoCorp的第一张票据是MagnetoCorp00001。

状态键允许我们唯一地识别一张票据;它是在发行事务中创建的,随后通过买入和赎回进行更新。超级账本要求账本中的每个状态都有一个唯一的键。

当可用属性集的惟一键不可用时,将应用程序确定的惟一键指定为创建状态的事务的输入。这个惟一键通常带有某种形式的UUID,尽管可读性较差,但这是一种标准实践。重要的是,分类账中的每个状态对象都必须有一个唯一的键。

 

多状态

正如我们所看到的,PaperNet中的商业票据以状态向量的形式存储在分类帐中。能够从分类账查询不同的商业票据是一个合理的要求;例如:查找所有MagnetoCorp发行的文件,或查找所有MagnetoCorp在赎回状态下发行的文件。

为了使这些类型的搜索任务成为可能,将所有相关的票据分组在一个逻辑列表中是很有帮助的。PaperNet的设计包含了商业票据列表的概念——一个逻辑容器,每当商业票据发行或发生其他变化时,它都会更新。

 

逻辑表示

 

由于发行交易,新的票据可以添加到列表中,并且已经在列表中的票据可以通过购买或赎回交易更新。看看列表是如何使用描述性名称的:org.papernet.papers;使用这种DNS名称确实是个好主意,因为精心选择的名称会让区块链设计更直观。这一观点同样适用于聪明的合同名称。

 

物理表示

实际表示和逻辑表示不同,key是一个复合键

 

信任关系

我们已经讨论了网络中的不同角色(如发行者、交易商或评级机构)以及不同的商业利益集团如何决定谁需要签署交易。在Fabric中,这些规则由所谓的背书策略捕获。这些规则可以在链码粒度上设置,也可以针对各个状态键设置。

这意味着在PaperNet中,我们可以为整个名称空间设置一条规则,以确定哪些组织可以发布新票据。之后,可以为个别票据设置和更新规则,以获取购买和赎回交易的信任关系。

 

智能合约

智能契约定义业务对象的不同状态,并管理在这些不同状态之间移动对象的流程。智能契约非常重要,因为它们允许架构师和智能契约开发人员定义关键的业务流程和数据,这些流程和数据在区块链网络中协作的不同组织之间共享

在PaperNet网络中,智能合同由不同的网络参与者共享,如MagnetoCorp和DigiBank。连接到网络的所有应用程序必须使用相同版本的智能契约,以便它们共同实现相同的共享业务流程和数据。非常重要,后面部署合约的时候,MagnetoCorp和DigiBank使用相同的合约代码.

chaincode不在这里说明.

项目地址: https://github.com/NiuwenC/FabricSamplesProject/tree/master/commercial-paper/chaincode/javescript

 

应用

应用程序可以通过向分类账提交事务或查询分类账内容与区块链网络交互。本主题涵盖了应用程序如何做到这一点的机制;在我们的场景中,组织使用调用在商业票据智能契约中定义的发行、购买和赎回交易的应用程序访问PaperNet。尽管MagnetoCorp发行商业票据的申请是基本的,但它涵盖了所有需要理解的要点。

 

基本流程

应用程序使用Fabric SDK与区块链网络交互。下面是一个应用程序如何调用商业票据智能合同的简化图:

 

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

 

  1. 从钱包中选择一个身份
  2. 连接到网关
  3. 访问所需的网络
  4. 为智能契约构造一个事务请求
  5. 将事务提交到网络
  6. 处理响应

 

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

 

Wallet钱包


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

 

您可以在node SDK文档中阅读fabric-network类,但是现在,让我们看看如何使用它们将MagnetoCorp的应用程序连接到PaperNet。应用程序使用Fabric Wallet类如下:


const wallet = await Wallets.newFileSystemWallet('../identity/user/isabella/wallet');

 

 

查看wallet如何在本地文件系统中定位钱包。从钱包中检索到的身份显然是一个名为Isabella的用户,他正在使用发行应用程序。

钱包里有一组身份——X.509数字证书——可以用来访问PaperNet或任何其他PaperNet。如果您运行教程,并查看这个目录,您将看到Isabella的身份凭据。

 

想象一个钱包,里面装着相当于你的政府身份证、驾照或ATM卡的数字数字。其中的X.509数字证书将把持有者与一个组织联系起来从而赋予他们在网络通道中的权利。例如,Isabella可能是MagnetoCorp的管理员,这可能会赋予她比其他用户(比如DigiBank的Balaji)更多的特权。此外,智能契约可以在智能契约处理过程中使用事务上下文检索此身份。

 

Gateway 网关

第二个关键类是Fabric网关。最重要的是,网关标识了提供对网络访问的一个或多个对等点——在我们的例子中是PaperNet。看看issue.js如何连接到它的网关:


await gateway.connect(connectionProfile, connectionOptions);

connectionProfile:连接配置文件的文件系统位置,它将一组对等点标识为通往PaperNet的网关

connectionOptions:一组用于控制issue.js如何与PaperNet交互的选项.

了解客户端应用程序如何使用网关将自己与可能发生更改的网络拓扑隔离。网关使用连接配置文件和连接选项负责将事务建议发送到网络中正确的对等节点。

 

let connectionProfile = yaml.safeLoad(fs.readFileSync('../gateway/connection-org2.yaml', 'utf8'));

 

Network channel 网络通道

网关connectionProfile中定义的对等节点。yaml为issue.js提供了访问PaperNet的权限。因为这些对等点可以加入到多个网络通道中,网关实际上为应用程序提供了对多个网络通道的访问!

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

从这一点开始,网络将提供访问PaperNet。而且,如果应用程序同时要访问另一个网络BondNet,很容易:

 

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

我们可以在这里看到Hyperledger Fabric的一个强大功能——通过连接到多个网关对等点,应用程序可以参与到一个网络的所有网络中,每个网关对等点都连接到多个网络通道。根据网关.connect()中提供的钱包身份,应用程序将在不同的通道中拥有不同的权限

 

Construct request


 

const contract = await network.getContract('papercontract');

Submit transaction

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

 

Process response

let paper = CommercialPaper.fromBuffer(issueResponse);



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

console.log('Transaction complete.');

 

 

 

商业票据的介绍和流程到这里结束,具体的代码分析后面会进行.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章