Docs

chain_getHeader - Acala RPC Method

Get block header on Acala. Lightweight alternative to chain_getBlock for reading block metadata, parent hash, and state root on Polkadot's DeFi and liquidity hub with aUSD stablecoin and liquid staking (LDOT).

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

Why Acala? Build on Polkadot's DeFi and liquidity hub with aUSD stablecoin and liquid staking (LDOT) with $250M aUSD ecosystem fund, 150%+ LDOT TVL growth, micro gas fees payable in any token, and Coinbase Cloud partnership.

When to Use This Method

chain_getHeader is ideal for DeFi developers, stablecoin builders, and teams requiring cross-chain liquidity:

  • Lightweight Queries — Get block metadata without downloading full extrinsic data on Acala
  • Chain Synchronization — Track block production and monitor chain progress for decentralized stablecoin (aUSD), liquid DOT staking (LDOT), and cross-chain AMM DEX
  • 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 Acala:

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 Acala 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 Acala 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