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
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
- Run
make setup && make build && make startto verify your setup works
Smart Contract Migration
Phase 1: Model Your Parties
1
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)
2
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)
3
Plan party hosting
Decide where parties will be hosted:
- User parties: Often on the application provider’s validator
- Admin parties: On your organization’s validator
- External parties: On their own validators
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
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
Migration Phases
Next Steps
Module 3: Daml Development
Start building with Daml.
CN Quickstart
Get hands-on with a working example.