# 🚀 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('空投领取成功!');
    };

    
相关推荐
ly768929 分钟前
React 19 从入门到工程实践:核心原理、新特性与项目实战
前端·react.js·前端框架
zzzzzz3103 小时前
别急着把页面做成舞台:从 react-bits 看动画组件该怎么选
javascript·react.js·开源
烬羽18 小时前
AI Coding 全流程实战:从需求到上线,我用 AI 开发了一个 NPM 包
前端·react.js·ai编程
前进的程序员18 小时前
Codex破局:前端组件秒级生成|提速React/Vue开发,可复用提示词+实战调试经验
前端·vue.js·react.js·codex
YHHLAI1 天前
从「跑分」到「干活」:Benchmark 与 GPT 5.6 的两种叙事
大数据·前端·人工智能·react.js·前端框架
码云之上1 天前
从Popup类组件看定位参考系陷阱与设计取舍
前端·react.js·scss
FungLeo1 天前
React 管理后台实战 · 列表里突然出现一堆空白行?PIPL 擦除后前端怎么处理才不露馅
前端·react.js·状态模式·pipl
Virony1 天前
React基础知识
前端·react.js·前端框架
liangshanbo12151 天前
React Hooks 为什么不能在条件分支/循环中调用?
前端·react.js·前端框架