eth_getBlockByHash - Unichain RPC Method
Retrieve complete block data by block hash on Unichain. Essential for DeFi developers, liquidity protocol builders, and teams building on the Optimism Superchain building on Uniswap's DeFi-optimized Superchain L2 with 250ms sub-blocks and 95% lower costs than Ethereum.
Returns information about a block by hash on Unichain.
Why Unichain? Build on Uniswap's DeFi-optimized Superchain L2 with 250ms sub-blocks and 95% lower costs than Ethereum with 250ms sub-blocks (fastest L2), TEE-secured block building, native Superchain interoperability, and 65% revenue to validators.
When to Use This Method
eth_getBlockByHash is essential for DeFi developers, liquidity protocol builders, and teams building on the Optimism Superchain:
- Block verification using deterministic hash lookup: Retrieve block data by its unique, immutable hash on Unichain
- Chain reorganization handling: Track blocks reliably by hash during reorgs on Uniswap's DeFi-optimized Superchain L2 with 250ms sub-blocks and 95% lower costs than Ethereum
- Cross-chain bridge finality verification: Confirm block existence by its canonical hash for decentralized exchanges, liquidity protocols, and MEV-protected DeFi applications
- Deterministic queries when block number may change: Ensure consistent results for applications that need stable references regardless of chain state
Common Use Cases
1. Verify a Specific Block from a Transaction's blockHash Field
When a transaction response includes blockHash, use eth_getBlockByHash to retrieve the full parent block. This cross-references the transaction's context and confirms which block it was included in on Unichain.
import { JsonRpcProvider } from 'ethers';
const provider = new JsonRpcProvider('https://api-unichain-mainnet.n.dwellir.com/YOUR_API_KEY');
async function verifyBlockFromTx(txHash) {
const tx = await provider.getTransaction(txHash);
if (!tx || !tx.blockHash) return null;
const block = await provider.getBlock(tx.blockHash);
console.log(`Transaction ${txHash} in block #${block.number}`);
console.log(`Block hash: ${block.hash}`);
console.log(`Block timestamp: ${new Date(block.timestamp * 1000).toISOString()}`);
return block;
}
verifyBlockFromTx('0x9706ecd214808103184e8c0f79eefebe1cb5e87539cbe81ec191426af62c97ec');2. Cross-Reference Blocks During Chain Reorganization
During a chain reorganization, block numbers can shift but block hashes remain unique identifiers. Use eth_getBlockByHash to verify the canonical chain state and detect whether a previously observed block has been orphaned on Uniswap's DeFi-optimized Superchain L2 with 250ms sub-blocks and 95% lower costs than Ethereum.
from web3 import Web3
w3 = Web3(Web3.HTTPProvider('https://api-unichain-mainnet.n.dwellir.com/YOUR_API_KEY'))
def verify_block_still_canonical(block_hash):
block = w3.eth.get_block(block_hash)
if block is None:
print(f'Block {block_hash} has been pruned or orphaned')
return False
print(f'Block {block_hash} still canonical at height #{block.number}')
return True
# Check a known block hash
verify_block_still_canonical('0x480c43fe03129d5842659d3456eb1ca895e77a2f607de2195ad4b2ee02743e06')3. Audit Block Data by Known Hash Reference
For compliance and audit workflows, store block hashes as permanent references. Re-querying eth_getBlockByHash with a stored hash guarantees you retrieve the exact same block data, even months later on Unichain.
package main
import (
"context"
"fmt"
"log"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
)
func main() {
client, _ := ethclient.Dial("https://api-unichain-mainnet.n.dwellir.com/YOUR_API_KEY")
knownHash := common.HexToHash("0x480c43fe03129d5842659d3456eb1ca895e77a2f607de2195ad4b2ee02743e06")
block, err := client.BlockByHash(context.Background(), knownHash)
if err != nil || block == nil {
log.Fatal("Block not found: may be pruned from node")
}
fmt.Printf("Audited block #%d\n", block.Number().Uint64())
fmt.Printf("Hash: %s\n", block.Hash().Hex())
fmt.Printf("Transactions: %d\n", len(block.Transactions()))
}Best Practices
- Hash-based lookups are more reliable during chain reorgs than number-based: A block hash uniquely identifies one canonical block, while a block number may shift to a different block after a reorg
- Store block hashes in your database for future verification: Persisting the hash alongside related records enables deterministic re-querying for audits and data integrity checks
- Handle
nullresults gracefully: Blocks can be pruned by the node, especially on non-archive endpoints; your application should treat a null response as a missing or unavailable block - For L2 optimistic rollups, verify the L1 anchor hash separately: The hash on the L2 chain references a different block space than the L1 anchor; validate both independently for full finality confidence
Code Examples
Error Handling
| Error Code | Message | Description |
|---|---|---|
| -32602 | Invalid params | Invalid block hash format |
| -32000 | Block not found | Block with this hash does not exist |
Related Methods
eth_getBlockByNumber- Get block by numbereth_blockNumber- Get latest block number
eth_getBlockByNumber
Retrieve complete block data by block number on Unichain. Perfect for DeFi developers, liquidity protocol builders, and teams building on the Optimism Superchain building on Uniswap's DeFi-optimized Superchain L2 with 250ms sub-blocks and 95% lower costs than Ethereum.
eth_getBlockReceipts
Return every transaction receipt in a block on Unichain. Useful for indexers, analytics pipelines, and event backfills across decentralized exchanges, liquidity protocols, and MEV-protected DeFi applications.