Corda 我可以在事务中引用未提交的输入状态吗

Corda 我可以在事务中引用未提交的输入状态吗,corda,Corda,创建新事务时,我是否可以引用未提交的状态作为输入状态 例如。 将颜色属性设置为“蓝色”的新绘制状态发布到分类账。 在所有各方签署之前(因此绘制状态保持未提交状态),我发布一个新事务,将未提交状态作为输入,将新绘制状态作为输出(将绘制颜色属性设置为“红色”)。在事务中使用StateRefs引用输入,其定义如下: data class StateRef(val txhash: SecureHash, val index: Int) 其中: txhash是创建输入状态的事务的哈希 index是创建

创建新事务时,我是否可以引用未提交的状态作为输入状态

例如。 将颜色属性设置为“蓝色”的新绘制状态发布到分类账。
在所有各方签署之前(因此绘制状态保持未提交状态),我发布一个新事务,将未提交状态作为输入,将新绘制状态作为输出(将绘制颜色属性设置为“红色”)。

在事务中使用
StateRef
s引用输入,其定义如下:

data class StateRef(val txhash: SecureHash, val index: Int)
其中:

  • txhash
    是创建输入状态的事务的哈希
  • index
    是创建输入状态的事务输出中输入状态的索引
如果要在提交第一个事务之前创建使用输入状态的第二个事务,可以按以下步骤进行:

data class StateRef(val txhash: SecureHash, val index: Int)
  • 完全构建第一个事务
  • 基于第一个事务的ID手动构造一个
    StateRef
  • 将此
    StateRef
    作为输入传递给第二个事务
您甚至可以用这种方式构建整个事务链

但是…

在提交第一个事务之前,在处理第二个事务时会看到奇怪的行为。例如:

  • 如果您尝试验证第二个事务,您的节点将尝试使用节点的vault将所有输入的状态转换为实际状态。这将失败,因为您尚未存储第一个事务
  • 如果您将第二笔交易发送给交易对手,而他们试图解析其依赖关系图,则您的节点将尝试从其交易存储中检索第一笔交易并将其发送过来。同样,这将失败,因为您尚未存储第一个事务

因此,如果以这种方式构建事务链而不在创建时提交每个状态,则必须非常小心以后提交事务的顺序,以及在此期间对第二、第三个等事务执行的操作。

谢谢Joel。我有点困惑,因为我在Slack上问了同样的问题,并从一位R3代表那里得到了以下答案:“没有什么能阻止你这么做,但请记住,这些交易在签名和公证之前都不会在分类账上。只有当你创建的链中的所有交易都收集了所有签名时(验证合同逻辑),并已成功公证,它们是否被计入分类账,是否可以花在不信任您的当事人身上。”我问这个问题的原因是为了确定从记录系统中与Corda的集成有多复杂。好的,我明白了困惑所在:)很快更新我的回答。感谢Joel的详细解释。因此,简而言之,如果输出状态未提交到分类账,则使用(先前事务的)输出状态的后续事务将失败。尽管与DLT复合体集成是有意义的,因为记录系统可能允许多次更改状态(如采购订单),而不管这些状态是否已在DLT上提交。公司通常如何处理这一问题(即,在DLT顶部的一个队列,用于检查在发布之前是否已经使用了以前的(线性)状态)?