What are Attestations?
Attestations are cryptographic signatures that prove a cross-chain message is legitimate. In CCTP, attestations serve as the security bridge between chains:- Burn Proof: Attestation confirms tokens were actually burned on the source chain
- Authorization: Only valid attestations allow minting on the destination chain
- Decentralization: Multiple independent attesters must sign (m-of-n multisig)
- Replay Prevention: Each attestation is valid for exactly one (sourceDomain, nonce) pair
Without valid attestations, it’s impossible to mint tokens on the destination chain, preventing unauthorized USDC creation.
Why Attestations Are Needed
Blockchains cannot natively communicate with each other. CCTP bridges this gap:The Problem
Avalanche contracts cannot directly verify that USDC was burned on Ethereum. Without attestations:- Anyone could claim to have burned tokens
- Malicious actors could mint unlimited USDC
- Cross-chain transfers would be impossible to trust
The Solution
Trusted attesters observe burns and provide cryptographic proof that minting is authorized.Attester Management
CCTP uses theAttestable role contract (see src/roles/Attestable.sol:22) to manage attesters:
Attester Lifecycle
Enabling Attesters
Only theattesterManager can enable new attesters:
newAttestermust not be zero addressnewAttestermust not already be enabled- Caller must be the attester manager
Disabling Attesters
To disable a compromised or retired attester:- At least 1 attester must remain enabled
- Number of enabled attesters must exceed signature threshold
- Ensures system remains operational after disabling
Signature Threshold
The signature threshold determines how many attesters must sign each message (m in m-of-n multisig):- Threshold must be at least 1
- Threshold cannot exceed number of enabled attesters
- Threshold must be different from current value
- Higher threshold: More secure (more attesters needed to compromise), but slower and less fault-tolerant
- Lower threshold: Faster and more fault-tolerant, but less secure
Attester Manager Role
The attester manager has exclusive control over the attester set:- Enable new attesters
- Disable compromised attesters
- Adjust signature threshold
- Only contract owner can change attester manager
- Attester manager cannot transfer their own role
Signature Verification
The core security mechanism is signature verification in_verifyAttestationSignatures() (see src/roles/Attestable.sol:227):
Attestation Format
Attestations are concatenated 65-byte ECDSA signatures:- r (32 bytes): Signature component
- s (32 bytes): Signature component
- v (1 byte): Recovery ID
65 * signatureThreshold bytes
Verification Algorithm
Verification Steps Explained
Step 1: Length Validation
Ensures attestation contains exactly the required number of signatures:- Threshold = 1: Attestation must be exactly 65 bytes
- Threshold = 3: Attestation must be exactly 195 bytes
- Threshold = 5: Attestation must be exactly 325 bytes
Step 2: Message Hashing
Step 3-4: Signature Recovery
For each signature, recover the signer’s address using ECDSA:ECDSA.recover() which:
- Extracts v, r, s from signature
- Performs elliptic curve point recovery
- Returns the address that created the signature
Step 5: Increasing Address Order
Critical Security Check: Signatures must be ordered by ascending attester address:- Prevents Duplicate Signatures: Same signature cannot be used twice (address would not increase)
- Simplifies Verification: O(n) complexity instead of O(n²) for checking duplicates
- Canonical Format: Only one valid ordering exists for any signature set
Step 6: Attester Authorization
- Random addresses from providing signatures
- Disabled/retired attesters from authorizing transfers
Complete Verification Example
Attestation Service Architecture
Circle operates the off-chain attestation service:Service Responsibilities
- Event Monitoring: Listen for
MessageSentevents on all supported chains - Validation:
- Verify transaction confirmation and finality
- Check burn amount is within limits
- Validate destination domain is supported
- Confirm source contract is legitimate TokenMessenger
- Signing: Generate signatures with authorized attester keys
- API: Provide attestations via REST API with rate limiting
- Observability: Log all attestations for audit trails
Attestation API
Endpoint:- Maximum 1 request per second per IP
- Exceeding limit returns HTTP 429
Security Considerations
Attester Key Management
Critical: Attester private keys are the root of CCTP security- Hardware Security Modules (HSMs): Keys stored in tamper-resistant hardware
- Multi-Party Computation (MPC): Distributed key generation and signing
- Key Rotation: Periodic rotation of attester keys
- Separation: Each attester key held by independent party
Threshold Selection
Choosing the right threshold balances security and availability: Example Scenarios:| Enabled | Threshold | Security Level | Fault Tolerance |
|---|---|---|---|
| 3 | 2 | Moderate | 1 attester can fail |
| 5 | 3 | High | 2 attesters can fail |
| 7 | 5 | Very High | 2 attesters can fail |
| 9 | 7 | Maximum | 2 attesters can fail |
floor(n/2) + 1 where n is number of enabled attesters (Byzantine fault tolerance).
Attack Vectors and Mitigations
Replay Attacks
Attack: Reuse valid attestation to mint tokens multiple times Mitigation: Nonce tracking in MessageTransmitterSignature Malleability
Attack: Modify signature to create alternative valid signature for same message Mitigation:- ECDSA library validates signature format
- Increasing address order requirement ensures canonical representation
Attester Compromise
Attack: Compromise m attesters to authorize fraudulent mints Mitigation:- Geographic distribution of attesters
- Different security vendors for each attester
- Regular security audits
- Ability to quickly disable compromised attesters
Front-Running
Attack: Monitor mempool and submitreceiveMessage before intended recipient
Mitigation: Use depositForBurnWithCaller() to restrict who can complete transfer
Monitoring and Observability
Key Metrics
Attestation Service:- Average attestation time
- Success/failure rate
- API request rate and errors
- Number of enabled attesters:
getNumEnabledAttesters() - Current threshold:
signatureThreshold - Attester manager:
attesterManager()
Events
Next Steps
Message Flow
See how attestations fit into the complete transfer flow
Quickstart
Build your first integration with attestations