应用程序开发 - 分析
让我们更详细地分析商业票据。诸如 MagnetoCorp 和 DigiBank 之类的 PaperNet 参与者使用商业票据交易来实现其业务目标 – 让我们研究一下商业票据的结构以及随着时间的推移会影响商业票据的交易。我们还将基于网络中各组织之间的信任关系,考虑 PaperNet 中的哪些组织需要在交易上签名。稍后,我们将集中讨论买卖双方之间的资金流动方式。现在,让我们集中讨论 MagnetoCorp 发行的第一份票据。
1. 商业票据生命周期
MagnetoCorp 在 5 月 31 日发布了票据 00001。花一些时间看一下本所的初始状态,其不同的性质和值:
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 – 由 Issuer 和 Paper 属性组成。最后,了解 "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
最重要的变化是 Owner
的变化 – 看看 MagnetoCorp 最初拥有的票据现在如何由 DigiBank 拥有。我们可以想象一下,随后如何将票据出售给 BrokerHouse 或 HedgeMatic,并将相应的更改赋值给 Owner。请注意,Current state
如何使我们能够轻松地识别出该票据正在交易中。
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
最后的赎回交易已经结束了商业票据的生命周期 - 可以视为已完成。保留赎回商业票据的记录通常是强制性的,并且赎回状态使我们能够快速识别这些票据。通过将所有者与交易创建者的身份进行比较,可以将票据所有者的值用于对赎回交易执行访问控制。Fabric 通过 getCreator() 链码 API 对此提供了支持。如果将 golang 用作链码语言,则可以使用 客户端身份链码库 来检索交易创建者的其他属性。
2. 交易
我们已经看到,票据 00001 的生命周期相对简单 - 作为发行,购买或赎回交易的结果,它在已发行,交易和赎回之间移动。
这三笔交易是由 MagnetoCorp 和 DigiBank 发起的 (两次),并推动了票据 00001 的状态变化。让我们更详细地了解影响票据的交易:
2.1 交易
检查由 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
了解发行交易如何具有带有属性和值的结构。该交易结构与票据 00001 的结构不同,但紧密匹配。这是因为它们是不同的东西 – 票据 00001 反映了由于发行交易而产生的 PaperNet 状态。拥有这些属性并创建此票据的发行交易(我们看不到)背后的逻辑。由于交易是通过票据进行的,因此这意味着这些结构之间存在非常密切的关系。
涉及发行交易的唯一组织是 MagnetoCorp。自然,MagnetoCorp 需要签署该交易。通常,票据发行人需要在发行新票据的交易上签名。
2.2 购买
接下来,检查将票据 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
看看购买交易如何具有较少的属性,这最终在此票据中得出。那是因为这项交易只会修改票据。唯一的 Neww owner = DigiBank
因此次交易而发生变化;其他一切都一样。没关系 – 关于购买交易,最重要的是所有权的变更,实际上,在此交易中,已经确认了票据的当前所有者 MagnetoCorp。
你可能会问,为什么没有在票据 00001 中记录 "Purchase time" 和 "Price" 属性?这又回到了交易与票据之间的区别。494 万美元的价格标签实际上是交易的财产,而不是票据的财产。花一点时间思考这种差异;它并不像看起来那样明显。稍后我们将看到帐将本记录这两条信息 - 影响票据的所有交易的历史记录及其最新状态。明确区分信息非常重要。
还需要记住的是,票据 00001 可能会被多次买卖。尽管我们在方案中略有提前,但让我们来看看如果票据 00001 更改所有权时我们可能会看到哪些交易。
如果我们有 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 商业票据价格可能下跌的原因吗?
直觉上,购买交易要求卖方和购买组织都必须签署此类交易,以便有证据证明作为交易一部分的双方之间的相互协议。
2.3 赎回
票据 00001 的兑换交易表示其生命周期的结束。在我们相对简单的示例中,HedgeMatic 发起了交易,该交易将商业票据转移回了 MagnetoCorp:
Txn = redeem
Issuer = MagnetoCorp
Paper = 00001
Current owner = HedgeMatic
Redeem time = 30 Nov 2020 12:00:00 EST
同样,请注意赎回交易的属性很少。赎回交易逻辑可以对票据 00001 进行所有更改来计算数据:发行者将成为新所有者,而当前状态将变为赎回。在我们的示例中指定了 "Current owner" 属性,以便可以根据纸张的当前所有者检查该属性。
从信任的角度来看,购买交易的相同理由也适用于赎回指令:交易中涉及的两个组织都必须在该交易上签字。
帐本
在本主题中,我们了解了交易和产生的票据状态是 PaperNet 中两个最重要的概念。实际上,我们将在任何 Hyperledger Fabric 分布式 帐本 中看到这两个基本元素 - 一个世界状态,其中包含所有对象的当前值;一个区块链,它记录了导致当前世界状态的所有交易的历史记录。
交易所需的签字通过规则强制执行,在将交易添加到帐本之前对其进行评估。仅当存在必需的签名时,Fabric 才会接受有效的交易。
你现在处于一个绝佳的位置,可以将这些想法转化为智能合约。如果你的程序设计有些生锈,请不要担心,我们将提供技巧和指导来理解程序代码。掌握商业票据智能合约是设计你自己的应用程序的第一步。或者,如果你是对一些编程感到满意的业务分析师,请不要害怕继续深入研究!
Reference
- Docs » Developing Applications » Analysis, https://hyperledger-fabric.readthedocs.io/en/release-1.4/developapps/analysis.html
- Docs » Key Concepts » Ledger, https://hyperledger-fabric.readthedocs.io/en/release-1.4/ledger/ledger.html
项目源代码
项目源代码会逐步上传到 Github,地址为 https://github.com/windstamp。
Contributor
- Windstamp, https://github.com/windstamp
有疑问加站长微信联系(非本文作者)