完整文档页面(中文翻译)。文末附有来源说明。

阅读英文版

appdevmodulesm6-overview

智能合约升级概览

为什么智能合约升级很重要,以及 Canton 的升级模型如何工作

Canton 应用会不断演进:模板增加字段、Choice 行为变化、全新工作流上线。智能合约升级(Smart Contract Upgrade,SCU)让你在不破坏既有合约、也不强迫所有组织同时停机的前提下完成这些变更。注意:SCU 有必须遵守的规则。

为什么 Canton 上的升级与众不同

在传统数据库里,你运行迁移脚本即可改 schema。在 Canton 上,合约不可变,并分布在多个组织的验证者节点上。修改模板结构意味着:所有托管相关 Party 的验证者都必须知晓这次变更。

难点在于:你无法强迫所有组织同时升级。SCU 的解法是:允许多个包版本在账本上共存,并在受控规则下跨版本交互。

升级模型

推荐做法结合异步 rollout同步切换

异步 rollout:

  1. 应用提供方实现并测试 v2 组件。
  2. 应用提供方将 v2 组件提供给应用用户。
  3. 提供方与用户异步升级后端、前端,审计升级后的 DAR 包,然后 vet 这些包。

前后端应同时支持 v1 与 v2 工作流,使各方可按自己的节奏部署。在所有人切到 v2 之前,混合版本部署是常态。

同步切换:

  1. 应用提供方公布目标日期,要求用户完成升级并下线 v1。
  2. 临近升级日,提供方与用户协调,将 v2 包(DAR)上传到各自验证者。
  3. 在约定时刻,各方一起 vet 新上传的包,使新版本生效。

包版本

每个 Daml 包在 daml.yaml 中有名称与版本。上传新版本(同名、更高版本号)后,两个版本会同时在账本上存在。既有合约仍关联创建它的版本,但在 SCU 兼容规则下,账本可用新版本代码解析旧合约。

多版本共存是零停机升级的基础:新版本生效前,不必先迁移旧合约——在兼容允许时,旧合约可通过新版本代码读取与执行。

何时用升级 vs 新模板

并非每次改动都要走升级机制:

适合 SCU:

  • 给现有模板增加可选字段
  • 给现有模板增加新 Choice
  • 需要旧合约在新代码下继续工作且不想迁移
  • 需要零停机部署

适合新模板:

  • 变更根本不相容(删字段、改类型等)
  • 新工作流与旧逻辑本质不同
  • 希望新旧行为清晰隔离

关键挑战

  • 异步 rollout — 提供方与用户往往无法同时升级,必须支持独立部署节奏。
  • 混合版本部署 — 异步 rollout 期间,跨组织可能同时存在 v1/v2;前后端需兼容两套 DAR 工作流。
  • 零停机升级 — 部分工作流需 7×24 不间断;SCU 与异步 rollout 使升级过程中工作流可继续。

本模块结构

本模块按步骤讲解升级流程,包括:兼容性规则、编写第一个升级、包选择、测试升级、部署升级等主题(详见官方对应章节)。


本文由 CC Privacy Club 根据 Canton Network 官方文档(CC-BY-4.0)整理翻译,仅供学习;实现细节以官方最新版本为准。