Corda:在单个事务中更新和使用 ContractState

Corda: Update and consume ContractState in a single transaction

问题

考虑 Corda 中的以下设计问题。假设我有一个 ContractState,比如 Order,它带有一个明确的状态,例如它是 ALIVECANCELED。后一种状态与 finished 订单有关。我想要一个交易,它接受一个 ALIVE 输入状态 Order 并使用它 ,同时将其状态更改为 CANCELED。我可以用原子转换来完成这个任务吗?也就是说,是否可以记录一个状态被消耗的原因?

  • 任何时候将状态添加为交易的输入,都被视为已消耗。
  • 假设 Order 有 3 个属性:Order(linearId, status, reason).
  • 为了模仿 Corda 中的更新,您的交易将把要更新的状态作为输入;并生成一个具有相同 linearId 但其余属性具有不同值的新状态。这样,您库中具有相同 linearId 的所有状态都被视为同一状态的不同版本,只有一个 UNCONSUMED 版本;这是最新版本。
  • Order(123, ALIVE, null) ---更新 Tx---> Order(123, CANCELED, "No longer needed").
  • 如果状态为“已取消”,您也可以考虑不创建输出;您只是使用它而不创建输出;意味着它不再存在于账本上并且 Corda 不跟踪它:Order(123, ALIVE, null) ---取消 Tx---> 没有输出。