204 lines
5.2 KiB
Markdown
204 lines
5.2 KiB
Markdown
|
|
# CCIP Message Tracking Specification
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
This document specifies how CCIP (Cross-Chain Interoperability Protocol) messages are tracked from source chain to destination chain, including status monitoring and execution receipt linking.
|
||
|
|
|
||
|
|
## CCIP Message Lifecycle
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
sequenceDiagram
|
||
|
|
participant Source as Source Chain
|
||
|
|
participant CCIP as CCIP DON
|
||
|
|
participant Dest as Destination Chain
|
||
|
|
participant Indexer as Indexer
|
||
|
|
|
||
|
|
Source->>Indexer: Emit CCIP MessageSent event
|
||
|
|
Indexer->>Indexer: Index source tx + messageId
|
||
|
|
CCIP->>Dest: Deliver message
|
||
|
|
Dest->>Indexer: Emit CCIP MessageExecuted event
|
||
|
|
Indexer->>Indexer: Link messageId to dest tx
|
||
|
|
Indexer->>Indexer: Update message status
|
||
|
|
```
|
||
|
|
|
||
|
|
## Message Ingestion
|
||
|
|
|
||
|
|
### Source Chain Events
|
||
|
|
|
||
|
|
**Event**: `MessageSent(address indexed sender, uint64 indexed destinationChainSelector, bytes receiver, bytes data, address feeToken, uint256 fee)`
|
||
|
|
|
||
|
|
**Data Extracted**:
|
||
|
|
- `messageId`: Unique message identifier
|
||
|
|
- `sender`: Source address
|
||
|
|
- `destinationChainSelector`: Destination chain selector
|
||
|
|
- `receiver`: Destination receiver address
|
||
|
|
- `data`: Message payload
|
||
|
|
- `feeToken`: Fee token address
|
||
|
|
- `fee`: Fee amount
|
||
|
|
- `transactionHash`: Source transaction hash
|
||
|
|
- `blockNumber`: Source block number
|
||
|
|
- `timestamp`: Source transaction timestamp
|
||
|
|
|
||
|
|
### Destination Chain Events
|
||
|
|
|
||
|
|
**Event**: `MessageExecuted(bytes32 indexed messageId, uint64 indexed sourceChainSelector, bytes sender, bytes data)`
|
||
|
|
|
||
|
|
**Data Extracted**:
|
||
|
|
- `messageId`: Message identifier (matches source)
|
||
|
|
- `sourceChainSelector`: Source chain selector
|
||
|
|
- `sender`: Source sender address
|
||
|
|
- `data`: Message payload
|
||
|
|
- `transactionHash`: Destination transaction hash
|
||
|
|
- `blockNumber`: Destination block number
|
||
|
|
- `timestamp`: Destination transaction timestamp
|
||
|
|
- `status`: Execution status (success/failure)
|
||
|
|
|
||
|
|
## Message ID Normalization
|
||
|
|
|
||
|
|
### Message ID Format
|
||
|
|
|
||
|
|
**Source**: Generated from transaction hash and event log index
|
||
|
|
**Format**: `keccak256(transactionHash, logIndex)` or CCIP-provided messageId
|
||
|
|
|
||
|
|
### Normalization Strategy
|
||
|
|
|
||
|
|
**Goal**: Ensure consistent messageId across source and destination
|
||
|
|
|
||
|
|
**Method**:
|
||
|
|
1. Extract messageId from source event
|
||
|
|
2. Store with source transaction
|
||
|
|
3. Match with destination event by messageId
|
||
|
|
4. Link source and destination transactions
|
||
|
|
|
||
|
|
## Delivery Status Tracking
|
||
|
|
|
||
|
|
### Status States
|
||
|
|
|
||
|
|
**States**:
|
||
|
|
- `sent`: Message sent on source chain
|
||
|
|
- `delivered`: Message delivered to CCIP DON
|
||
|
|
- `executing`: Message executing on destination chain
|
||
|
|
- `executed`: Message executed successfully
|
||
|
|
- `failed`: Message execution failed
|
||
|
|
- `expired`: Message expired (timeout)
|
||
|
|
|
||
|
|
### Status Transitions
|
||
|
|
|
||
|
|
```
|
||
|
|
sent → delivered → executing → executed
|
||
|
|
↓
|
||
|
|
failed
|
||
|
|
↓
|
||
|
|
expired (if timeout)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Status Updates
|
||
|
|
|
||
|
|
**Tracking**:
|
||
|
|
- Monitor destination chain for execution events
|
||
|
|
- Poll CCIP router for message status (if API available)
|
||
|
|
- Track timeout periods
|
||
|
|
- Update status in database
|
||
|
|
|
||
|
|
## Execution Receipt Linking
|
||
|
|
|
||
|
|
### Receipt Storage
|
||
|
|
|
||
|
|
**Database Schema**:
|
||
|
|
```sql
|
||
|
|
CREATE TABLE ccip_messages (
|
||
|
|
id UUID PRIMARY KEY,
|
||
|
|
message_id VARCHAR(66) NOT NULL UNIQUE,
|
||
|
|
source_chain_id INTEGER NOT NULL,
|
||
|
|
source_tx_hash VARCHAR(66) NOT NULL,
|
||
|
|
source_block_number BIGINT NOT NULL,
|
||
|
|
destination_chain_id INTEGER NOT NULL,
|
||
|
|
destination_tx_hash VARCHAR(66),
|
||
|
|
destination_block_number BIGINT,
|
||
|
|
status VARCHAR(20) NOT NULL,
|
||
|
|
sent_at TIMESTAMP NOT NULL,
|
||
|
|
executed_at TIMESTAMP,
|
||
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
||
|
|
updated_at TIMESTAMP DEFAULT NOW()
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Linking Process
|
||
|
|
|
||
|
|
**Steps**:
|
||
|
|
1. Index source transaction with messageId
|
||
|
|
2. Wait for destination chain event
|
||
|
|
3. Match messageId from destination event
|
||
|
|
4. Link destination transaction to source
|
||
|
|
5. Update status to "executed" or "failed"
|
||
|
|
|
||
|
|
## Retry Tracking
|
||
|
|
|
||
|
|
### Retry Detection
|
||
|
|
|
||
|
|
**Detection**:
|
||
|
|
- Multiple execution attempts with same messageId
|
||
|
|
- Track retry count
|
||
|
|
- Store retry timestamps
|
||
|
|
|
||
|
|
### Retry Data
|
||
|
|
|
||
|
|
**Fields**:
|
||
|
|
- `retry_count`: Number of retry attempts
|
||
|
|
- `retry_timestamps`: Array of retry attempt times
|
||
|
|
- `last_retry_at`: Last retry timestamp
|
||
|
|
|
||
|
|
## API Endpoints
|
||
|
|
|
||
|
|
### Get Message by ID
|
||
|
|
|
||
|
|
`GET /api/v1/ccip/messages/{message_id}`
|
||
|
|
|
||
|
|
**Response**:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"message_id": "0x...",
|
||
|
|
"source": {
|
||
|
|
"chain_id": 138,
|
||
|
|
"tx_hash": "0x...",
|
||
|
|
"block_number": 12345,
|
||
|
|
"sender": "0x...",
|
||
|
|
"timestamp": "2024-01-01T00:00:00Z"
|
||
|
|
},
|
||
|
|
"destination": {
|
||
|
|
"chain_id": 1,
|
||
|
|
"tx_hash": "0x...",
|
||
|
|
"block_number": 19000000,
|
||
|
|
"receiver": "0x...",
|
||
|
|
"timestamp": "2024-01-01T00:05:00Z"
|
||
|
|
},
|
||
|
|
"status": "executed",
|
||
|
|
"sent_at": "2024-01-01T00:00:00Z",
|
||
|
|
"executed_at": "2024-01-01T00:05:00Z"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Get Message by Transaction
|
||
|
|
|
||
|
|
`GET /api/v1/ccip/transactions/{chain_id}/{tx_hash}/messages`
|
||
|
|
|
||
|
|
**Response**: Array of CCIP messages for transaction
|
||
|
|
|
||
|
|
### Search Messages
|
||
|
|
|
||
|
|
`GET /api/v1/ccip/messages`
|
||
|
|
|
||
|
|
**Query Parameters**:
|
||
|
|
- `source_chain_id`: Filter by source chain
|
||
|
|
- `destination_chain_id`: Filter by destination chain
|
||
|
|
- `status`: Filter by status
|
||
|
|
- `sender`: Filter by sender address
|
||
|
|
- `receiver`: Filter by receiver address
|
||
|
|
|
||
|
|
## References
|
||
|
|
|
||
|
|
- CCIP Observability: See `ccip-observability.md`
|
||
|
|
- CCIP Event Schema: See `ccip-event-schema.md`
|
||
|
|
- Graph Database: See `../database/graph-schema.md`
|
||
|
|
|