Docs

chain_getHeader - Bridge Hub RPC Method

Get block header on Bridge Hub. Lightweight alternative to chain_getBlock for reading block metadata, parent hash, and state root on Polkadot's trustless bridging parachain with $75M+ TVL via Snowbridge to Ethereum.

Returns the block header for a given hash on Bridge Hub. This is a lightweight alternative to chain_getBlock when you only need header metadata without extrinsic data.

Why Bridge Hub? Build on Polkadot's trustless bridging parachain with $75M+ TVL via Snowbridge to Ethereum with on-chain BEEFY/Beacon light clients (no multisigs), 100+ ERC-20 tokens supported, 24+ parachain integrations, and 1-2 minute transfer times.

When to Use This Method

chain_getHeader is ideal for cross-chain developers, bridge operators, and teams requiring trustless Ethereum-Polkadot transfers:

  • Lightweight Queries — Get block metadata without downloading full extrinsic data on Bridge Hub
  • Chain Synchronization — Track block production and monitor chain progress for trustless ETH and ERC-20 bridging, cross-chain messaging, and parachain-to-Ethereum asset transfers
  • Parent Chain Navigation — Follow parentHash links to traverse the chain backwards
  • State Verification — Use stateRoot and extrinsicsRoot for Merkle proof verification

Code Examples

Common Use Cases

1. Block Time Calculator

Estimate block production rate on Bridge Hub:

JavaScript
async function estimateBlockTime(api, sampleSize = 10) {
  const latestHeader = await api.rpc.chain.getHeader();
  const latestNumber = latestHeader.number.toNumber();

  const oldHash = await api.rpc.chain.getBlockHash(latestNumber - sampleSize);
  const oldHeader = await api.rpc.chain.getHeader(oldHash);

  // Use timestamp from block digests or timestamp pallet
  const latestTimestamp = await api.query.timestamp.now();
  const apiAt = await api.at(oldHash);
  const oldTimestamp = await apiAt.query.timestamp.now();

  const timeDiff = latestTimestamp.toNumber() - oldTimestamp.toNumber();
  const avgBlockTime = timeDiff / sampleSize;

  console.log(`Average block time: ${avgBlockTime / 1000}s over ${sampleSize} blocks`);
  return avgBlockTime;
}

2. Chain Traversal

Walk backwards through the Bridge Hub chain using parent hashes:

JavaScript
async function walkChain(api, startHash, depth = 5) {
  let currentHash = startHash || (await api.rpc.chain.getBlockHash());
  const headers = [];

  for (let i = 0; i < depth; i++) {
    const header = await api.rpc.chain.getHeader(currentHash);
    headers.push({
      number: header.number.toNumber(),
      hash: currentHash.toString(),
      parentHash: header.parentHash.toHex()
    });
    currentHash = header.parentHash;
  }

  return headers;
}

3. Lightweight Block Monitor

Monitor Bridge Hub block production without downloading full blocks:

JavaScript
async function monitorBlocks(api, callback) {
  let lastNumber = 0;

  setInterval(async () => {
    const header = await api.rpc.chain.getHeader();
    const number = header.number.toNumber();

    if (number > lastNumber) {
      console.log(`New block #${number}`);
      callback(header);
      lastNumber = number;
    }
  }, 3000);
}

Error Handling

Error CodeDescriptionSolution
-32602Invalid paramsVerify block hash is valid hex with 0x prefix
-32603Internal errorNode may be syncing — retry with backoff
-32601Method not foundVerify the node supports this RPC method
-32005Rate limit exceededImplement client-side rate limiting