以太坊发币教程,使用Web3.js从零创建你的第一个代币

博主:neragonerago 2026-10-07 20:49:31 3

随着区块链技术的普及,越来越多的开发者希望了解如何在以太坊上发行自己的代币,本文将详细介绍如何结合Solidity智能合约和Web3.js库,完成代币的创建、部署和交互全过程。

以太坊发币教程,使用Web3.js从零创建你的第一个代币

准备工作

1 环境搭建

在开始之前,你需要准备以下开发环境:

mkdir my-token && cd my-token
npm init -y
npm install web3 solc

2 安装开发工具

  • Node.js:运行环境
  • Web3.js:与以太坊区块链交互的JavaScript库
  • Solc:Solidity编译器
  • MetaMask:浏览器钱包插件
  • Ganache:本地区块链测试环境(可选)

编写代币智能合约

我们基于ERC-20标准编写一个简单的代币合约:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract MyToken {
    string public name = "My Token";
    string public symbol = "MTK";
    uint8 public decimals = 18;
    uint256 public totalSupply = 1000000 * 10 ** 18;
    mapping(address => uint256) public balanceOf;
    mapping(address => mapping(address => uint256)) public allowance;
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    constructor() {
        balanceOf[msg.sender] = totalSupply;
    }
    function transfer(address _to, uint256 _value) public returns (bool success) {
        require(balanceOf[msg.sender] >= _value, "Insufficient balance");
        balanceOf[msg.sender] -= _value;
        balanceOf[_to] += _value;
        emit Transfer(msg.sender, _to, _value);
        return true;
    }
    function approve(address _spender, uint256 _value) public returns (bool success) {
        allowance[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        require(balanceOf[_from] >= _value, "Insufficient balance");
        require(allowance[_from][msg.sender] >= _value, "Allowance too low");
        balanceOf[_from] -= _value;
        balanceOf[_to] += _value;
        allowance[_from][msg.sender] -= _value;
        emit Transfer(_from, _to, _value);
        return true;
    }
}

使用Web3.js编译和部署合约

1 编译合约

const Web3 = require('web3');
const solc = require('solc');
const fs = require('fs');
// 连接到本地Ganache或测试网
const web3 = new Web3('http://localhost:7545');
// 读取并编译合约
const contractSource = fs.readFileSync('MyToken.sol', 'utf8');
const input = {
    language: 'Solidity',
    sources: {
        'MyToken.sol': {
            content: contractSource
        }
    },
    settings: {
        outputSelection: {
            '*': {
                '*': ['abi', 'evm.bytecode']
            }
        }
    }
};
const compiled = JSON.parse(solc.compile(JSON.stringify(input)));
const contract = compiled.contracts['MyToken.sol']['MyToken'];
const abi = contract.abi;
const bytecode = contract.evm.bytecode.object;

2 部署合约

async function deploy() {
    // 获取账户
    const accounts = await web3.eth.getAccounts();
    console.log('部署账户:', accounts[0]);
    // 部署合约
    const myTokenContract = new web3.eth.Contract(abi);
    const deployTx = myTokenContract.deploy({
        data: '0x' + bytecode,
        arguments: []
    });
    const deployedContract = await deployTx.send({
        from: accounts[0],
        gas: 2000000
    });
    console.log('合约部署成功!');
    console.log('合约地址:', deployedContract.options.address);
    return deployedContract;
}

使用Web3.js与代币合约交互

1 查询代币信息

async function getTokenInfo(contract) {
    const name = await contract.methods.name().call();
    const symbol = await contract.methods.symbol().call();
    const totalSupply = await contract.methods.totalSupply().call();
    console.log('代币名称:', name);
    console.log('代币符号:', symbol);
    console.log('总供应量:', web3.utils.fromWei(totalSupply, 'ether'));
}

2 查询余额

async function getBalance(contract, address) {
    const balance = await contract.methods.balanceOf(address).call();
    console.log(`账户余额:${web3.utils.fromWei(balance, 'ether')} 枚代币`);
    return balance;
}

3 转账操作

async function transferTokens(contract, from, to, amount) {
    const value = web3.utils.toWei(amount.toString(), 'ether');
    const receipt = await contract.methods.transfer(to, value).send({
        from: from,
        gas: 100000
    });
    console.log('转账成功,交易哈希:', receipt.transactionHash);
}

4 授权操作

async function approveTokens(contract, owner, spender, amount) {
    const value = web3.utils.toWei(amount.toString(), 'ether');
    const receipt = await contract.methods.approve(spender, value).send({
        from: owner
    });
    console.log('授权成功,交易哈希:', receipt.transactionHash);
}

连接测试网络

如果要在公共测试网(如Sepolia)部署,可以通过Infura或Alchemy接入:

const HDWalletProvider = require('@truffle/hdwallet-provider');
const provider = new HDWalletProvider(
    '你的助记词',
    'https://sepolia.infura.io/v3/你的项目ID'
);
const web3 = new Web3(provider);

注意事项

  1. Gas费用:部署合约会消耗Gas,在主网部署前建议先在测试网验证。
  2. 合约安全:简单示例合约仅供学习,生产环境建议使用OpenZeppelin的安全合约库。
  3. 私钥管理:切勿将私钥或助记词硬编码在代码中,应使用环境变量管理。
  4. 合规性:发币前请了解当地法律法规,确保合规操作。
  5. 审计测试:正式发布前,建议进行专业安全审计。

通过本文的学习,你已经掌握了使用Web3.js在以太坊上发币的基本流程,包括智能合约编写、编译、部署以及交互操作,区块链开发是一个持续学习的过程,建议读者深入学习OpenZeppelin合约库、Hardhat开发框架等进阶工具,不断提升DApp开发能力。

希望这篇教程对你有所帮助,祝你在Web3的世界中探索愉快!

The End

发布于:2026-10-07,除非注明,否则均为区块链社区- 欧亿APP下载原创文章,转载请注明出处。