curl --request POST \
--url https://nd-828-700-214.p2pify.com/a9bca2f0f84b54086ceebe590316fff3 \
--header 'Content-Type: application/json' \
--data '{
"id": 1,
"jsonrpc": "2.0",
"method": "web3_clientVersion"
}'
{
"jsonrpc": "<string>",
"id": 123,
"result": "<string>"
}
curl --request POST \
--url https://nd-828-700-214.p2pify.com/a9bca2f0f84b54086ceebe590316fff3 \
--header 'Content-Type: application/json' \
--data '{
"id": 1,
"jsonrpc": "2.0",
"method": "web3_clientVersion"
}'
{
"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 examplesconst Web3 = require("web3");
const NODE_URL = "CHAINSTACK_NODE_URL";
const web3 = new Web3(NODE_URL);
async function getClient() {
const client = await web3.eth.getNodeInfo();
console.log(client);
}
getClient();
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 transactions receipts in a block; the Erigon and Bor clients both have a method for this, but the eth_getBlockReceipts
method from Erigon will not work on Bor, and the eth_getTransactionReceiptsByBlock
method from Bor will not work on Erigon. You can use the web3_clientVersion
method in your logic to first identify which method must be used.
Here is an implementation of this use case using web3.js:
const Web3 = require("web3");
const NODE_URL = "CHAINSTACK_NODE_URL";
const web3 = new Web3(NODE_URL);
// getBlockReceipts Erigon method
async function getBlockReceipts(blockId) {
web3.extend({
property: 'eth',
methods: [{
name: 'getBlockReceipts',
call: 'eth_getBlockReceipts',
params: 1,
inputFormatter: [web3.extend.formatters.inputDefaultBlockNumberFormatter],
outputFormatter: null
}]
});
const receipts = await web3.eth.getBlockReceipts(blockId)
return receipts
}
// getTransactionReceiptsByBlock Bor method
async function getTransactionReceiptsByBlock(blockId) {
web3.extend({
property: 'eth',
methods: [{
name: 'getTransactionReceiptsByBlock',
call: 'eth_getTransactionReceiptsByBlock',
params: 1,
inputFormatter: [web3.extend.formatters.inputDefaultBlockNumberFormatter],
outputFormatter: null
}]
});
const receipts = await web3.eth.getTransactionReceiptsByBlock(blockId)
return receipts
}
// Get client version
async function getClientVersion() {
web3.extend({
property: 'eth',
methods: [{
name: 'getClientVersion',
call: 'web3_clientVersion',
params: 0,
inputFormatter: [],
outputFormatter: null
}]
});
const clientVersion = await web3.eth.getClientVersion();
return clientVersion
}
// Extract the client's name
async function getClientName() {
const clientVersion = await getClientVersion();
const clientName = clientVersion.split('/')[0];
return clientName
}
// Get the receipts based on the client
async function getAllReceipts(blockId) {
const clientName = await getClientName()
if (clientName === 'bor') {
console.log('Client is Bor');
const receipts = getTransactionReceiptsByBlock(blockId)
return receipts
} else if (clientName === 'erigon') {
console.log('Client is Erigon');
const receipts = getBlockReceipts(blockId)
return receipts
} else {
// Do something else if version is neither Bor nor Erigon
console.log('Client version is not Bor or Erigon');
}
}
async function main() {
try {
const receipts = await getAllReceipts('latest');
console.log(receipts);
} catch (error) {
console.error(error);
}
}
main();
getBlockReceipts
function uses the web3.extend
method to extend the eth property of the web3
object with a new method called getBlockReceipts
. This method calls the eth_getBlockReceipts
JSON-RPC method with a single parameter blockId
and formats the input and output values. The function then calls the getBlockReceipts
method using the web3.eth.getBlockReceipts
call and returns the resulting receipts.
The getTransactionReceiptsByBlock
function similarly extends the eth
property of the web3
object with a new method called getTransactionReceiptsByBlock
. This method calls the eth_getTransactionReceiptsByBlock
JSON-RPC method with a single parameter blockId
and formats the input and output values. The function then calls the getTransactionReceiptsByBlock
method using the web3.eth.getTransactionReceiptsByBlock
call and returns the resulting receipts.
The getClientVersion
function extends the eth property of the web3
object with a new method called getClientVersion
. This method calls the web3_clientVersion
JSON-RPC method with no parameters and formats the input and output values. The function then calls the getClientVersion
method using the web3.eth.getClientVersion
call and returns the resulting client version.
The getClientName
function calls getClientVersion
to get the client version and extracts the name of the client by splitting the version string at the first /
character.
The getAllReceipts
function calls getClientName
to get the name of the client and then selects the appropriate method to use for retrieving the receipts. If the client is Bor, it calls getTransactionReceiptsByBlock
, and if the client is Erigon, it calls getBlockReceipts
. If the client is neither Bor nor Erigon, the function logs a message and returns null.The client version information
The response is of type object
.
Was this page helpful?