curl --request POST \
--url https://nd-422-757-666.p2pify.com/0a9d79d93fb2f4a4b1e04695da2b77a7 \
--header 'Content-Type: application/json' \
--data '{
"id": 1,
"jsonrpc": "2.0",
"method": "web3_clientVersion",
"params": []
}'
{
"jsonrpc": "<string>",
"id": 123,
"result": "<string>"
}
curl --request POST \
--url https://nd-422-757-666.p2pify.com/0a9d79d93fb2f4a4b1e04695da2b77a7 \
--header 'Content-Type: application/json' \
--data '{
"id": 1,
"jsonrpc": "2.0",
"method": "web3_clientVersion",
"params": []
}'
{
"jsonrpc": "<string>",
"id": 123,
"result": "<string>"
}
none
string
— a string identifying the type of client, version, operating system, and language version running on the nodeweb3_clientVersion
code examplesChainstackProvider
in ethers.js
: ethers ChainstackProvider Documentation.const ethers = require("ethers");
// Create a ChainstackProvider instance for Ethereum mainnet
const chainstack = new ethers.ChainstackProvider("mainnet");
const clientVersion = async () => {
const version = await chainstack.send("web3_clientVersion");
console.log(`Client version: ${version}`);
};
clientVersion();
web3_clientVersion
method can be to verify which client is running to then decide which method to run.
Let’s say you have a DApp that needs to retrieve all of the transaction receipts in a block; the Erigon client has a method for this, eth_getBlockReceipts
, but with Geth, this method is only available starting from V1.13.0. You can use the web3_clientVersion
method in your logic to identify which client you are using to see if you have the method available.
eth_getBlockReceipts
on any EVM-compatible chain.const { Web3, Web3PluginBase } = require("web3");
const NODE_URL = "CHAINSTACK_NODE_URL";
const web3 = new Web3(NODE_URL);
// Define the ExtraMethods class
class ExtraMethods extends Web3PluginBase {
pluginNamespace = 'extra';
async getBlockReceipts(blockNumber) {
return this.requestManager.send({
method: 'eth_getBlockReceipts',
params: [blockNumber],
});
}
}
web3.registerPlugin(new ExtraMethods());
// Get client version
async function getClient() {
const client = await web3.eth.getNodeInfo();
return client;
}
// Extract the client's name and version
async function getClientName() {
const clientVersion = await getClient();
// Split the clientVersion string by '/'
let parts = clientVersion.split('/');
// Split the second part by '-' and take the first element
let version = parts[1].split('-')[0];
// Concatenate the client name and version
let clientNameWithVersion = parts[0] + '/' + version;
console.log(clientNameWithVersion);
return clientNameWithVersion;
}
// Parse version from version string
function parseVersion(versionString) {
const versionMatch = versionString.match(/(\d+\.\d+\.\d+)/);
return versionMatch ? versionMatch[1] : null;
}
// Compare versions
function isVersionGreaterThanOrEqual(v1, v2) {
const v1Parts = v1.split('.').map(Number);
const v2Parts = v2.split('.').map(Number);
for (let i = 0; i < Math.max(v1Parts.length, v2Parts.length); i++) {
const num1 = v1Parts[i] || 0;
const num2 = v2Parts[i] || 0;
if (num1 > num2) return true;
if (num1 < num2) return false;
}
return true; // versions are equal
}
// Get the receipts based on the client
async function getAllReceipts(blockId) {
const clientNameWithVersion = await getClientName();
const [clientName, clientVersion] = clientNameWithVersion.split('/');
if (clientName === 'Geth') {
const version = parseVersion(clientVersion);
if (isVersionGreaterThanOrEqual(version, '1.13.0')) {
console.log('Client is Geth with supported version.');
const receipts = await web3.extra.getBlockReceipts(blockId);
return receipts;
} else {
console.log('Client is Geth, but version is not supported.');
}
} else if (clientName === 'erigon') {
console.log('Client is Erigon');
const receipts = await web3.extra.getBlockReceipts(blockId);
return receipts;
} else {
console.log('Client version is not Geth or Erigon');
}
}
async function main() {
try {
const receipts = await getAllReceipts('latest');
if (receipts !== undefined) {
console.log(receipts);
}
} catch (error) {
console.error(error);
}
}
main();
getBlockReceipts
Method:getBlockReceipts
function is a part of the ExtraMethods
class, which extends the functionality of the web3
object via the Web3PluginBase
. This method uses this.requestManager.send
to call the eth_getBlockReceipts
JSON-RPC method, passing a single parameter blockNumber
. The function formats the input and output values and returns the resulting receipts. This method is accessible through web3.extra.getBlockReceipts
due to the registration of the ExtraMethods
plugin with web3.registerPlugin(new ExtraMethods())
.getClient
Function:web3.eth.getNodeInfo
call, which internally calls the web3_clientVersion
JSON-RPC method without parameters. It formats the returned value and provides the full client version string.getClientName
Function:getClientName
calls getClient
to get the complete client version string. It then extracts both the client’s name and its version by splitting the version string at the first /
and -
characters. The function concatenates these parts to form a string in the format “ClientName/Version”.getAllReceipts
Function:getClientName
to retrieve the name and version of the client in a combined format. It checks if the client is Geth
and, if so, further verifies whether its version is greater than or equal to 1.13.0
using the parseVersion
and isVersionGreaterThanOrEqual
functions. If the client is Geth
with a supported version or Erigon
, the function proceeds to fetch block receipts using web3.extra.getBlockReceipts
. If the client is neither a supported version of Geth
nor Erigon
, it logs a message indicating this.parseVersion
and isVersionGreaterThanOrEqual
are included for parsing the version string and comparing it against a specified minimum version. parseVersion
extracts the semantic version number from the client version string, and isVersionGreaterThanOrEqual
compares this version against the specified minimum version, 1.13.0
in this case.main
function serves as the entry point for execution. It attempts to call getAllReceipts
with a specified block identifier, handling any exceptions and logging the results if available.The client running on this node.
The response is of type object
.
Was this page helpful?