Overview
The IBC Attestor is a stateless gRPC service that produces cryptographic attestations of blockchain state for use in IBC v2 cross-chain communication. It connects to a chain (EVM, Cosmos, or Solana) and signs state at requested heights using either a local keystore or a remote signing service. Each attestor instance handles a single chain type. In production, multiple instances per chain are typical (each with a distinct signing key) to support m-of-n quorum verification by the light client.Getting started
To start the attestor, visit the ibc-attestor repository and follow the quickstart guide.Components
1. IBC Attestor
The core attestation service. Exposes a gRPC API on port8080 (configurable) and a metrics endpoint on port 8081.
Image: ghcr.io/cosmos/ibc-attestor:<version> — see releases for available tags
Binary: ibc_attestor
2. Signer Service (external dependency)
The attestor requires a secp256k1 signing key. Two deployment modes are supported:- Local signer — key is stored in an encrypted keystore file on disk, read directly by the attestor process
- Remote signer — the attestor delegates signing to an external gRPC signer service over the network. See Remote Signing for configuration details.
3. Chain RPC Endpoint (external dependency)
Each attestor instance requires a live RPC endpoint for the chain it is attesting:Configuration
The attestor is configured via a TOML file passed with--config. The chain type and signer mode are passed as CLI flags.
Full configuration reference
Only the fields relevant to the chosen
--signer-type need to be present. The [adapter] fields that apply depend on the --chain-type.EVM example
This example is from theattestor-config.toml.tmpl file of the IBC demo repo.
Cosmos example
This example is from theattestor-cosmos-config.toml.tmpl file of the IBC demo repo.
CLI Reference
Key Management
Before running the attestor with a local signer, generate a keypair:Ports
Thelisten_addrin your TOML config controls the gRPC port. These are the defaults from the example config; adjust to match your deployment. Note: the DockerfileEXPOSEs8090and9000— if running in a container, set your TOML to match.
Observability
The attestor emits structured JSON logs viatracing. Log level is controlled by the RUST_LOG environment variable:
[tracing] section to your config file with otlp_endpoint, service_name, and sample_rate fields (see the full configuration reference above).
Prometheus metrics are exposed on the health_addr port at GET /metrics.
Health Checking
200 OK when the gRPC server is accepting connections, 503 Service Unavailable when it is not ready. Allow up to 30 seconds for startup.
Multi-Attestor Deployments
Each attestor instance handles one chain type. For m-of-n quorum, deploy multiple instances per chain, each with a distinct signing key. Two places need to be updated when adding attestors. The following are examples of the templates used in the IBC demo.- Light client (
client-state.json.tmpl) — at creation time, provide all attestor Ethereum addresses and set the quorum threshold:
- Proof API (
proof-api.json.tmpl) — add all attestor gRPC endpoints toattestor_endpointsand setquorum_thresholdto matchmin_required_sigs:
wallet_id values.