Web3与区块链开发完全指南:从智能合约到DApp
深入探讨Web3与区块链开发,涵盖Solidity智能合约、Ethereum、DeFi、NFT等核心主题,帮助开发者构建去中心化应用。
Web3和区块链技术正在重塑互联网的形态。本文将深入探讨智能合约开发、DeFi协议、NFT等核心主题,帮助开发者进入Web3世界。
一、Solidity智能合约#
1.1 基础合约结构#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| // SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyToken is ERC20, Ownable {
uint256 public constant MAX_SUPPLY = 1_000_000_000 * 10**18;
constructor() ERC20("MyToken", "MTK") {
_mint(msg.sender, MAX_SUPPLY);
}
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
function burn(uint256 amount) public {
_burn(msg.sender, amount);
}
}
|
1.2 安全最佳实践#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| // ========== 重入攻击防护 ==========
contract ReentrancyGuard {
bool private locked;
modifier noReentrant() {
require(!locked, "Reentrant call");
locked = true;
_;
locked = false;
}
function withdraw() external noReentrant {
// ...
}
}
// ========== 访问控制 ==========
contract AccessControl {
mapping(address => bool) public admins;
modifier onlyAdmin() {
require(admins[msg.sender], "Not admin");
_;
}
function addAdmin(address admin) external onlyAdmin {
admins[admin] = true;
}
}
// ========== 安全数学运算 ==========
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
require(a + b >= a, "Overflow");
return a + b;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(a >= b, "Underflow");
return a - b;
}
}
|
二、DeFi协议开发#
2.1 AMM交换池#
1
2
3
4
5
6
7
8
9
10
11
12
| contract AMMPool {
uint256 public reserve0;
uint256 public reserve1;
function addLiquidity(uint256 amount0, uint256 amount1) external {
// ...
}
function swap(uint256 amount0In, uint256 amount1In) external {
// ...
}
}
|
三、NFT开发#
1
2
3
4
5
6
7
8
9
10
11
12
| import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
contract MyNFT is ERC721URIStorage {
uint256 private _tokenIdCounter;
function mint(address to, string memory uri) public returns (uint256) {
uint256 tokenId = _tokenIdCounter++;
_safeMint(to, tokenId);
_setTokenURI(tokenId, uri);
return tokenId;
}
}
|
四、前端集成#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| import { ethers } from 'ethers';
// 连接钱包
async function connectWallet() {
const provider = new ethers.BrowserProvider(window.ethereum);
await provider.send("eth_requestAccounts", []);
const signer = await provider.getSigner();
return signer;
}
// 调用合约
async function mintNFT(signer, contractAddress, uri) {
const contract = new ethers.Contract(
contractAddress,
['function mint(address to, string memory uri) returns (uint256)'],
signer
);
const tx = await contract.mint(await signer.getAddress(), uri);
await tx.wait();
}
|
Web3开发需要掌握智能合约、区块链原理和前端集成。持续关注安全最佳实践至关重要。
相关工具推荐