corda - Corda:Corda 在隐式升级状态上的行为
问题描述
Corda 是否强制不降级隐式升级状态?
https://github.com/corda/corda/pull/4741/commits - 这删除了降级规则执行 - 我想知道为什么要删除它吗?
解决方案
您可以将状态降级为旧版本的合同,是的。
我们在 Corda 4 中做了一些尝试来解决这个问题,但不得不放弃。这就是为什么 C4 花费的时间比我们希望的要长的原因之一。
该问题与滚动升级有关。在应用程序的滚动升级过程中,一些节点将使用旧版本的应用程序,而一些节点将使用新版本。当升级的流程从 Vault 中获取 V1 状态时,它可能会填写一个新字段或执行一些不同的操作来生成 V2 状态。创建 V2 状态的交易将使用 V2 智能合约并被发送到仍在 V1 上的节点。现在这没问题,因为新的智能合约逻辑将附加到交易中,通过 p2p 网络发送到对等方,如果它被列入白名单(或将来在沙箱内运行),则执行。但这仅适用于合约逻辑,而不是允许做更多事情的流程。因此,旧节点将从保管库中获取 V2 状态,
这意味着在一个应用程序的V1和V2同时上线的升级期间,数据可能会反复升级和降级,直到升级完成。这是在可以在不同时间升级的不同方之间传递数据位的性质所固有的。因此,我们无法保护用户免于降级,因为我们不知道何时认为升级已完成。
将来我们可能会再次尝试解决这个问题。目前,可以通过使用哨兵字段在应用程序级别实施降级保护。
推荐阅读
- r - 逐行合并多个矩阵并将其存储在一个新矩阵中
- c# - 使用 jQuery.timepicker 仅在 ASP.NET MVC 中节省时间
- javascript - PHP从div中获取p元素
- javascript - 更改悬停时的图像会更改整行的图像
- node.js - 在最后一行之前添加值行并保留最后一行格式
- go - How to index entire GOPATH for existing project in Goland?
- javascript - amCharts 不显示 json 数据
- http - Indy 10 HTTPS 代理
- sql - PIVOT 多列不考虑聚合结果
- command-line - 由于权限更改导致的总线错误(核心转储)