Skip to main content

eth_blockNumber

Returns the number of the most recent block on zkSync Era.

Why zkSync? Build on Matter Labs' flagship zkEVM powering the Elastic Network of interoperable hyperchains with ZK Stack modular framework, hyperchain interoperability, native account abstraction, and $1.9B in tokenized real-world assets.

When to Use This Method#

eth_blockNumber is fundamental for ZK developers, RWA tokenization teams, and builders launching custom L2/L3 chains:

  • Syncing Applications — Keep your dApp in sync with the latest zkSync blockchain state
  • Transaction Monitoring — Verify confirmations by comparing block numbers
  • Event Filtering — Set the correct block range for querying logs on RWA tokenization ($1.9B, 25% market share), hyperchain deployment via ZK Stack, and cross-chain DeFi
  • Health Checks — Monitor node connectivity and sync status

Parameters#

This method accepts no parameters.

ParameterTypeRequiredDescription
None--This method takes no parameters

Returns#

FieldTypeDescription
resultQUANTITYHexadecimal 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 -X POST https://api-zksync-era-mainnet-full.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": 1
}'

Common Use Cases#

1. Block Confirmation Counter#

Monitor transaction confirmations on zkSync:

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 zkSync:

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 zkSync 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-zksync-era-mainnet-full.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 CodeDescriptionSolution
-32603Internal errorRetry with exponential backoff
-32005Rate limit exceededImplement rate limiting client-side
-32000Execution revertedCheck 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;
}
}
}
}