以太坊发币教程,使用Web3.js从零创建你的第一个代币
随着区块链技术的普及,越来越多的开发者希望了解如何在以太坊上发行自己的代币,本文将详细介绍如何结合Solidity智能合约和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);
注意事项
- Gas费用:部署合约会消耗Gas,在主网部署前建议先在测试网验证。
- 合约安全:简单示例合约仅供学习,生产环境建议使用OpenZeppelin的安全合约库。
- 私钥管理:切勿将私钥或助记词硬编码在代码中,应使用环境变量管理。
- 合规性:发币前请了解当地法律法规,确保合规操作。
- 审计测试:正式发布前,建议进行专业安全审计。
通过本文的学习,你已经掌握了使用Web3.js在以太坊上发币的基本流程,包括智能合约编写、编译、部署以及交互操作,区块链开发是一个持续学习的过程,建议读者深入学习OpenZeppelin合约库、Hardhat开发框架等进阶工具,不断提升DApp开发能力。
希望这篇教程对你有所帮助,祝你在Web3的世界中探索愉快!
The End
发布于:2026-10-07,除非注明,否则均为原创文章,转载请注明出处。

