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

阅读英文版

appdevmodulesm2-smart-contract-paradigm

智能合约范式转变

理解 Solidity 与 Daml 编程模型的根本差异

从 Solidity 迁到 Daml 需要显著心智转变。本节说明范式差异与适应方式。

编程模型对比

方面SolidityDaml
范式命令式、面向对象函数式、声明式
状态可变存储不可变合约
执行顺序操作交易树
类型静态 + 动态调用强类型、ADT
副作用不受限通过 monad 控制

状态模型:可变 vs 不可变

Solidity:合约是可修改状态的持久对象。

Daml:合约是不可变事实;变更归档旧合约并创建新合约。

template Token
  with
    owner : Party
    issuer : Party
    amount : Decimal
  where
    signatory issuer
    observer owner
    choice Transfer : ContractId Token
      with newOwner : Party; transferAmount : Decimal
      controller owner
      do
        create Token with owner = newOwner, issuer, amount = transferAmount
        create this with amount = amount - transferAmount

心智模型:合约是事实;exercise 归档事实并创建新事实。

UTXO vs 账户模型

以太坊:全局账户余额 mapping,易查总余额,热门账户有争用。

Canton:扩展 UTXO——状态是合约集合,转账归档并新建,余额为所持 Token 合约之和,并行更好、数据流显式。

语言对比

Daml 用 ADT、Optional 显式空值、完整参数多态;控制流用 forAassertMsg 等于 Update monad 内。

授权模型

Solidity:onlyOwner 等运行时 require,易遗漏、任何人可尝试调用。

Daml:signatory/controller 声明,编译器与协议强制,未授权方无法到达 Choice 体。

多方协调

Solidity 手动多签 mapping;Daml 原生 signatory partyA, partyB 与 Proposal → Accept 模式。

常见模式对照

Solidity 模式Daml 等价
OwnableSignatory
Pausable归档 + 重建
ERC-20CIP-0056 Token Standard
Proxy/UpgradeableSCU
Pull paymentPropose/accept
FactoryTemplate + create
RegistryContract keys

需要调整的习惯

Solidity 习惯Daml 现实
原地改状态归档 + 新建
运行时 msg.sender编译期 controller
公开函数人人可调仅 controller 可 exercise
固定合约地址Contract ID 每次更新都变
循环迭代forAmapA、fold
到处 try/catch用 assert;异常已弃用

下一步

网络架构与拓扑对比。 开始编写 Daml 智能合约。

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