安装Node.js(版本≥14)后,初始化项目

从零开始开发一款以太坊兼容代币:完整指南与技术实践

在区块链生态中,以太坊凭借其智能合约平台的灵活性,成为各类代币开发的首选,无论是社区治理、DeFi协议还是NFT项目,开发者都可以基于以太坊标准快速创建自己的代币(即“ETH币”,更准确的说法是“以太坊兼容代币”),本文将详细介绍开发一款以太坊兼容代币的完整流程,从技术原理到代码实现,帮助零基础开发者快速上手。

明确代币类型:选择合适的以太坊标准

开发代币前,首先需确定其类型,这直接影响智能合约的设计和功能,目前以太坊主流代币标准包括:

  1. ERC-20:最基础的 fungible token(同质化代币)标准,适用于可替代资产,如稳定币USDT、治理代币UNI等,ERC-20规定了代币的基本功能(转移、授权、余额查询等),是绝大多数代币开发的首选。
  2. ERC-721:非同质化代币(NFT)标准,每个代币有唯一ID,适用于艺术品、收藏品等不可替代资产。
  3. ERC-1155:多代币标准,支持同质化、非同质化及半同质化代币,适用于游戏道具等复杂场景。

本文以最常用的ERC-20为例,讲解开发流程。

开发环境准备:工具与框架

开发以太坊智能合约需以下工具:

  1. 编程语言:Solidity(以太坊官方智能合约语言,类似JavaScript)。
  2. 开发框架
    • Hardhat:现代以太坊开发环境,支持编译、测试、部署等功能,适合新手和复杂项目。
    • Truffle:老牌框架,生态成熟,适合传统开发流程。
  3. 钱包与测试网
    • MetaMask:浏览器钱包,用于管理账户和交互测试网。
    • 测试网:如Ropsten、Goerli或Sepolia,提供免费的ETH用于测试,避免消耗主网真实资产。
  4. 依赖管理npm(Node包管理器),用于安装Solidity编译器和框架库。

安装步骤示例(以Hardhat为例):

npm init -y  
# 安装Hardhat
npm install --save-dev hardhat  
# 初始化Hardhat项目
npx hardhat  
# 选择"Create a basic sample project",安装示例依赖

编写ERC-20代币智能合约

ERC-20代币的核心功能需遵循OpenZeppelin标准库(已通过安全审计,避免常见漏洞),以下是完整代码示例(contracts/MyToken.sol):

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
    constructor(string memory name, string memory symbol) ERC20(name, symbol) {
        // 初始供应量:1亿代币,18位小数(以太坊标准)
        _mint(msg.sender, 10**18 * 10**8);
    }
}

代码解析

  • SPDX-License-Identifier:声明许可证(MIT为开源常用)。
  • pragma solidity ^0.8.0:指定Solidity版本(^0.8.0表示兼容0.8.x以上版本)。
  • import "@openzeppelin/contracts/token/ERC20/ERC20.sol":引入OpenZeppelin的ERC-20标准合约,避免重复造轮子。
  • contract MyToken is ERC20:继承ERC-20合约,获得代币核心功能(如transferbalanceOf等)。
  • constructor:构造函数,在合约部署时执行,用于初始化代币名称(name)、符号(symbol)和初始供应量(_mint函数向部署者地址 mint 1亿代币,10**18是18位小数的精度单位)。

编译与测试合约

  1. 编译合约
    Hardhat会自动在hardhat.config.js中配置编译选项(Solidity版本、路径等),运行以下命令编译合约:

    npx hardhat compile

    编译成功后,合约的ABI(应用二进制接口,定义合约与外部交互的函数)和字节码(部署到区块链的机器码)会生成在artifacts/contracts/MyToken.sol/MyToken.json中。

  2. 编写测试脚本
    测试是保证合约安全的关键,在test/目录下创建myToken.test.js(使用JavaScript测试框架Chai):

    const { expect } = require("chai");
    const { ethers } = require("hardhat");
    describe("MyToken", function () {
      it("Should deploy with correct name and symbol", async function () {
        const MyToken = await ethers.getContractFactory("MyToken");
        const token = await MyToken.deploy("My Token", "MTK");
        await token.deployed();
        expect(await token.name()).to.equal("My Token");
        expect(await token.symbol()).to.equal("MTK");
      });
      it("Should assign initial supply to deployer", async function () {
        const MyToken = await ethers.getContractFactory("MyToken");
        const token = await MyToken.deploy("My Token", "MTK");
        await token.deployed();
        const [deployer] = await ethers.getSigners();
        expect(await token.balanceOf(deployer.address)).to.equal(10**18 * 10**8);
      });
    });

    运行测试:

    npx hardhat test

    测试通过后,说明合约功能符合预期。

部署合约到测试网

部署前需准备测试网ETH(可通过Faucet获取,如Goerli Faucet)。

  1. 配置Hardhat连接测试网
    hardhat.config.js中添加测试网配置(以Goerli为例):

    require("@nomicfoundation/hardhat-toolbox");
    /** @type import('hardhat/config').HardhatUserConfig */
    module.exports = {
      solidity: "0.8.0",
      networks: {
        goerli: {
          url: "https://goerli.infura.io/v3/YOUR_INFURA_ID", // 替换为Infura或Alchemy的节点URL
          accounts: ["YOUR_PRIVATE_KEY"], // 替换为MetaMask中测试网账户的私钥(仅测试用,勿泄露)
        },
      },
    };

    获取Infura ID:注册Infura,创建新项目,获取Goerli节点URL。

  2. 部署脚本
    scripts/目录下创建deploy.js

    async function main() {
      const MyToken = await ethers.getContractFactory("MyToken");
      const token = await MyToken.deploy("My Token", "MTK");
      await token.deployed();
      console.log("MyToken deployed to:", token.address);
    }
    main().catch((error) => {
      console.error(error);
      process.exitCode = 1;
    });
  3. 执行部署

    npx hardhat run scripts/deploy.js --network goerli

    部署成功后,控制台会输出合约地址(如0x123...abc),记录该地址后续交互需使用。

验证合约与代币交互

  1. 验证合约(可选):
    将合约源代码上传到以太坊浏览器(如Etherscan),提升可信度,使用Hardhat插件hardhat-etherscan

    npm install --save-dev @nomicfoundation/hardhat-etherscan

    hardhat.config.js中添加API Key(从Etherscan获取),运行:

    npx hardhat verify --network goerli "CONTRACT_ADDRESS" "My Token" "MTK"
  2. 交互测试

    • MetaMask:添加测试网网络(Goerli),导入部署账户,将合约
      随机配图
      地址添加到“代币”列表,即可查看余额、进行转账。
    • 代码交互:使用ethers.js调用合约函数(示例:查询余额):
      const tokenAddress = "0x123...abc";
      const token = await ethers.getContractAt("MyToken", tokenAddress);
      const balance = await token.balanceOf("0x...deployer_address");
      console.log("Balance:", ethers.utils.formatUnits(balance, 18));

本文由用户投稿上传,若侵权请提供版权资料并联系删除!