区块链与Web3开发
去中心化应用开发入门
Web3技术栈
区块链平台
├── Ethereum (以太坊)
├── Solana
├── Polygon
└── BSC
开发工具
├── Solidity (智能合约)
├── Hardhat/Foundry (开发框架)
├── ethers.js/web3.js (前端交互)
└── MetaMask (钱包)
应用类型
├── DeFi (去中心化金融)
├── NFT (数字藏品)
├── DAO (去中心化组织)
└── GameFi (链游)
区块链基础概念
核心概念
├── 区块 (Block):存储交易数据
├── 链 (Chain):区块按时间顺序连接
├── 共识 (Consensus):网络达成一致
├── 智能合约:自动执行的代码
└── Gas:执行操作的费用
钱包与账户
├── 私钥:控制资产的密码
├── 公钥:由私钥生成
├── 地址:公钥的哈希,接收资产
└── 助记词:私钥的人类可读形式
Solidity智能合约
基础语法
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
contract SimpleStorage {
// 状态变量
uint256 private value;
address public owner;
// 事件
event ValueChanged(uint256 newValue, address changedBy);
// 修饰器
modifier onlyOwner() {
require(msg.sender == owner, "Not owner");
_;
}
// 构造函数
constructor() {
owner = msg.sender;
}
// 写入函数
function setValue(uint256 _value) public onlyOwner {
value = _value;
emit ValueChanged(_value, msg.sender);
}
// 读取函数
function getValue() public view returns (uint256) {
return value;
}
}
ERC20代币合约
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyToken is ERC20, Ownable {
constructor() ERC20("MyToken", "MTK") Ownable(msg.sender) {
// 铸造初始供应量给部署者
_mint(msg.sender, 1000000 * 10 ** decimals());
}
// 铸造新代币
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
// 销毁代币
function burn(uint256 amount) public {
_burn(msg.sender, amount);
}
}
NFT合约
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
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;
uint256 public mintPrice = 0.01 ether;
constructor() ERC721("MyNFT", "MNFT") Ownable(msg.sender) {}
function mint(string memory tokenURI) public payable returns (uint256) {
require(msg.value >= mintPrice, "Insufficient payment");
uint256 tokenId = _tokenIdCounter;
_tokenIdCounter++;
_safeMint(msg.sender, tokenId);
_setTokenURI(tokenId, tokenURI);
return tokenId;
}
function withdraw() public onlyOwner {
payable(owner()).transfer(address(this).balance);
}
// 重写必需函数
function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
return super.tokenURI(tokenId);
}
function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721URIStorage) returns (bool) {
return super.supportsInterface(interfaceId);
}
}
Hardhat开发环境
项目初始化
mkdir my-dapp && cd my-dapp
npm init -y
npm install --save-dev hardhat
npx hardhat init
配置文件
// hardhat.config.js
require("@nomicfoundation/hardhat-toolbox");
module.exports = {
solidity: "0.8.19",
networks: {
sepolia: {
url: process.env.SEPOLIA_RPC_URL,
accounts: [process.env.PRIVATE_KEY]
}
},
etherscan: {
apiKey: process.env.ETHERSCAN_API_KEY
}
};
部署脚本
// scripts/deploy.js
const hre = require("hardhat");
async function main() {
const MyToken = await hre.ethers.getContractFactory("MyToken");
const token = await MyToken.deploy();
await token.waitForDeployment();
console.log("MyToken deployed to:", await token.getAddress());
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
# 运行部署
npx hardhat run scripts/deploy.js --network sepolia
前端与合约交互
import { ethers } from 'ethers';
// 连接钱包
async function connectWallet() {
if (window.ethereum) {
const provider = new ethers.BrowserProvider(window.ethereum);
await provider.send("eth_requestAccounts", []);
const signer = await provider.getSigner();
const address = await signer.getAddress();
console.log("Connected:", address);
return signer;
}
throw new Error("Please install MetaMask");
}
// 合约交互
const contractAddress = "0x...";
const contractABI = [...];
async function interactWithContract() {
const signer = await connectWallet();
const contract = new ethers.Contract(contractAddress, contractABI, signer);
// 读取数据
const value = await contract.getValue();
console.log("Current value:", value);
// 写入数据
const tx = await contract.setValue(42);
await tx.wait();
console.log("Value updated!");
}
// 监听事件
function listenToEvents(contract) {
contract.on("ValueChanged", (newValue, changedBy) => {
console.log(`Value changed to ${newValue} by ${changedBy}`);
});
}
学习路线图
第1阶段:基础 (1-2个月)
├── 区块链原理
├── 以太坊基础
├── 钱包使用
└── Solidity语法
第2阶段:开发 (2-3个月)
├── 智能合约开发
├── Hardhat框架
├── 合约测试
└── 前端集成
第3阶段:进阶 (2-3个月)
├── 安全审计
├── Gas优化
├── 升级模式
└── DeFi协议
第4阶段:专业化 (持续)
├── Layer2开发
├── 跨链技术
├── MEV研究
└── 零知识证明
本章小结
- 智能合约:Solidity开发
- 开发工具:Hardhat/Foundry
- 前端集成:ethers.js交互
- 安全第一:审计与测试
→ 继续阅读:43-代码规范与最佳实践