Crda合同并声明升级问题

时间:2019-10-21 13:23:31

标签: corda

我正在阅读本文档,但有一些不确定性。

执行显式合同和状态升级

  1. 保留现有的状态和合同定义
  2. 编写新的状态和合同定义
  3. 创建新的CorDapp JAR
  4. 分发新的CorDapp JAR
  5. 停止节点
  6. 重新运行网络引导程序(仅当您要将白名单 新合同)
  7. 重新启动节点
  8. 授权升级
  9. 执行升级
  10. 将新的升级状态从迁移到签名约束  区域约束

问题:

1。保留现有的状态和合同定义 2。编写新的状态和合同定义 3。创建新的CorDapp JAR

我该怎么做?是仅保留带有节点上的协定和状态的jar,而不是将其保留在源代码中?如果我不将其保留在源代码中,那么如何创建升级方法?

interface UpgradedContract<in OldState : ContractState, out NewState : ContractState> : Contract {
    val legacyContract: ContractClassName
    fun upgrade(state: OldState): NewState
}

如果我不保留源代码中的旧状态,那么应该在每次需要升级时以不同的方式命名jar吗? 升级完成后,可以从节点中撤出旧的jar吗?

6。重新运行网络引导程序(仅当您要将白名单     新合同) 8。授权升级 我对吗,只有这两个步骤与显式联系人升级有关?而且,如果我使用带签名的隐式流程,那么我只需要跳过这两个步骤,而其他步骤仍然适用并且必须执行?

9。执行升级 是否应该由州所有者分别为每个州完成此操作?在那种情况下,我是否应该在每个节点上针对特定的contrcat运行该节点,而该节点是该状态的参与者? (在doc中提到它是在单个节点上运行-但是id = f单个节点不是某个状态的参与者)

其他问题

本节描述了明确的合同和状态更新。 https://docs.corda.net/upgrading-cordapps.html#performing-explicit-contract-and-state-upgrades,而签名约束部分(https://docs.corda.net/api-contract-constraints.html#signature-constraints)没有描述状态的更新过程。 它与显式升级是否一样,只是步骤6,8有所不同,还是有些完全不同? 在这种情况下,我是否需要创建将旧状态转换为新状态的功能?如果不是,那么新流程将如何处理旧状态?

2 个答案:

答案 0 :(得分:1)

我看到您对合同升级有很多很大的疑问。这是由我们的开发关系工程师之一撰写的文章。 https://medium.com/corda/contract-upgrades-and-constraints-in-corda-425055a9a47f 随时跟进您的其他问题。

如果您不熟悉Corda,请随时加入Corda社区频道@ http://slack.corda.net/

答案 1 :(得分:1)

  1. 在执行旧版合同升级时,您需要在节点上安装新旧合同罐。 (位于cordapps文件夹中)。 您可以创建一个名为v2-contract的新Gradle模块,并在其中编写新合同。您将在此处编写UpgradedContract。您将需要参考旧的v1-conract jar以及它需要知道旧状态是什么。为此,在v2合同中添加gradle依赖项,如下所示。

    依赖性{

    // Corda dependencies.
    cordapp project(v1_contract)
    

    }

    所有状态都升级到新的v2合同后,可以从cordapps文件夹中删除旧的jar。

  2. a。对于HashConstraints,不需要再次运行引导程序。您将通过实现UpgradedContractWithLegacyConstraint来编写新合同,运行jar任务以构建此新jar,将其添加到cordapps文件夹,从所有节点运行Authorize Flow,从一个节点的终端运行Initiate流。这是升级的明确方法。

b。但是,如果您使用的是Whitelistzoneconstraint,则要确保将新的v2合约jar的哈希添加到网络参数中的白名单参数中。您将需要运行网络引导程序以将该新的v2合同jar哈希列入白名单。 https://docs.corda.net/network-bootstrapper.html#whitelisting-contracts。 完成后,您可以通过实施UpgradedContract进行显式升级,也可以使用隐式升级。

c。如果使用的是签名约束,则无需为新的jar运行网络Bootstrapper,编写新的v2-contract,使用gradle jar任务进行构建,用新的jar替换旧的jar。这是隐式的升级方式。

  1. 您应该只为所有参与者运行“授权流程”。

其他问题 签名约束没有显式升级。您需要确保以向后兼容的方式编写状态,构建新的jar,用新的jar替换旧的jar。然后各州将参考新合同。

希望有帮助。随时在以上答案中发布更多问题,或在Slack上ping通。