Corda:在单个事务中更新和使用 ContractState
Corda: Update and consume ContractState in a single transaction
问题
考虑 Corda 中的以下设计问题。假设我有一个 ContractState
,比如 Order
,它带有一个明确的状态,例如它是 ALIVE
或 CANCELED
。后一种状态与 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---> 没有输出。
问题
考虑 Corda 中的以下设计问题。假设我有一个 ContractState
,比如 Order
,它带有一个明确的状态,例如它是 ALIVE
或 CANCELED
。后一种状态与 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---> 没有输出。