Canton 网络介绍
Rocky 在 Canton Network MainNet 上完成链上结算:客户账户之间的现货成交以 DvP 方式在双方钱包之间原子交割,每个订单事件与每笔成交(含自营)按 epoch 承诺到账本,永续合约成交批量锚定上链,充值、提现与偿付能力证明都能在账本上核验。本文介绍 Canton 的核心概念,以及 Rocky 当前在其中的角色。
一、什么是 Canton Network
Canton Network 是一个面向受监管金融机构的隐私优先公链网络,由 Digital Asset 主导设计,使用 Daml 智能合约语言。
与以太坊等"全局共享账本"不同,Canton 的核心特点是:
| 维度 | 以太坊 / Solana | Canton Network |
|---|---|---|
| 数据可见性 | 所有数据公开 | 每个合约只对相关方可见(默认隐私) |
| 状态同步 | 全网共识同一份账本 | 多个 Synchronizer(同步域)各自仲裁,互操作时跨域结算 |
| 智能合约模型 | EVM 账户模型 | Daml 合约模型(多方签名 + 显式 stakeholder) |
| 监管友好性 | 完全公开难合规 | 内建隐私+可审计,金融机构友好 |
Canton 适合以下场景:
- 受监管资产的代币化(股票、债券、 基金、稳定币)
- B2B 链上结算(清算所、托管行、做市商之间)
- 需要可证明结算 + 数据隔离的应用(如 Rocky 这种交易所)
二、核心概念 (Core Concepts)
2.1 Party(参与方)
Canton 中最基本的身份单元。一个 Party 可以是个人用户、机构、应用、托管者等。Party 有一个唯一标识符:
alice::1220ca15423a1b049bf8e84132360f246057aa18f5e9e36a77db535b75bd287cceff
^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
party hint participant fingerprint suffix
- Party hint:人类可读前缀,由创建该 party 的应用或钱包指定
- Suffix:托管该 party 的 Participant 节点的密 钥指纹,不同钱包 / validator 的指纹不同
Rocky 不为用户分配 party。 用户使用自己已经控制的 Canton 钱包 party 登录:先调用 POST /v1/wallet/challenge 拿到一条挑战消息,用钱包私钥签名后提交 POST /v1/wallet/verify,Rocky 校验签名并把该 party 绑定到交易账户。当前支持的钱包 provider 可通过 GET /v1/wallet/providers 查询(Rocky Wallet、Console、Loop、Send)。
2.2 Contract(合约)
Daml 合约是一个带有 stakeholder 列表的数据结构。每个合约必须明确声明:
- Signatory(签署方):必须对合约创建和归档共识的 party
- Observer(观察方):可以读取但不能修改的 party
- Controller(控制方):可以行使 choice / action 的 party
下面是 Rocky 实际部署的 DepositIntent 模板(daml/perp-custody),用户声明充值意向,交易所行使 Accept 入账:
template DepositIntent
with
exchange : Party -- observer: Rocky 交易所 party
user_handle : Party -- signatory: 用户 party
user_id_hex : Text
asset : Text
amount : Decimal
chain_tx_id : Text
created_at : Time
where
signatory user_handle
observer exchange
ensure amount > 0.0
choice Accept : ContractId PlatformAccount
with
platform_account_cid : ContractId PlatformAccount
controller exchange
do
exercise platform_account_cid Credit with
delta = amount
chain_tx_id = chain_tx_id
Rocky 当前部署的 Daml 模板:ExchangeAuthority、PlatformAccount、FeeCollectorAccount、PerpTradeCustody、DepositIntent、WithdrawalReceipt、RockyEpochCommitment。现货 DvP 结算和 CC 转账不使用私有模板,而是走 Canton Token Standard 的公共接口。
关键性质:合约只对其 stakeholder 可见。同一 Synchronizer 上的其他 party 不会看到这份合约。这就是 Canton 的"默认隐私"。
2.3 Synchronizer(同步域)
类似以太坊的"区块链"概念,但多个 Synchronizer 可以共存。每个 Synchronizer:
- 对其内部的合约状态变更进行排序与共识
- 由一组 Sequencer + Mediator 节点运行(可能是单独运营商,也可能是去中心化的)
- 通过 Canton Network Protocol 与其他 Synchronizer 互操作
Rocky 接入的是 Canton MainNet 上的 Global Synchronizer(global-domain::1220b1431ef2…,由 Splice DSO 运营)。
2.4 Participant Node(参与方节点)
Party 不能直接"在链上"。Party 必须由某个 Participant 节点托管,Participant 是真正与 Synchronizer 通信的角色。
Rocky 后端 (canton-bridge) 用户钱包 (Console / Loop / Send …)
↓ JSON Ledger API v2 ↓
Rocky Validator ←→ Global Synchronizer ←→ 钱包所属 Validator
↓ ↓
Party: Rocky 交易所 Party: 用户
Rocky 运营自己的 Validator(api.validator.rocky.exchange),托管交易所 party 及配套的 operator / shadow party。用户 party 由其钱包所在的 validator 托管,不在 Rocky 的节点上;选择 Rocky Wallet 的用户使用的是 Rocky validator 自带的 Splice 钱包。
2.5 Validator
Validator 是 Splice 项目提供的标准化 participant 部署模板:Participant + 钱包应用 + OAuth 接入。
Rocky 后端与 Validator 的交互方式:
- 通过 JSON Ledger API v2 提交 Daml 命令、订阅更新流
- 通过 Validator API 读取 Holding / 余额等钱包视图
- 使用 Auth0 机器对机器(M2M)token 认证后端服务;Auth0 不参与用户登录,用户身份来自 §2.1 的钱包签名绑定
三、Canton 的隐私模型 (Privacy Model)
Canton 的隐私保护体现在三个层级:
- 合约级:每个合约的载荷只对 signatory + observer 可见
- Participant 级:Participant 只接收它托管 party 相关的合约(不存储与它无关的数据)
- Synchronizer 级:Synchronizer 只看到加密的 commitment(用于排序),看不到合约内容
以 Rocky 实际写入链上的合约为例:
PerpTradeCustody(永续成交批次)— signatory: Rocky 交易所 — 只有 Rocky 可见DepositIntent(充值意向)— signatory: 用户,observer: Rocky 交易所 — 只有用户和 Rocky 可见WithdrawalReceipt(提现凭证)— signatory: Rocky 交易所,observer: 用户 — 只有 Rocky 和用户可见- 现货 DvP 成交 — 两笔 Token Standard 转账在同一笔 Canton 事务中原子完成 — 只有成交双方的 party 可见(用户钱包之间,或用户钱包与 Rocky 托管 party 之间)
其他用户、其他 validator、Synchronizer 节点都无法看到这些数据。但 Synchronizer 仍然为这些合约的状态变更提供排序保证 + 防止重复花费。
四、Rocky 在 Canton 中的角色
4.1 Party 角色划分
| Party | 配置项 | 职责 |
|---|---|---|
| Rocky 交易所 | EXCHANGE_PARTY_ID | 平台 party,PerpTradeCustody、WithdrawalReceipt、PlatformAccount 的 signatory;私钥由 KMS 托管 |
| Rocky operator | EXCHANGE_OPERATOR_PARTY_ID | Token Standard 转账 / 授权流程中的 operator party |
| Shadow user | SHADOW_USER_PARTY_ID | Rocky 控制的占位 party,用于不需要用户自有 party 的链上记录 |
| DSO | DSO_PARTY_ID | Global Synchronizer 的去中心化运营方(Splice DSO),第三方 |
| 用户 | 由钱包持有 | 用户自己的 party,通过 /v1/wallet/verify 绑定,Rocky 不持有其私钥 |
4.2 链上数据 vs 链下数据
并非所有交易动作都上链。Rocky 的设计是链下撮合 + 链上结算关键事件:
| 数据 | 存储位置 | 说明 |
|---|---|---|
| 订单簿、撮合状态 | rocky-backend (Postgres) | 高频,链上不可行 |
| 用户交易账户余额 | rocky-backend ledger.accounts | 高频更新 |
| 客户账户之间的现货成交 | Canton 链上,Token Standard DvP | spot-chain-settler 逐笔结算,每笔成交返回 cantonUpdateId,见 链上结算 |
| 事件日志:每笔下单、撤单与成交(含自营) | Canton 链上,RockyEpochCommitment | 每 60 秒一个 epoch 一份合约:日志的 Merkle 根加当期成交记录;包含证明见 GET /v1/chain/proof,见 Epoch 承诺 |
| 永续成交批次 | Canton 链上,PerpTradeCustody | settlement-batcher 每 5 秒或每 10 笔打包,经 canton-bridge 提交 |
| 充值 / 提现 | Canton 链上,Token Standard 转账 + DepositIntent / WithdrawalReceipt | 见 CC 充值流程 |
| 偿付能力证明 | 每日账本快照 + Merkle Sum Tree 承诺 | 见 偿付能力证明 |
| 用户身份(Party) | 用户钱包所在的 Participant | 跨应用复用 |
4.3 用户视角的链上交互
用户在 Rocky 上会接触到的 Canton 环节:
- 登录:用钱包签名挑战消息,绑定 party(
/v1/wallet/challenge→/v1/wallet/verify) - 充值:从自己的钱包向 Rocky 交易所 party 发起 Token Standard 转账,后端观察到后入账
- 现货交易:涉及你账户的成交在链上完成 DvP(
GET /api/v3/myTrades返回的cantonUpdateId可在账本上核验),并且每笔订单与成交还会在下一个 epoch 里被承诺上链(GET /v1/chain/proof) - 提现:Rocky 从交易所 party 向用户 party 转账,并写入
WithdrawalReceipt - 审计:通过偿付能力证明核验自己的负债被计入,以及储备覆盖率
五、环境与部署 (Environments)
| 环境 | Canton 接入 | 用途 |
|---|---|---|
| 生产 | Canton MainNet Global Synchronizer,经 Rocky 自有 validator(api.validator.rocky.exchange) | api.rocky.exchange 线上服务 |
| 本地开发 | Canton sandbox(单 participant,不连外网,CANTON_AUTH_MODE=none) | 后端仓库 make canton-up |
Rocky 没有 DevNet 部署。用户 party 的 suffix 各不相同,取决于其钱包所在的 validator。