状态演化的架构问题

时间:2018-09-06 18:45:33

标签: blockchain corda

我有一个示例贷款用例,其中有两个状态:

  • 发票状态和
  • 贷款国。

通过传递发票状态作为输入来创建贷款状态。

enter image description here

现在,因为Corda遵循UTXO模型,所以当我执行默认的保管库查询时,由于现在已使用它,因此不显示发票状态。

要解决此问题,有两种可能的方法:

  1. 要么,我查询所有状态,即已消耗和未消耗。
  2. 或者,我 可以将状态维持在“发票状态”,并将状态标记为 像发票一样,在消费完它以创建贷款状态后就会付款(因此,它更像是不断演变的状态,就像比特币一样,总会转移余额。)。 像这样:

enter image description here

任何人都可以建议正确的架构决定吗?

3 个答案:

答案 0 :(得分:2)

我同意bartman250。在我看来,第二个示例最有意义,因为它以更明显的方式使选项保持打开状态。

例如,由于某种原因,由于信用卡上有退款,将发票重置为未付款,因此将发票作为未消费品行之有效。

可以通过确保贷款合同仅使用标记为未付款的发票来解决担心再次使用该问题。我们在here的信用证演示中对采购订单进行了类似的操作。

具有可从金库查询为未消费的发票也是默认查询模式。它还提供了确保默认情况下处理最新状态信息的优势。

答案 1 :(得分:2)

您的发票应具有“状态”字段,且枚举至少应为“ UNPAID”和“ PAID” 您的“ payInvoice”命令应具有以下输入和输出: 输入:     发票-状态=未付款 输出    发票-状态=已付款    贷款

验证功能应检查此命令的输入和输出是否如上。 之后,“ UNPAID”发票状态将被使用并且无法再次使用。 我希望这是有道理的。

在以下代码中检出“ MeteringInvoiceCommands.Pay”方法。这类似于您所需要的,但是在这种情况下,它将检查是否产生了付款,以及输入状态为“已发出”和输出状态为“已付款”

https://gitlab.com/cordite/cordite/blob/master/cordapps/metering-contracts-states/src/main/kotlin/io/cordite/metering/contract/MeteringInvoiceContract.kt

答案 2 :(得分:1)

在我看来,上面的第二个例子是最好的。 基本上,如果您在发票上持有带有所有不同状态的枚举-即UNPAID,PAID,REJECTED等,则可以在流程中扩展此状态。 然后,您可以将合同验证功能用于“已付款”命令,以检查是否已创建贷款状态。