Decentralized applications (dApps) are applications that operate without relying on centralized servers. Instead, dApps leverage blockchain and oracle technologies to execute backend logic, ensuring tamper-proof and secure operations.
In this technical guide, you’ll learn how to build an end-to-end dApp where users can fetch and store the current price of ETH via a smart contract. The demo code is available on GitHub.
Prerequisites
Before starting, ensure you have the following installed:
What Is a Decentralized Application?
Unlike traditional apps that run backend code on centralized servers, dApps execute backend logic on a blockchain. The frontend and UI can be developed in any language and hosted on standard servers to interact with the decentralized backend.
Advantages of dApps:
✅ No downtime
✅ Enhanced privacy
✅ Censorship resistance
✅ Minimal-trust execution
Challenges:
⚠ Immutable code (harder to update)
⚠ Lower performance (due to decentralized execution)
⚠ Poorer UX (users need Web3 wallets and crypto for gas fees)
Core Components of a dApp
A dApp consists of three key components:
Smart Contracts
- Hosts business logic on the blockchain (e.g., Ethereum).
Frontend / UI
- Built using standard web tech (HTML, JavaScript, React).
- Interfaces with smart contracts via libraries like Web3.js or Ethers.js.
Data Storage
- Off-chain solutions (IPFS, Filecoin) store bulk data, while blockchains manage critical state.
👉 Learn how leading dApps optimize storage
Step 1: Create the Smart Contract
We’ll build a smart contract that fetches the ETH/USD price via Chainlink’s Price Feed and stores it permanently.
Development Setup:
Initialize a Hardhat project:
mkdir chainlink-dapp-example cd chainlink-dapp-example mkdir backend cd backend npm init -y npm install --save-dev hardhat npx hardhat- Create
PriceConsumerV3.solin/contractsand paste the Chainlink feed code. Add storage functionality:
int public storedPrice; function storeLatestPrice() external { storedPrice = getLatestPrice(); }
Step 2: Deploy the Smart Contract
1. Configure Hardhat
Install dependencies:
npm install @chainlink/contracts dotenv- Update
hardhat-config.jswith Rinkeby RPC URL and private key.
2. Deploy to Rinkeby
npx hardhat compile
npx hardhat run --network rinkeby scripts/deploy.js 📌 Save the contract address for the frontend.
Step 3: Build the React Frontend
1. Initialize React App
npx create-react-app frontend
cd frontend
npm install bootstrap ethers 2. Connect to Smart Contract
Update
App.jswith:const contract = new ethers.Contract( "REPLACE_WITH_DEPLOYED_CONTRACT_ADDRESS", ABI, signer );
3. Add Core Functions
Fetch Price:
const getStoredPrice = async () => { const price = await contract.storedPrice(); setStoredPrice(price / 100000000); };Update Price:
const updatePrice = async () => { const tx = await contract.storeLatestPrice(); await tx.wait(); await getStoredPrice(); };
4. UI Rendering
return (
<div className="App">
<h1>ETH Price: ${storedPrice}</h1>
<button onClick={updatePrice}>Update Price</button>
</div>
); FAQs
1. What’s the difference between a dApp and a traditional app?
dApps run on blockchains (decentralized), while traditional apps use centralized servers.
2. Why use Chainlink’s Price Feed?
Chainlink provides real-world data (e.g., ETH/USD) securely on-chain.
3. How much does it cost to deploy a dApp?
Costs vary by blockchain. Testnets (like Rinkeby) offer free deployments.
🚀 Pro Tip: Optimize your dApp’s gas fees by batching transactions!
👉 Explore advanced dApp development tools
This guide covers smart contract creation, deployment, and frontend integration—key steps to launch your dApp. Happy coding! 🎉