eth_blockNumber
Returns the number of the most recent block on Moonbase Alpha.
Why Moonbase? Build on the Moonbeam testnet for risk-free EVM dApp development and deployment testing with free testnet tokens, full EVM compatibility, XCM testing capabilities, and identical feature set to Moonbeam mainnet.
When to Use This Method#
eth_blockNumber is fundamental for Moonbeam developers, dApp testers, and teams validating cross-chain integrations:
- Syncing Applications — Keep your dApp in sync with the latest Moonbase blockchain state
- Transaction Monitoring — Verify confirmations by comparing block numbers
- Event Filtering — Set the correct block range for querying logs on EVM dApp testing, XCM integration validation, and pre-mainnet deployment verification
- Health Checks — Monitor node connectivity and sync status
Parameters#
This method accepts no parameters.
| Parameter | Type | Required | Description |
|---|---|---|---|
| None | - | - | This method takes no parameters |
Returns#
| Field | Type | Description |
|---|---|---|
| result | QUANTITY | Hexadecimal string representing the current block number |
Return format: 0x prefixed hexadecimal (e.g., 0x5BAD55 = 6,008,149 in decimal)
Request#
{
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": 1
}
Response#
Successful Response#
{
"jsonrpc": "2.0",
"id": 1,
"result": "0x5BAD55"
}
Error Response#
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32603,
"message": "Internal error"
}
}
Code Examples#
- cURL
- JavaScript
- Python
- Go
curl -X POST https://api-moonbase-alpha.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": 1
}'
// Using fetch
const response = await fetch('https://api-moonbase-alpha.n.dwellir.com/YOUR_API_KEY', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
method: 'eth_blockNumber',
params: [],
id: 1
})
});
const { result } = await response.json();
const blockNumber = parseInt(result, 16);
console.log('Moonbase block:', blockNumber);
// Using ethers.js
import { JsonRpcProvider } from 'ethers';
const provider = new JsonRpcProvider('https://api-moonbase-alpha.n.dwellir.com/YOUR_API_KEY');
const blockNumber = await provider.getBlockNumber();
console.log('Moonbase block:', blockNumber);
import requests
def get_block_number():
response = requests.post(
'https://api-moonbase-alpha.n.dwellir.com/YOUR_API_KEY',
json={
'jsonrpc': '2.0',
'method': 'eth_blockNumber',
'params': [],
'id': 1
}
)
result = response.json()['result']
return int(result, 16)
block_number = get_block_number()
print(f'Moonbase block: {block_number}')
# Using web3.py
from web3 import Web3
w3 = Web3(Web3.HTTPProvider('https://api-moonbase-alpha.n.dwellir.com/YOUR_API_KEY'))
print(f'Moonbase block: {w3.eth.block_number}')
package main
import (
"context"
"fmt"
"log"
"github.com/ethereum/go-ethereum/ethclient"
)
func main() {
client, err := ethclient.Dial("https://api-moonbase-alpha.n.dwellir.com/YOUR_API_KEY")
if err != nil {
log.Fatal(err)
}
blockNumber, err := client.BlockNumber(context.Background())
if err != nil {
log.Fatal(err)
}
fmt.Printf("Moonbase block: %d\n", blockNumber)
}
Common Use Cases#
1. Block Confirmation Counter#
Monitor transaction confirmations on Moonbase:
async function getConfirmations(provider, txHash) {
const tx = await provider.getTransaction(txHash);
if (!tx || !tx.blockNumber) return 0;
const currentBlock = await provider.getBlockNumber();
return currentBlock - tx.blockNumber + 1;
}
// Wait for specific confirmations
async function waitForConfirmations(provider, txHash, confirmations = 6) {
let currentConfirmations = 0;
while (currentConfirmations < confirmations) {
currentConfirmations = await getConfirmations(provider, txHash);
console.log(`Confirmations: ${currentConfirmations}/${confirmations}`);
await new Promise(r => setTimeout(r, 2000));
}
return true;
}
2. Event Log Filtering#
Query events from recent blocks on Moonbase:
async function getRecentEvents(provider, contract, eventName, blockRange = 100) {
const currentBlock = await provider.getBlockNumber();
const fromBlock = currentBlock - blockRange;
const filter = contract.filters[eventName]();
const events = await contract.queryFilter(filter, fromBlock, currentBlock);
return events;
}
3. Node Health Monitoring#
Check if your Moonbase node is synced:
async function checkNodeHealth(provider) {
try {
const blockNumber = await provider.getBlockNumber();
const block = await provider.getBlock(blockNumber);
const now = Date.now() / 1000;
const blockAge = now - block.timestamp;
if (blockAge > 60) {
console.warn(`Node may be behind. Last block was ${blockAge}s ago`);
return false;
}
console.log(`Node healthy. Latest block: ${blockNumber}`);
return true;
} catch (error) {
console.error('Node unreachable:', error);
return false;
}
}
Performance Optimization#
Caching Strategy#
Cache block numbers to reduce API calls:
class BlockNumberCache {
constructor(ttl = 2000) {
this.cache = null;
this.timestamp = 0;
this.ttl = ttl;
}
async get(provider) {
const now = Date.now();
if (this.cache && (now - this.timestamp) < this.ttl) {
return this.cache;
}
this.cache = await provider.getBlockNumber();
this.timestamp = now;
return this.cache;
}
invalidate() {
this.cache = null;
this.timestamp = 0;
}
}
const blockCache = new BlockNumberCache();
Batch Requests#
Combine with other calls for efficiency:
const batch = [
{ jsonrpc: '2.0', method: 'eth_blockNumber', params: [], id: 1 },
{ jsonrpc: '2.0', method: 'eth_gasPrice', params: [], id: 2 },
{ jsonrpc: '2.0', method: 'eth_chainId', params: [], id: 3 }
];
const response = await fetch('https://api-moonbase-alpha.n.dwellir.com/YOUR_API_KEY', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(batch)
});
const results = await response.json();
Error Handling#
Common errors and solutions:
| Error Code | Description | Solution |
|---|---|---|
| -32603 | Internal error | Retry with exponential backoff |
| -32005 | Rate limit exceeded | Implement rate limiting client-side |
| -32000 | Execution reverted | Check node sync status |
async function safeGetBlockNumber(provider, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await provider.getBlockNumber();
} catch (error) {
if (error.code === -32005) {
await new Promise(r => setTimeout(r, Math.pow(2, i) * 1000));
} else if (i === maxRetries - 1) {
throw error;
}
}
}
}
Related Methods#
eth_getBlockByNumber— Get full block details by numbereth_getBlockByHash— Get block details by hasheth_syncing— Check if node is still syncing