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

阅读英文版

appdevmodulesm2-migration-checklist

迁移清单

以太坊开发者迁移到 Canton 的实用清单

规划与执行迁移时,按下列章节逐项核对。

开始前

* [ ] **状态模型依赖**:是否依赖全局状态查询? * [ ] **多方关系**:合约中有哪些 Party? * [ ] **隐私需求**:是否需要子交易级隐私? * [ ] **集成点**:哪些系统连接智能合约?
若严重依赖「展示所有 NFT」类全局查询,需用 Party 作用域查询或链下索引重新设计。
| 领域 | 以太坊假设 | Canton 现实 | | ------------- | -------------------- | ---------------------------- | | 状态 | 全局可查询 | 分布式、按 Party 作用域 | | 合约 | 可变 | 不可变(归档 + 创建) | | 授权 | 运行时 `msg.sender` | 编译期 signatory | | 隐私 | 默认公开 | 默认私有 | | 身份 | 匿名地址 | 具名 Party | * [ ] 安装 [Daml SDK](https://docs.canton.network/sdks-tools/sdks/daml-sdk) * [ ] VS Code + [Daml 扩展](https://marketplace.visualstudio.com/items?itemName=DigitalAssetHoldingsLLC.daml) * [ ] 克隆 [CN Quickstart](/zh/docs/canton/appdev-quickstart-index) * [ ] 运行 `make setup && make build && make start` 验证环境

智能合约迁移

阶段 1:建模 Party

列出与合约交互的各方并映射为 Canton Party:
* **合约所有者** → `admin : Party`(管理类合约的 signatory)
* **用户** → `user : Party`(每用户独立 Party)
* **运营方** → `operator : Party`(可为 signatory 或 controller)
对每个合约确定:
* **谁必须同意创建?** → Signatories
* **谁应可见?** → Observers
* **谁能执行动作?** → Controllers(按 Choice)
* **用户 Party**:常在应用提供方验证者 * **管理 Party**:在本组织验证者 * **外部 Party**:在其自有验证者

阶段 2:翻译合约

将 Solidity struct → Daml data type;mapping → 每持仓一份合约;函数 → Choice;onlyOwnercontroller admin(协议强制,无需 modifier)。

阶段 3:不同方式处理状态

  • 替换全局查询:设计 Party 作用域查询
  • 使用 contract keys:用 key 查找而非地址
  • 接受 Contract ID 变化:每次更新 ID 会变;用 key 作稳定引用
Canton 没有跨所有合约的 `eth_getLogs` 式事件过滤。尽早规划索引策略。

集成迁移

API 变更

以太坊Canton说明
JSON-RPCLedger API (gRPC 或 JSON API)不同协议
Web3.js / ethers.jsLedger API 客户端或 dApp SDK语言相关客户端
Event logsTransaction streams订阅 Party 交易
eth_callExercise non-consuming choice只读操作

认证变更

以太坊用私钥签名并从 msg.sender 派生身份;Canton 用 Party 认证与 JWT。公开函数「任何人可调用」在 Canton 中变为仅已认证 Party 可访问。

索引策略

无全局状态查询时:

  • 使用 PQS 做 SQL 查询
  • 流式交易 写入自有数据库
  • 合约设计 便于查询的 key

测试迁移

  • Hardhat/Foundry → Daml Script
  • 测试授权规则与多方 propose-accept

集成测试

  • 对 LocalNet 测试(CN Quickstart)
  • 验证 API 集成与错误/回滚场景

部署迁移

网络:LocalNet → DevNet → TestNet → MainNet

  • dpm build 打包 Daml
  • 经 admin/LAPI 上传到验证者
  • 分配 Party、初始化合约、配置应用指向 Ledger API

运维变更

监控:区块浏览器 → 验证者日志与指标;gas → traffic 单位。密钥:EOA → Party 密钥(验证者或外部);多签 → 多 signatory 合约。

常见迁移陷阱

陷阱原因避免
构建全局状态视图习惯以太坊查询从一开始就按 Party 作用域设计
过度使用 Party把 Party 当免费地址Party 有托管成本,审慎设计
忽略 propose-accept期望单方面创建多方合约多方需工作流
期望 event logs以太坊事件模式用交易流与索引
把 Contract ID 当地址ID 每次更新都变用 contract keys

迁移阶段

阶段重点完成标准
1. 学习理解 Canton 模型团队掌握 Daml 基础
2. 设计为 Canton 重设计Party 模型与合约设计完成
3. 开发Daml 实现合约与测试完成
4. 集成连接应用LocalNet API 可用
5. 测试测试网验证DevNet/TestNet 通过
6. 部署上线MainNet 运行

下一步

开始用 Daml 构建。 动手跑通示例。

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