Web3代表了互联网的下一代——一个去中心化、用户拥有数据所有权的网络。本文将从区块链基础概念出发,带你完成从智能合约编写到DApp部署的完整流程。
一、什么是Web3?
Web3是基于区块链技术的去中心化互联网愿景:
- Web1.0(1990-2004):只读网页,用户是信息的消费者
- Web2.0(2004-至今):可读可写,平台拥有数据,用户生成内容
- Web3.0(未来):可读可写可拥有,用户通过钱包控制身份和资产
核心特征:无需许可(任何人可参与)、抗审查(没有中心化控制)、原生支付(内置加密货币)。
二、区块链基础
区块链是一个分布式账本,关键特性:
区块链 = 去中心化 + 不可篡改 + 透明可验证 + 共识机制
核心概念
- 区块(Block):包含交易记录、时间戳、前一区块哈希的数据结构
- 共识机制:PoW(工作量证明,比特币)、PoS(权益证明,以太坊2.0)
- Gas:执行交易的计算费用,防止网络滥用
- 钱包:管理私钥和公钥的工具,私钥=资产控制权
// 区块结构示意
struct Block {
index: u64,
timestamp: u64,
transactions: Vec<Transaction>,
previous_hash: String,
nonce: u64,
hash: String,
}
三、智能合约
智能合约是部署在区块链上的自动执行程序,满足条件即触发执行:
// 智能合约伪代码
contract Escrow {
address buyer;
address seller;
uint256 amount;
bool released;
function confirmDelivery() public {
require(msg.sender == buyer, "Only buyer");
require(!released, "Already released");
released = true;
payable(seller).transfer(amount);
}
}
智能合约的特点:一旦部署无法修改(除非预留升级机制)、所有操作透明、执行结果确定。
四、Solidity基础
Solidity是以太坊上最流行的智能合约语言,语法类似JavaScript:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract MyToken {
string public name;
string public symbol;
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
event Transfer(address indexed from, address indexed to, uint256 value);
constructor(string memory _name, string memory _symbol, uint256 _supply) {
name = _name;
symbol = _symbol;
totalSupply = _supply;
balanceOf[msg.sender] = _supply;
}
function transfer(address to, uint256 amount) public returns (bool) {
require(balanceOf[msg.sender] >= amount, "Insufficient balance");
balanceOf[msg.sender] -= amount;
balanceOf[to] += amount;
emit Transfer(msg.sender, to, amount);
return true;
}
}
Solidity核心概念
- 数据类型:uint256, int256, bool, address, string, bytes, mapping
- 可见性:public(外部可调用)、internal(合约内)、private(仅合约内)
- 修饰符:view(只读)、pure(无状态)、payable(可接收ETH)
- 事件:Event,用于记录链上日志,前端可监听
五、以太坊与EVM
EVM(以太坊虚拟机)是智能合约的运行环境:
| 特性 | 说明 |
|---|---|
| 图灵完备 | 理论上可执行任何计算 |
| 确定性 | 相同输入始终产生相同输出 |
| 隔离执行 | 合约无法访问其他合约的私有状态 |
| Gas限制 | 防止无限循环,必须在gas耗尽前完成 |
EVM兼容链(EVM-Compatible)如BSC、Polygon、Arbitrum等,可以复用以太坊的开发工具和合约代码。
六、Hardhat开发环境
Hardhat是最流行的以太坊开发框架:
# 初始化项目
mkdir my-dapp && cd my-dapp
npm init -y
npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox
npx hardhat init
hardhat.config.js配置示例:
require("@nomicfoundation/hardhat-toolbox");
module.exports = {
solidity: "0.8.20",
networks: {
sepolia: {
url: process.env.SEPOLIA_RPC_URL,
accounts: [process.env.PRIVATE_KEY],
},
},
};
常用Hardhat命令:
npx hardhat compile— 编译合约npx hardhat test— 运行测试npx hardhat node— 启动本地节点npx hardhat run scripts/deploy.js— 部署合约
七、部署ERC-20代币
使用OpenZeppelin库快速创建标准代币:
npm install @openzeppelin/contracts
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract FadeyToken is ERC20, Ownable {
constructor() ERC20("Fadey Token", "FTK") Ownable(msg.sender) {
_mint(msg.sender, 1_000_000 * 10 ** decimals());
}
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
}
部署脚本 scripts/deploy.js:
const hre = require("hardhat");
async function main() {
const Token = await hre.ethers.getContractFactory("FadeyToken");
const token = await Token.deploy();
await token.waitForDeployment();
console.log("FadeyToken deployed to:", await token.getAddress());
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
八、NFT基础
NFT(非同质化代币)是独一无二的数字资产,使用ERC-721标准:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyNFT is ERC721, ERC721URIStorage, Ownable {
uint256 private _tokenIdCounter;
constructor() ERC721("MyNFT", "MNFT") Ownable(msg.sender) {}
function mintNFT(address recipient, string memory tokenURI)
public onlyOwner returns (uint256)
{
uint256 tokenId = _tokenIdCounter;
_tokenIdCounter++;
_mint(recipient, tokenId);
_setTokenURI(tokenId, tokenURI);
return tokenId;
}
}
九、DeFi简介
DeFi(去中心化金融)是Web3最重要的应用方向:
- DEX(去中心化交易所):Uniswap,基于AMM(自动做市商)模型
- 借贷协议:Aave、Compound,超额抵押借贷
- 稳定币:DAI、USDC,与法币挂钩的加密货币
- 流动性挖矿:提供流动性获取奖励
一个简单的AMM合约核心逻辑:
function swap(uint amountIn, address tokenIn, address tokenOut) public {
uint reserveIn = balanceOf[tokenIn][address(this)];
uint reserveOut = balanceOf[tokenOut][address(this)];
uint amountOut = (amountIn * 997 * reserveOut) / (reserveIn * 1000 + amountIn * 997);
// 执行交换...
}
总结
Web3开发涉及密码学、经济学和软件工程的交叉领域。建议从部署测试网合约开始,逐步深入协议层面。推荐资源:CryptoZombies(游戏化学习)、Solidity官方文档、OpenZeppelin文档。