# 🚀 Solidity从零到一:手把手教你开发ERC-20代币

🔧 开发环境准备

1. 安装必要工具

bash 复制代码
【安装Node.js和npm】
npm install -g truffle

【安装Ganache(本地测试链)】
npm install -g ganache-cli

2. 创建项目

bash 复制代码
mkdir my-token && cd my-token
truffle init
npm install @openzeppelin/contracts

💻 编写智能合约

1. 创建代币合约

solidity 复制代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract MyToken is ERC20, Ownable {
    constructor() ERC20("My Token", "MTK") {
        _mint(msg.sender, 1000000 * 10 ** decimals());
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }
}

2. 合约代码解析

  • ERC20标准:实现代币基本功能
  • Ownable:添加权限控制
  • decimals():设置小数位数(默认18)
  • _mint():初始发行代币

🧪 测试与部署

1. 编写测试用例

javascript 复制代码
const MyToken = artifacts.require("MyToken");

contract("MyToken", accounts => {
    it("should have correct name and symbol", async () => {
        const instance = await MyToken.deployed();
        const name = await instance.name();
        const symbol = await instance.symbol();

        assert.equal(name, "My Token");
        assert.equal(symbol, "MTK");
    });
});

2. 部署到测试网

javascript 复制代码
// truffle-config.js 配置
module.exports = {
  networks: {
    ropsten: {
      provider: () => new HDWalletProvider(
        process.env.MNEMONIC,
        `https://ropsten.infura.io/v3/${process.env.INFURA_API_KEY}`
      ),
      network_id: 3,
      gas: 5500000,
      confirmations: 2,
      timeoutBlocks: 200,
      skipDryRun: true
    }
  }
};

🔒 安全注意事项

1. 常见漏洞

  • 重入攻击:使用Checks-Effects-Interactions模式
  • 整数溢出:使用SafeMath或Solidity 0.8+
  • 权限控制:合理使用onlyOwner修饰符

2. 最佳实践

  • 使用OpenZeppelin安全合约库
  • 进行完整的单元测试
  • 使用形式化验证工具

🎯 进阶功能

1. 添加销毁功能

solidity 复制代码
function burn(uint256 amount) public {
    _burn(msg.sender, amount);
}

2. 时间锁功能

solidity 复制代码
import "@openzeppelin/contracts/security/Pausable.sol";

contract MyToken is ERC20, Ownable, Pausable {
    // 添加暂停功能
}

📊 实战项目:创建一个代币空投DApp

前端代码示例(React)

jsx 复制代码
import { ethers } from 'ethers';
import { useEffect, useState } from 'react';

function TokenAirdrop() {
    const [balance, setBalance] = useState('0');

    const claimAirdrop = async () => {
        const provider = new ethers.providers.Web3Provider(window.ethereum);
        const signer = provider.getSigner();
        const contract = new ethers.Contract(
            tokenAddress,
            tokenABI,
            signer
        );

        const tx = await contract.transfer(msg.sender, ethers.utils.parseEther('100'));
        await tx.wait();
        alert('空投领取成功!');
    };

    
相关推荐
太子釢21 小时前
React 函数组件与 Hook 实践指南
前端·react.js
liangshanbo12151 天前
面试题:React 中 Lane 和 Scheduler 是怎么配合的?
前端·react.js·前端框架
liangshanbo12151 天前
React面试题:Hooks 为什么不能在分支和循环里面写?
前端·javascript·react.js
FungLeo1 天前
成为全栈·Next.js 网站前台篇·响应式、可访问性与错误状态:内容站不能只验桌面首页
react.js·响应式设计·next.js·移动端适配·成为全栈·web 可访问性
ss2731 天前
AI全栈实战 | 3.5-01 Python 全栈前端最小集:不会 React 也能做出能看的后台,关键就一条线
前端·python·react.js
记得开心一点嘛2 天前
Trellora:基于 Electron、React 和本地知识库的 AI 知识工作台
人工智能·react.js·electron
500842 天前
React Native for OpenHarmony 实战:三方库 react-native-url-polyfill 的鸿蒙化适配指南
javascript·react native·react.js·性能优化·electron·harmonyos
500842 天前
React Native for OpenHarmony 实战:三方库 react-native-volume-control 的鸿蒙化适配指南
javascript·react native·react.js·electron·harmonyos
薛一半2 天前
React-Redux三重优化实战揭秘
javascript·vue.js·react.js
薛一半4 天前
React-Redux核心原理与容器组件实战
前端·javascript·react.js