引言

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开发需要掌握智能合约、区块链原理和前端集成。持续关注安全最佳实践至关重要。

相关工具推荐