Corda:合同附件如何在交易中转移?

时间:2019-06-12 09:55:19

标签: corda

Using Attachments页面状态:

  

附件是通过哈希从交易中引用的ZIP / JAR文件,   但不包含在交易本身中。

但是,API: Contract Constraints page指出:

  

包含状态和合同类的JAR,以及可选的   依赖项,都与交易相关。

有一个代码片段显示了如何添加合同约束:

transaction.addOutputState(state, constraint = HashAttachmentConstraint(serviceHub.cordappProvider.getContractAttachmentID(CONTRACT_ID)!!))

但是,在签出 HashAttachment 代码时,我看不到它包含Contract Jar文件的内部内容。

我的假设是我们不会随交易转移合约罐。发生的情况可以描述:

  1. 在节点启动期间,Corda会扫描所有CorDapp,并将包含Contract类的jar加载到本地附件存储中。
  2. 交易中的每个输出状态可以具有合同约束。
  3. 在验证阶段,将调用verifyConstraints(contractAttachmentsByContract),并针对Node在其本地存储中具有的附件验证这些约束(例如HashAttachmentConstraint)。

问题:

  1. 交易是否包括合同附件?
  2. 合同附件将通过网络传输,还是将使用本地附件存储中的附件进行验证?
  3. 我在假设中缺少什么?

1 个答案:

答案 0 :(得分:4)

您是正确的,附件不会在事务内转移。事务仅包含对附件的哈希引用,以用于数据引用。这也意味着,由于附件在自己的数据库表中脱链维护,因此可以在许多事务中重复使用附件。

当节点收到包含附件的交易时,Corda会自动从交易对手获取附件之前未曾见过它:https://docs.corda.net/tutorial-attachments.html#protocol

  

通常,交易附件通过ReceiveTransactionFlow自动获取。

只要附件的大小小于网络参数https://docs.corda.net/network-map.html#network-parameters

的maxTransactionSize,就可以进行这种传输而无需任何开发工作
  

maxTransactionSize:事务的最大允许大小(以字节为单位)。这是事务对象及其附件的大小。

此时,合同附件通常由Cordapp开发人员预先分发和签名,并由Corda节点的所有者部署。目前,通常还没有以编程方式安装Cordapps。