Skip to main content

Identity Verification (ERC-7529)

Identity verification proves that an airnode address is controlled by the entity that owns a specific DNS domain. It follows ERC-7529, a standard for associating EVM addresses with DNS domains.

How it works

The operator sets a DNS TXT record at a well-known host that contains their airnode address. Anyone can verify the association by querying DNS and comparing the record value against the on-chain address.

Host:  ERC-7529.<chainId>._domaincontracts.<domain>
Value: <comma-separated checksummed airnode addresses>

For example, if CoinGecko operates an airnode at 0xAbC123... on Ethereum mainnet (chain 1):

Host:  ERC-7529.1._domaincontracts.api.coingecko.com
Value: 0xAbC123...

An operator running multiple airnodes can list all addresses in a single record, comma-separated:

Value: 0xAbC123..., 0xDef456...

For operators

1. Get the TXT record details

airnode identity show --domain api.coingecko.com

This reads AIRNODE_PRIVATE_KEY from your environment, derives the address, and displays the exact TXT record host and value to set:

──────────────────────────────────────────────────────────────────────
Airnode Identity
──────────────────────────────────────────────────────────────────────

Address 0xAbC123...
Domain api.coingecko.com

Set this DNS TXT record:

Host ERC-7529.1._domaincontracts.api.coingecko.com
Value 0xAbC123...

──────────────────────────────────────────────────────────────────────

Use --chain-id if your airnode serves chains other than mainnet:

airnode identity show --domain api.coingecko.com --chain-id 137

2. Set the DNS record

Add a TXT record in your DNS provider's dashboard. The host and value are shown by the show command. DNS propagation typically takes a few minutes.

3. Verify it works

airnode identity verify --address 0xAbC123... --domain api.coingecko.com

For requesters

Verify an airnode's identity before integrating:

# Single address
airnode identity verify --address 0xAbC123... --domain api.coingecko.com

# Multiple addresses at once
airnode identity verify -a 0xAbC123... -a 0xDef456... -d api.coingecko.com

# Comma-separated
airnode identity verify -a 0xAbC123...,0xDef456... -d api.coingecko.com

The command queries DNS over HTTPS (Google DoH) and checks if each address appears in the TXT record. It exits with code 0 when all addresses are verified, 1 if any are missing.

Manual verification

You can verify without the CLI by querying DNS directly:

# Using dig
dig TXT ERC-7529.1._domaincontracts.api.coingecko.com

# Using DNS-over-HTTPS
curl -s "https://dns.google/resolve?name=ERC-7529.1._domaincontracts.api.coingecko.com&type=TXT"

Check that the response contains the expected airnode address.

Trust model

Identity verification proves who operates the airnode -- it does not prove what data the airnode serves. An operator who sets the TXT record is claiming: "I control this domain and I operate this airnode address." This is useful because:

  • Requesters can verify operator identity before trusting an airnode with their funds.
  • DNS records are controlled by domain owners, not by the airnode software. Only someone with access to api.coingecko.com's DNS can set records under that domain.
  • It composes with existing trust: if you already trust CoinGecko's API, verifying that their airnode address resolves to their domain extends that trust to their on-chain oracle.

First-party verification

DNS identity verification is most meaningful for first-party airnodes — where the API provider operates the node. When CoinGecko sets a DNS TXT record associating their airnode address with api.coingecko.com, consumers can verify that the data signer is the same entity that controls the data source. This is the strongest trust configuration.

A third-party operator can only verify their own domain. If oracle-service.example.com claims to serve CoinGecko data, DNS verification proves the operator controls oracle-service.example.com — not that CoinGecko authorized them or that the data is genuine. Consumers should always look for DNS verification against the API provider's domain, not the operator's domain.

What identity verification does not prove:

  • That the airnode is serving correct data (with first-party operation, the provider's reputation is at stake; with third-party operation, this is unverifiable).
  • That the configuration hasn't changed (the operator can update their config at any time).
  • That the DNS record is current (records can be removed, so verify close to integration time).

Programmatic usage

The identity verification functions are exported for use in your own code:

import { verifyIdentity, buildTxtRecordHost } from 'airnode/identity';

// Verify one or more addresses against a domain
const results = await verifyIdentity(['0xAbC123...', '0xDef456...'], 'api.coingecko.com');

for (const { address, verified } of results) {
console.log(`${address}: ${verified ? 'verified' : 'not found'}`);
}

// Build the TXT record host for a custom chain
const host = buildTxtRecordHost('api.coingecko.com', 137);
// --> "ERC-7529.137._domaincontracts.api.coingecko.com"

Exported from src/identity.ts:

FunctionDescription
verifyIdentity()Verify one or more addresses against a domain's TXT records
buildTxtRecordHost()Build the ERC-7529 TXT record hostname for a domain and chain ID
queryTxtRecords()Query DNS-over-HTTPS for TXT records at a given hostname
findAddressInRecords()Check if an address appears in a set of TXT record values

ERC-7529

The TXT record format follows ERC-7529. The standard supports comma-separated addresses in a single record.