Use this checklist when planning and executing a migration from Ethereum to Canton. Each section covers a key area with specific action items.Documentation Index
Fetch the complete documentation index at: https://docs.canton.network/llms.txt
Use this file to discover all available pages before exploring further.
Before You Start
Assess your application architecture
Assess your application architecture
- Identify state model dependencies: Does your app rely on global state queries?
- Map multi-party relationships: Who are the parties in your contracts?
- Evaluate privacy requirements: Do you need sub-transaction privacy?
- Review integration points: What systems connect to your smart contracts?
Understand the paradigm shift
Understand the paradigm shift
| Area | Ethereum Assumption | Canton Reality |
|---|---|---|
| State | Global, queryable | Distributed, party-scoped |
| Contracts | Mutable | Immutable (archive + create) |
| Authorization | Runtime msg.sender | Compile-time signatories |
| Privacy | Public by default | Private by default |
| Identity | Anonymous addresses | Named parties |
Set up your development environment
Set up your development environment
- Install the Daml SDK
- Install VS Code with the Daml extension
- Clone the CN Quickstart repository
- Run
make setup && make build && make startto verify your setup works
Smart Contract Migration
Phase 1: Model Your Parties
Identify all actors
List everyone who interacts with your contracts and map them to Canton parties:
- Contract owner →
admin : Party(signatory for admin contracts) - Users →
user : Party(each user is a distinct party) - Operators →
operator : Party(may be signatory or controller)
Define party relationships
For each contract, determine:
- Who must agree to create it? → Signatories
- Who should see it? → Observers
- Who can act on it? → Controllers (per choice)
Phase 2: Translate Contracts
Translate Solidity structs to Daml data types
Translate Solidity structs to Daml data types
Translate storage mappings to contracts
Translate storage mappings to contracts
Translate functions to choices
Translate functions to choices
Translate access control to signatories/controllers
Translate access control to signatories/controllers
Phase 3: Handle State Differently
- Replace global queries: Design party-scoped query patterns
- Plan for contract keys: Use keys for lookups instead of addresses
- Accept contract ID changes: IDs change on every update; use keys for stable references
Integration Migration
API Changes
| Ethereum | Canton | Notes |
|---|---|---|
| JSON-RPC | Ledger API (gRPC or JSON API) | Different protocol |
| Web3.js / ethers.js | Ledger API client or dApp SDK | Language-specific clients |
| Event logs | Transaction streams | Subscribe to party’s transactions |
eth_call | Exercise non-consuming choice | Read-only operations |
Authentication Changes
Ethereum authenticates via private key signatures and derives identity frommsg.sender. In Canton, identity comes from party authentication with JWT tokens. Where Ethereum allows anyone to call a public function, Canton restricts access to authenticated parties only.
Indexing Strategy
Since there’s no global state query:- Use the Participant Query Store (PQS) for SQL-based querying
- Stream transactions to your own database
- Design contracts with query-friendly keys
Testing Migration
Unit Tests
- Replace Hardhat/Foundry tests with Daml Script tests
- Test authorization rules (who can exercise what)
- Test multi-party workflows (propose-accept patterns)
Integration Tests
- Test against LocalNet (CN Quickstart provides this)
- Verify API integration works
- Test error scenarios and rollback behavior
Deployment Migration
Network Selection
- LocalNet — development and testing
- DevNet — integration testing
- TestNet — pre-production validation
- MainNet — production
Deployment Checklist
- Package your Daml code:
dpm build - Upload to validator: Via admin or LAPI APIs
- Allocate parties: Create party identities
- Initialize contracts: Create initial state
- Configure applications: Point to Ledger API
Operational Changes
Monitoring
Where Ethereum has block explorers, Canton uses validator logs and metrics. Transaction hash lookups become transaction ID queries. Gas tracking maps to traffic unit tracking.Key Management
Ethereum EOA private keys correspond to Canton party keys, which can live on the validator or be held externally. Hardware wallets map to HSM and KMS integrations. Multisig wallets are replaced by multi-signatory contracts, where authorization is enforced at the Daml level.Common Migration Pitfalls
| Pitfall | Why It Happens | How to Avoid |
|---|---|---|
| Building global state views | Expecting Ethereum-like queries | Design for party-scoped data from start |
| Overusing parties | Treating parties like addresses | Parties have hosting costs; design deliberately |
| Ignoring propose-accept | Expecting unilateral contract creation | Multi-party contracts need workflow |
| Expecting event logs | Using Ethereum event patterns | Use transaction streams and indexing |
| Contract ID as identifier | Treating IDs like addresses | Use contract keys for stable references |
Migration Phases
| Phase | Focus | Completion Criteria |
|---|---|---|
| 1. Learning | Understand Canton model | Team comfortable with Daml basics |
| 2. Design | Redesign for Canton | Party model and contracts designed |
| 3. Development | Implement in Daml | Contracts and tests complete |
| 4. Integration | Connect applications | APIs working on LocalNet |
| 5. Testing | Validate on test networks | Passed DevNet/TestNet testing |
| 6. Deployment | Go to production | Running on MainNet |
Next Steps
Module 3: Daml Development
Start building with Daml.
CN Quickstart
Get hands-on with a working example.