eth_getBlockByNumber - Bittensor RPC Method
Retrieve complete block data by block number on Bittensor. Perfect for AI/ML developers, subnet operators, and teams building decentralized machine learning applications building on the decentralized machine intelligence network built around subnets, TAO staking, and validator-miner coordination.
Returns information about a block by block number on Bittensor.
Why Bittensor? Build on the decentralized machine intelligence network built around subnets, TAO staking, and validator-miner coordination with Yuma Consensus, subnet-based specialization, dual Substrate and EVM surfaces, and onchain incentive coordination.
When to Use This Method
eth_getBlockByNumber is essential for AI/ML developers, subnet operators, and teams building decentralized machine learning applications:
- Block explorers and analytics dashboards: Display comprehensive block data and chain metrics for end-user interfaces on Bittensor
- Transaction indexers processing block contents: Extract and index every transaction within a block for data pipelines and search backends
- Cross-chain bridges verifying block data: Validate block headers and transaction proofs for decentralized AI inference, subnet-specific AI models, TAO staking, and cross-subnet AI collaboration
- Timestamp-based logic: Verify block age and enforce time-dependent contract logic on the decentralized machine intelligence network built around subnets, TAO staking, and validator-miner coordination
Common Use Cases
1. Process All Transactions in the Latest Block
Fetch the latest block on Bittensor with full transaction objects, then iterate through each transaction to extract sender, receiver, value, and gas data. This pattern powers indexers, analytics dashboards, and event backfill pipelines.
import { JsonRpcProvider, formatEther } from 'ethers';
const provider = new JsonRpcProvider('https://api-bittensor-mainnet.n.dwellir.com/YOUR_API_KEY');
async function processLatestBlock() {
const block = await provider.getBlock('latest', true);
if (!block) return;
console.log(`Block #${block.number}: ${block.transactions.length} transactions`);
for (const tx of block.prefetchedTransactions) {
console.log(` ${tx.hash}`);
console.log(` From: ${tx.from} To: ${tx.to}`);
console.log(` Value: ${formatEther(tx.value)} Gas: ${tx.gasLimit.toString()}`);
}
}
processLatestBlock();2. Monitor New Blocks with a Polling Loop
Poll eth_getBlockByNumber at regular intervals to detect new blocks as they are produced on Bittensor. This lightweight pattern is suitable for bots, watchers, and notification services that need near-real-time block awareness.
from web3 import Web3
import time
w3 = Web3(Web3.HTTPProvider('https://api-bittensor-mainnet.n.dwellir.com/YOUR_API_KEY'))
last_block = w3.eth.block_number
print(f'Starting from block #{last_block}')
while True:
current_block = w3.eth.block_number
if current_block > last_block:
for block_num in range(last_block + 1, current_block + 1):
block = w3.eth.get_block(block_num)
tx_count = len(block.transactions)
print(f'New block #{block.number}: {tx_count} txns, '
f'gas used {block.gasUsed}')
last_block = current_block
time.sleep(2)3. Verify Block Finality on L2 Chains
Layer 2 rollup chains on the decentralized machine intelligence network built around subnets, TAO staking, and validator-miner coordination expose additional block tags that indicate settlement confidence. Use safe or finalized tags alongside the base latest tag for use cases requiring strong finality guarantees.
package main
import (
"context"
"fmt"
"log"
"math/big"
"github.com/ethereum/go-ethereum/ethclient"
)
func main() {
client, _ := ethclient.Dial("https://api-bittensor-mainnet.n.dwellir.com/YOUR_API_KEY")
// Latest block (may be unconfirmed on L2)
latest, _ := client.BlockByNumber(context.Background(), nil)
fmt.Printf("Latest block: %d (timestamp: %d)\n",
latest.Number().Uint64(), latest.Time())
// Finalized block (settled on L1 for rollups)
finalized, _ := client.BlockByNumber(context.Background(),
big.NewInt(int64(RPCLatestBlockNumber-32))) // placeholder: use rpc.FinalizedBlockNumber
if finalized != nil {
fmt.Printf("Finalized block: %d\n", finalized.Number().Uint64())
}
}Best Practices
- Cache block data by block number: Blocks are immutable once finalized, so cache results indefinitely keyed by block number to eliminate redundant API calls
- Use
latesttag for most use cases; avoidpendingfor production: Thependingtag returns speculative data that may never be included in the canonical chain - For L2 chains, check chain-specific finality tags: Tags like
safeandfinalizedprovide settlement guarantees specific to each rollup's proof mechanism - Combine with
eth_getBlockReceiptsfor efficient receipt scanning: When you need both block headers and transaction outcomes, useeth_getBlockReceiptsalongside this method rather than fetching receipts individually
Code Examples
Error Handling
| Error Code | Message | Description |
|---|---|---|
| -32602 | Invalid params | Invalid block number or parameter format |
| -32000 | Block not found | Block does not exist |
Related Methods
eth_blockNumber- Get latest block numbereth_getBlockByHash- Get block by hasheth_getTransactionByHash- Get transaction details
eth_blockNumber
Get the current block height on Bittensor. Essential for syncing dApps, monitoring transaction confirmations, and blockchain state tracking.
eth_getBlockByHash
Retrieve complete block data by block hash on Bittensor. Essential for AI/ML developers, subnet operators, and teams building decentralized machine learning applications building on the decentralized machine intelligence network built around subnets, TAO staking, and validator-miner coordination.