Web3 Methods
The web3_*
namespace contains methods specific to the web3 client implementation.
web3_clientVersion
Returns the current client version string.
Parameters
None
Returns
String
- The current client version
Example
Request:
{
"jsonrpc": "2.0",
"method": "web3_clientVersion",
"params": [],
"id": 1
}
Response:
{
"jsonrpc": "2.0",
"id": 1,
"result": "OPN/v1.0.0/linux-amd64/go1.19"
}
JavaScript Example:
const version = await web3.eth.getNodeInfo();
console.log('Client version:', version);
// Output: OPN/v1.0.0/linux-amd64/go1.19
web3_sha3
Returns Keccak-256 (not SHA3-256) hash of the given data.
Parameters
DATA
- The data to hash
Returns
DATA
- The Keccak-256 hash of the given data
Example
Request:
{
"jsonrpc": "2.0",
"method": "web3_sha3",
"params": ["0x68656c6c6f20776f726c64"],
"id": 2
}
Response:
{
"jsonrpc": "2.0",
"id": 2,
"result": "0x5b2c76da96136d193336fad3fbc049867b8ca157da22f69ae0e4923648250acc"
}
JavaScript Examples:
// Using web3.js
const hash = web3.utils.sha3('hello world');
console.log('Hash:', hash);
// Output: 0x5b2c76da96136d193336fad3fbc049867b8ca157da22f69ae0e4923648250acc
// Direct RPC call
const dataHex = web3.utils.utf8ToHex('hello world');
const hash = await web3.eth.call({
jsonrpc: '2.0',
method: 'web3_sha3',
params: [dataHex],
id: 1
});
Important Notes
Not SHA3-256: This method returns Keccak-256, not the final SHA3-256 standard
Ethereum Compatibility: Matches Ethereum's implementation exactly
Input Format: Input must be hex-encoded with 0x prefix
Common Use Cases
Hashing Strings
function hashString(text) {
const hex = web3.utils.utf8ToHex(text);
return web3.utils.sha3(hex);
}
const hashedMessage = hashString('Hello OPN Chain!');
console.log('Hashed message:', hashedMessage);
Creating Function Selectors
// Get function selector (first 4 bytes of hash)
function getFunctionSelector(signature) {
const hash = web3.utils.sha3(signature);
return hash.substring(0, 10); // 0x + 8 chars = 4 bytes
}
const selector = getFunctionSelector('transfer(address,uint256)');
console.log('Function selector:', selector);
// Output: 0xa9059cbb
Generating Deterministic Addresses
// CREATE2 address calculation
function calculateCreate2Address(deployer, salt, bytecode) {
const bytecodeHash = web3.utils.sha3(bytecode);
const payload = web3.utils.encodePacked(
'0xff',
deployer,
salt,
bytecodeHash
);
const hash = web3.utils.sha3(payload);
return '0x' + hash.substring(26); // Last 20 bytes
}
Error Handling
Both methods have minimal error conditions:
web3_clientVersion Errors
This method rarely fails, but possible errors:
try {
const version = await web3.eth.getNodeInfo();
} catch (error) {
if (error.code === -32603) {
console.error('Internal JSON-RPC error');
}
}
web3_sha3 Errors
Common errors and their handling:
try {
// Invalid hex string
const hash = await web3.utils.sha3('not hex');
} catch (error) {
console.error('Invalid input:', error.message);
}
// Proper error handling
function safeHash(input) {
try {
// Ensure proper hex encoding
if (!web3.utils.isHexStrict(input)) {
input = web3.utils.utf8ToHex(input);
}
return web3.utils.sha3(input);
} catch (error) {
console.error('Hash error:', error);
return null;
}
}
Performance Considerations
Batch Hashing
For multiple hash operations, consider batching:
async function batchHash(inputs) {
const batch = new web3.BatchRequest();
const promises = [];
inputs.forEach((input, index) => {
const request = {
jsonrpc: '2.0',
method: 'web3_sha3',
params: [web3.utils.utf8ToHex(input)],
id: index
};
promises.push(new Promise((resolve) => {
batch.add(
web3.eth.call.request(request, (err, result) => {
resolve(result);
})
);
}));
});
batch.execute();
return Promise.all(promises);
}
// Usage
const hashes = await batchHash(['hello', 'world', 'OPN', 'Chain']);
Client-Side vs RPC
For better performance, use client-side hashing when possible:
// ❌ Slower - RPC call
const hash1 = await web3.currentProvider.send({
jsonrpc: '2.0',
method: 'web3_sha3',
params: ['0x48656c6c6f'],
id: 1
});
// ✅ Faster - Client-side
const hash2 = web3.utils.sha3('0x48656c6c6f');
Integration Examples
With Smart Contracts
// Solidity contract using keccak256
contract HashChecker {
function verifyHash(
string memory data,
bytes32 expectedHash
) public pure returns (bool) {
return keccak256(abi.encodePacked(data)) == expectedHash;
}
}
// JavaScript verification
const data = "Hello OPN!";
const hash = web3.utils.sha3(data);
const contract = new web3.eth.Contract(abi, address);
const isValid = await contract.methods.verifyHash(data, hash).call();
console.log('Hash valid:', isValid);
Event Topic Generation
// Generate event topic for filtering
function getEventTopic(eventSignature) {
return web3.utils.sha3(eventSignature);
}
// Example: Transfer(address,address,uint256)
const transferTopic = getEventTopic('Transfer(address,address,uint256)');
// Use in event filter
const filter = {
address: tokenAddress,
topics: [transferTopic],
fromBlock: 0,
toBlock: 'latest'
};
const events = await web3.eth.getPastLogs(filter);
Compatibility Notes
Ethereum Compatibility
OPN Chain's implementation matches Ethereum exactly:
// This code works identically on Ethereum and OPN Chain
const ethereumHash = web3.utils.sha3('test');
const opnHash = web3.utils.sha3('test');
console.assert(ethereumHash === opnHash, 'Hashes match!');
Library Support
All major libraries support these methods:
// Web3.js
const hash1 = web3.utils.sha3(data);
// Ethers.js
const hash2 = ethers.utils.keccak256(data);
// Viem
import { keccak256 } from 'viem';
const hash3 = keccak256(data);
// All produce the same result
Security Considerations
Hash Collisions
While extremely unlikely, be aware of theoretical risks:
// Use sufficient data length for security
function secureHash(data) {
// Add salt for extra security
const salt = web3.utils.randomHex(32);
return web3.utils.sha3(
web3.utils.encodePacked(salt, data)
);
}
Input Validation
Always validate inputs before hashing:
function validateAndHash(input) {
// Validate input
if (!input || typeof input !== 'string') {
throw new Error('Invalid input');
}
// Sanitize
const sanitized = input.trim();
// Hash
return web3.utils.sha3(sanitized);
}
Questions? Join our Discord for help!
Last updated