# Ethers.js vs Web3.js — आपको कौन सी Library Use करनी चाहिए?
जब आप Ethereum dApps बना रहे हों, तो आपको blockchain के साथ interact करने के लिए एक JavaScript library की ज़रूरत है। दो dominant choices हैं Ethers.js और Web3.js। दोनों wallet connections, contract interactions, और transaction management को enable करती हैं — लेकिन वे design philosophy, bundle size, और developer experience में significantly differ करती हैं। यह guide दोनों libraries को compare करती है ताकि आप अपने project के लिए सही choice कर सकें।
Quick Comparison Table
| Feature | Ethers.js | Web3.js |
|---------|-----------|---------|
| Bundle size | 116 KB (minified) | 600+ KB (minified) |
| API design | Modern, clean, TypeScript-first | Legacy, callback-heavy |
| TypeScript | Full native support | @types/web3 के माध्यम से added |
| Maintenance | Actively maintained | Slower updates |
| Documentation | Excellent | Good but scattered |
| Learning curve | Moderate | Steeper |
| Provider management | Simple (BrowserProvider) | Complex (Web3.providers) |
| ENS support | Built-in | Separate package के माध्यम से |
| BigNumber | Native BigInt + custom BigNumber | Custom BigNumber |
| Community | तेज़ी से बढ़ रहा है | Established |
| Best for | नए projects, production dApps | Legacy projects, Web3.js v4 |
Installation
Ethers.js v6
npm install ethers
import { BrowserProvider, Contract } from 'ethers';
Web3.js v4
npm install web3
import { Web3 } from 'web3';
Ethereum से Connect करना
Ethers.js
import { BrowserProvider } from 'ethers';
// MetaMask से connect करें
const provider = new BrowserProvider(window.ethereum);
const signer = await provider.getSigner();
const address = await signer.getAddress();
console.log('Connected:', address);
Clean separation:
Provider: Blockchain तक read-only access
Signer: Write access (transactions, signing)
Web3.js
import { Web3 } from 'web3';
// MetaMask से connect करें
const web3 = new Web3(window.ethereum);
const accounts = await web3.eth.requestAccounts();
const address = accounts[0];
console.log('Connected:', address);
Read/write operations के बीच कम explicit separation।
Blockchain Data को Read करना
Ethers.js
// Balance प्राप्त करें
const balance = await provider.getBalance(address);
console.log('Balance:', ethers.formatEther(balance), 'ETH');
// Block number प्राप्त करें
const blockNumber = await provider.getBlockNumber();
// Gas price प्राप्त करें
const feeData = await provider.getFeeData();
console.log('Gas price:', ethers.formatUnits(feeData.gasPrice, 'gwei'), 'gwei');
// Transaction प्राप्त करें
const tx = await provider.getTransaction(txHash);
Web3.js
// Balance प्राप्त करें
const balance = await web3.eth.getBalance(address);
console.log('Balance:', web3.utils.fromWei(balance, 'ether'), 'ETH');
// Block number प्राप्त करें
const blockNumber = await web3.eth.getBlockNumber();
// Gas price प्राप्त करें
const gasPrice = await web3.eth.getGasPrice();
console.log('Gas price:', web3.utils.fromWei(gasPrice, 'gwei'), 'gwei');
// Transaction प्राप्त करें
const tx = await web3.eth.getTransaction(txHash);
बहुत similar API, लेकिन different utility function namespaces।
Transactions भेजना
Ethers.js
const signer = await provider.getSigner();
const tx = await signer.sendTransaction({
to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb',
value: ethers.parseEther('0.1')
});
console.log('Transaction hash:', tx.hash);
// Confirmation के लिए wait करें
const receipt = await tx.wait();
console.log('Confirmed in block:', receipt.blockNumber);
tx.wait() एक promise return करता है जो transaction mine होने पर resolve होता है।
Web3.js
const accounts = await web3.eth.getAccounts();
const tx = await web3.eth.sendTransaction({
from: accounts[0],
to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb',
value: web3.utils.toWei('0.1', 'ether')
});
console.log('Transaction hash:', tx.transactionHash);
console.log('Confirmed in block:', tx.blockNumber);
Web3.js receipt को directly return करता है (कोई separate wait() call नहीं)।
Contract Interaction
Ethers.js
import { Contract } from 'ethers';
const abi = [
"function balanceOf(address owner) view returns (uint256)",
"function transfer(address to, uint256 amount) returns (bool)"
];
const contract = new Contract(contractAddress, abi, signer);
// Read function (कोई gas नहीं)
const balance = await contract.balanceOf(address);
console.log('Balance:', ethers.formatUnits(balance, 18));
// Write function (gas cost होता है)
const tx = await contract.transfer('0x...', ethers.parseUnits('10', 18));
await tx.wait();
console.log('Transfer complete');
Human-readable ABI — आप JSON की जगह strings के रूप में interfaces को define कर सकते हैं।
Web3.js
const abi = [
{
"name": "balanceOf",
"type": "function",
"inputs": [{"name": "owner", "type": "address"}],
"outputs": [{"name": "", "type": "uint256"}],
"stateMutability": "view"
},
{
"name": "transfer",
"type": "function",
"inputs": [
{"name": "to", "type": "address"},
{"name": "amount", "type": "uint256"}
],
"outputs": [{"name": "", "type": "bool"}]
}
];
const contract = new web3.eth.Contract(abi, contractAddress);
// Read function
const balance = await contract.methods.balanceOf(address).call();
console.log('Balance:', web3.utils.fromWei(balance, 'ether'));
// Write function
const accounts = await web3.eth.getAccounts();
await contract.methods.transfer('0x...', web3.utils.toWei('10', 'ether'))
.send({ from: accounts[0] });
JSON ABI required — अधिक verbose, लेकिन सभी tools के साथ compatible।
Event Listening
Ethers.js
// Transfer events को listen करें
contract.on('Transfer', (from, to, amount, event) => {
console.log(Transfer from ${from} to ${to}: ${ethers.formatUnits(amount, 18)} tokens);
});
// Past events को query करें
const filter = contract.filters.Transfer(null, myAddress);
const events = await contract.queryFilter(filter, startBlock, endBlock);
Filters के साथ clean event API।
Web3.js
// Transfer events को listen करें
contract.events.Transfer()
.on('data', (event) => {
console.log(Transfer from ${event.returnValues.from} to ${event.returnValues.to});
});
// Past events को query करें
const events = await contract.getPastEvents('Transfer', {
filter: { to: myAddress },
fromBlock: startBlock,
toBlock: endBlock
});
अधिक verbose event handling।
BigNumber Handling
Ethers.js
Ethers.js v6 अधिकतर operations के लिए native JavaScript BigInt का उपयोग करता है, advanced needs के लिए एक custom BigNumber class के साथ:
const amount = ethers.parseEther('1.5'); // BigInt: 1500000000000000000n
const formatted = ethers.formatEther(amount); // "1.5"
// Math operations
const doubled = amount * 2n; // Native BigInt
Web3.js
Web3.js एक custom BigNumber implementation का उपयोग करता है:
const amount = web3.utils.toWei('1.5', 'ether'); // "1500000000000000000"
const formatted = web3.utils.fromWei(amount, 'ether'); // "1.5"
// Math operations के लिए BigInt conversion की ज़रूरत है
const doubled = (BigInt(amount) * 2n).toString();
Web3.js large numbers के लिए strings return करता है, math के लिए manual conversion की ज़रूरत है।
Bundle Size
Ethers.js: ~116 KB minified
Web3.js: ~600 KB minified
Production apps के लिए, bundle size matter करता है:
- Ethers.js 5x छोटा है, जिससे faster load times होते हैं
- Mobile users और performance-sensitive dApps के लिए critical
TypeScript Support
Ethers.js
Native TypeScript — ground up से TypeScript में लिखा गया:
import { BrowserProvider, Contract, Signer } from 'ethers';
const provider: BrowserProvider = new BrowserProvider(window.ethereum);
const signer: Signer = await provider.getSigner();
Full type inference, कोई @types package की ज़रूरत नहीं।
Web3.js
@types/web3 के माध्यम से added — separate type definitions की ज़रूरत है:
npm install --save-dev @types/web3
import { Web3 } from 'web3';
const web3: Web3 = new Web3(window.ethereum);
Types कम precise होते हैं और outdated हो सकते हैं।
ENS (Ethereum Name Service) Support
Ethers.js
Built-in ENS support — names को addresses में automatically resolve करें:
const address = await provider.resolveName('vitalik.eth');
// "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
const name = await provider.lookupAddress(address);
// "vitalik.eth"
// Transactions में directly ENS का उपयोग करें
const tx = await signer.sendTransaction({
to: 'vitalik.eth',
value: ethers.parseEther('0.1')
});
Web3.js
Separate package की ज़रूरत (web3-eth-ens):
npm install web3-eth-ens
const address = await web3.eth.ens.getAddress('vitalik.eth');
कम integrated, अधिक setup की ज़रूरत।
Migration Guide: Web3.js → Ethers.js
Provider Setup
Before (Web3.js):
const web3 = new Web3(window.ethereum);
After (Ethers.js):
const provider = new BrowserProvider(window.ethereum);
const signer = await provider.getSigner();
Balance प्राप्त करना
Before:
const balance = await web3.eth.getBalance(address);
const eth = web3.utils.fromWei(balance, 'ether');
After:
const balance = await provider.getBalance(address);
const eth = ethers.formatEther(balance);
Contract Interaction
Before:
const contract = new web3.eth.Contract(abi, address);
const balance = await contract.methods.balanceOf(owner).call();
After:
const contract = new Contract(address, abi, provider);
const balance = await contract.balanceOf(owner);
Transactions भेजना
Before:
await contract.methods.transfer(to, amount).send({ from: account });
After:
const tx = await contract.transfer(to, amount);
await tx.wait();
आपको कौन सी Choose करनी चाहिए?
Ethers.js choose करें अगर:
- आप एक नया project शुरू कर रहे हैं
- Bundle size matter करता है (mobile, performance)
- आप TypeScript का उपयोग करते हैं
- आपको modern, clean API चाहिए
- ENS support की ज़रूरत है
- आप active maintenance और updates पसंद करते हैं
Web3.js choose करें अगर:
- आप legacy code को maintain कर रहे हैं
- आपकी team पहले से Web3.js से familiar है
- आपको old tools के साथ compatibility चाहिए
- आप established ecosystem को prefer करते हैं
- आप Web3.js v4 में migrate कर रहे हैं (बहुत improved)
Conclusion
Ethers.js अधिकतर नए projects के लिए modern choice है। इसका smaller bundle size, cleaner API, native TypeScript support, और built-in ENS इसे production dApps के लिए ideal बनाता है। Web3.js legacy projects के लिए viable रहता है, लेकिन Ethers.js नई development के लिए de facto standard बन गया है।
आज ही Ethers.js के साथ building शुरू करें — इसे अपने dApp में integrate करें और difference को experience करें। Solingo के hands-on Web3 challenges के साथ blockchain interactions practice करें ताकि दोनों libraries में master बन सकें।
अगले steps:
- एक existing Web3.js project को Ethers.js में migrate करें
- Scratch से Ethers.js का उपयोग करके एक dApp बनाएं
- अपने production build में bundle sizes को compare करें
- Multicall और custom providers जैसे advanced features को explore करें