在过去的 Web2 时代,互联网由 前端、后端 和 数据库 三大板块组成;进入 Web3 阶段,这种模式被彻底改写。DApp(去中心化应用程序) 不仅运行逻辑上链,还将数据所有权交还用户。本文将拆解完整的 Web3 DApp 架构,并通过一个「链上记事本」实战案例,让你亲手写出第一行 智能合约 与前端代码。
目录
- Web3 DApp 为何与众不同
- 全景架构:8 大核心模块
- 快速上手:5 步搭建 Hello DApp
- 链上记事本实战教程
- FAQ:开发者最关心的 5 个问题
- 下一步精进路线图
1. Web3 DApp 为何与众不同
- 去信任化:信任由代码与共识机制保证,无需单一实体背书。
- 可组合性:智能合约像乐高积木,彼此可调用与叠加。
- 持续性:一旦部署进区块链,运行节点即为「永恒服务器」。
这些特性让 区块链应用 在 DeFi、NFT、链游等领域爆发式增长,催生了海量的 DApp 开发 需求。
2. 全景架构:8 大核心模块
┌───────────────┐ ┌──────────────┐
│ 前端 │◄──────►│ 钱包(EOA) │
│ React/HTML │ │ MetaMask │
└──────┬────────┘ └──────┬───────┘
│ 调用 ethers.js │
▼ │
┌───────────────────────────────┐
│ 区块链节点 │
│ RPC / WebSocket Provider │
└──────┬────────────────────┬───┘
│ │
▼ ▼
┌──────────────┐ ┌─────────────┐
│ 智能合约 │ │ 去中心化储存 │
│ Solidity/Rust│ │ IPFS/Ar │
└──────────────┘ └─────────────┘| 模块 | 关键词 | 作用 |
|---|---|---|
| 前端 | React、Web3 库 | 提供用户交互界面 |
| 钱包 | MetaMask、签名 | 托管私钥、发起交易 |
| RPC 节点 | Infura、Alchemy | 广播交易、读取链上状态 |
| 智能合约 | Solidity、EVM | 执行业务逻辑 |
| EVM | 字节码、Gas | 运行环境,保障一致性 |
| 存储 | IPFS、Arweave | 存放大文件,降本增效 |
| Layer2 | Polygon、Optimism | 扩容、降低 Gas |
| 区块浏览器 | Etherscan、FTMscan | 查看交易、审计合约 |
3. 快速上手:5 步搭建 Hello DApp
环境准备
- 安装 Node.js + npm
- 全局安装
lite-server - 准备好 MetaMask 并切换到 Fantom 测试网
启动本地服务器
mkdir simple-dapp && cd simple-dapp lite-server浏览器访问
http://127.0.0.1:3000/即可实时预览。编写智能合约
新建SaveString.sol,功能对比如下:saveString(_string):地址绑定存储getString():仅自身地址可读
前端三连文件
index.html:极简表单style.css:区块着色,提升可读性script.js:ethers.js 调用合约
联调测试
- 连接钱包 → 输入文字 → 签名交易 → 读取结果
👉 为节约宝贵时间,可直接复用已部署在 Fantom 测试网的合约地址。
4. 链上记事本实战教程
4.1 智能合约代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SaveString {
mapping(address => string) public savedStrings;
function saveString(string memory _string) public {
savedStrings[msg.sender] = _string;
}
function getString() public view returns(string memory) {
return savedStrings[msg.sender];
}
}使用 Remix IDE 编译 → Deploy 到 Fantom testnet → 复制合约地址备用。
4.2 前端关键片段
index.html(节选)
<script src="https://cdn.ethers.io/lib/ethers-5.7.2.umd.min.js"></script>
<script src="script.js"></script>
...
<button onclick="connect()">Connect Wallet</button>
<input id="input" placeholder="Input sentence" />
<button onclick="saveString()">Save Sentence</button>
<button onclick="getString()">Retrieve Sentence</button>script.js
const contractAddress = "0x0287f57a1a17a725428689dfd9e65eca01d82510";
const contractABI = [...]; // 复制 Remix 生成的 ABI
async function connect() {...}
async function saveString() {...}
async function getString() {...}完成后目录结构:
simple-dapp/
├─ index.html
├─ style.css
└─ script.js👉 别忘了用 FTM 水龙头领取测试币,否则会卡在签名步骤。
5. FAQ:开发者最关心的 5 个问题
Q1:上传到主网大约需要多少 Gas?
A:存储 32 字节以内的数据大约花费 21,000 Gas(基础交易费)+ 约 20,000 Gas 的存储费;实际费用取决于链上拥堵程度。Fantom、Polygon 等侧链可节省 90% 以上成本。
Q2:如何保障合约安全?
A:遵循「检查-生效-交互」模式(Checks-Effects-Interactions),并使用 OpenZeppelin 库审计工具。上线前务必跑一遍静态分析与单元测试。
Q3:可以用 React/Next.js 替代 vanilla 代码吗?
A:完全可以,只需封装 ethers.js 的 hooks 即可,例如使用 useContractRead / useContractWrite,可极大提升开发效率。
Q4:用户拒绝签名怎么办?
A:在代码中捕获 provider.send("eth_requestAccounts") 的异常,并给予明确文案提示「请在 MetaMask 中确认连接」。
Q5:如何存放大文件(如图片、视频)?
A:将文件上传 IPFS/Arweave 获得 CID,然后把 CID 字符串存入智能合约即可。
6. 下一步精进路线图
- 框架升级:Next.js + TypeScript + wagmi,带来类型安全与 SSR 优化。
- 测试体系:Hardhat + Foundry,实现一键可多链部署。
- L2 无痛迁移:将合约桥接至 Optimism、zkSync,享受 <0.01 美金交易费。
- DID 结合:引入 WalletConnect & ENS,实现区块链身份一键登录。
掌握上述路线后,你就能将单个「链上记事本」扩展为功能完备的 去中心化 SaaS。现在就打开终端,把第一个 commit 推上去吧!