Discover which library makes your blockchain journey smoother and why it matters!
Web3.js vs ethers.js in Blockchain / Solidity - When to Use Which
Start learning this pattern below
Jump into concepts and practice - no test required
Imagine you want to build a blockchain app that talks to Ethereum. You try to write all the code yourself to connect, send transactions, and read data from the blockchain.
You quickly realize it's like trying to build a car engine from scratch without any tools or instructions.
Doing everything manually is slow and confusing. You have to handle complex details like encoding data, managing keys, and connecting to nodes all by yourself.
It's easy to make mistakes that break your app or lose money.
Web3.js and ethers.js are like ready-made toolkits that handle all the hard parts for you.
They give you simple commands to interact with the blockchain safely and quickly, so you can focus on building your app's features.
const rawTx = createRawTransaction(...); sendRawTransaction(rawTx);
const tx = await contract.method(args).send();
With these libraries, you can build powerful blockchain apps faster and with less risk.
For example, a developer can easily create a wallet app that sends and receives cryptocurrency using ethers.js without worrying about low-level blockchain details.
Manual blockchain coding is complex and error-prone.
Web3.js and ethers.js simplify blockchain interactions.
They help you build apps faster and safer.
Practice
Web3.js and ethers.js?Solution
Step 1: Understand library origins
Web3.js is an older, larger library designed for Ethereum interaction.Step 2: Compare library features
ethers.js is newer, designed to be lightweight and simpler to use.Final Answer:
Web3.js is larger and older, while ethers.js is lighter and simpler. -> Option DQuick Check:
Library size and age = A [OK]
- Thinking ethers.js only works on backend
- Confusing blockchain support (Bitcoin vs Ethereum)
- Believing ethers.js can't send transactions
Solution
Step 1: Recall ethers.js provider syntax
ethers.js usesethers.providers.JsonRpcProvider()to create a JSON RPC provider.Step 2: Identify correct syntax
const provider = new ethers.providers.JsonRpcProvider(); matches the correct ethers.js syntax; others mix Web3.js or incorrect classes.Final Answer:
const provider = new ethers.providers.JsonRpcProvider(); -> Option AQuick Check:
ethers.js provider creation = D [OK]
- Mixing Web3.js and ethers.js syntax
- Using Web3 classes with ethers.js
- Incorrect capitalization or namespaces
const ethers = require('ethers');
const provider = new ethers.providers.JsonRpcProvider();
(async () => {
const blockNumber = await provider.getBlockNumber();
console.log(blockNumber);
})();Solution
Step 1: Understand provider and method
TheJsonRpcProviderconnects to Ethereum andgetBlockNumber()returns the latest block number as a number.Step 2: Analyze async function output
The code logs the block number to console, so output is a number representing current block.Final Answer:
The current Ethereum block number as a number. -> Option CQuick Check:
getBlockNumber() returns number [OK]
- Expecting a string instead of number
- Thinking getBlockNumber() is missing
- Assuming provider is uninitialized
const Web3 = require('web3');
const web3 = new Web3();
(async () => {
const balance = await web3.eth.getBalance('0x123...');
console.log(balance);
})();Solution
Step 1: Check Web3 instance creation
Web3 requires a provider URL (like HTTP or WebSocket) when instantiated to connect to Ethereum.Step 2: Identify missing provider
The code createsnew Web3()without a provider, so calls likegetBalancewill fail.Final Answer:
Missing provider URL when creating Web3 instance. -> Option AQuick Check:
Web3 needs provider URL [OK]
- Thinking getBalance is not async
- Assuming address format is wrong
- Believing console.log can't print balance
Solution
Step 1: Identify correct method to send transaction
In ethers.js,signer.sendTransaction()sends a transaction and returns a transaction response.Step 2: Wait for transaction mining
Callingtx.wait()waits for the transaction to be mined before proceeding.Step 3: Confirm correct usage
const tx = await signer.sendTransaction(txData; await tx.wait(); console.log('Mined:', tx.hash); correctly awaits sending, then waits for mining, then logs the hash.Final Answer:
const tx = await signer.sendTransaction(txData); await tx.wait(); console.log('Mined:', tx.hash); -> Option BQuick Check:
sendTransaction + wait() = C [OK]
- Not awaiting sendTransaction()
- Using provider instead of signer to send
- Calling non-existent send() method
