下面是一个使用Solidity开发ERC20标准代币的完整案例,包括智能合约源码和开发流程。
案例介绍:开发一个ERC20标准代币
1. 设置开发环境
确保已安装以下工具:
- Node.js:用于运行JavaScript代码。
- Truffle:Solidity开发框架。
- Ganache:本地区块链模拟器。
- MetaMask:用于与dApp进行交互的加密钱包。
npm install -g truffle
npm install -g ganache-cli
2. 创建Truffle项目
mkdir ERC20Token
cd ERC20Token
truffle init
3. 编写ERC20智能合约
在contracts
目录下创建一个新的文件ERC20Token.sol
:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract ERC20Token is ERC20 {
constructor(uint256 initialSupply) ERC20("MyToken", "MTK") {
_mint(msg.sender, initialSupply);
}
}
在上面的合约中,我们使用了OpenZeppelin库来实现ERC20标准。合约定义了代币的名称为”MyToken”,代币符号为”MTK”,并在部署时铸造初始供应量的代币到部署者的账户中。
4. 安装OpenZeppelin库
npm install @openzeppelin/contracts
5. 编写迁移脚本
在migrations
目录下创建一个新的文件2_deploy_contracts.js
:
const ERC20Token = artifacts.require("ERC20Token");
module.exports = function (deployer) {
const initialSupply = web3.utils.toWei('1000', 'ether'); // Initial supply of 1000 tokens
deployer.deploy(ERC20Token, initialSupply);
};
6. 配置Truffle
修改truffle-config.js
,配置开发网络:
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*" // 匹配任何网络id
}
},
compilers: {
solc: {
version: "0.8.0"
}
}
};
7. 启动Ganache
ganache-cli
8. 部署智能合约
在新的终端窗口中执行以下命令:
truffle migrate --network development
9. 编写前端代码
创建client
目录,并在其中初始化一个React应用:
npx create-react-app client
cd client
npm install web3
在client/src
目录下创建一个文件App.js
,编写前端交互代码:
// App.js
import React, { useEffect, useState } from "react";
import Web3 from "web3";
import ERC20Token from "./contracts/ERC20Token.json";
const App = () => {
const [account, setAccount] = useState("");
const [token, setToken] = useState(null);
const [balance, setBalance] = useState("");
useEffect(() => {
const loadBlockchainData = async () => {
const web3 = new Web3(Web3.givenProvider || "http://localhost:8545");
const accounts = await web3.eth.requestAccounts();
setAccount(accounts[0]);
const networkId = await web3.eth.net.getId();
const deployedNetwork = ERC20Token.networks[networkId];
const tokenInstance = new web3.eth.Contract(ERC20Token.abi, deployedNetwork && deployedNetwork.address);
setToken(tokenInstance);
const balance = await tokenInstance.methods.balanceOf(accounts[0]).call();
setBalance(web3.utils.fromWei(balance, 'ether'));
};
loadBlockchainData();
}, []);
const transferTokens = async (recipient, amount) => {
const web3 = new Web3(Web3.givenProvider || "http://localhost:8545");
const amountInWei = web3.utils.toWei(amount, 'ether');
await token.methods.transfer(recipient, amountInWei).send({ from: account });
const balance = await token.methods.balanceOf(account).call();
setBalance(web3.utils.fromWei(balance, 'ether'));
};
return (
<div>
<h1>ERC20 Token</h1>
<p>Your account: {account}</p>
<p>Your balance: {balance} MTK</p>
<button onClick={() => transferTokens("recipient_address_here", "1")}>Transfer 1 MTK</button>
</div>
);
};
export default App;
在上面的前端代码中,我们使用Web3.js连接到以太坊网络,获取用户的账户和代币余额,并提供一个按钮来进行代币转账。
10. 运行前端应用
确保在client
目录下,启动前端应用:
npm start
总结
通过上述步骤,我们创建了一个ERC20标准代币,包括智能合约的编写、部署以及前端的交互。在实际项目中,可以根据需求进一步完善和扩展功能,如添加更多的代币功能、优化用户界面等。通过使用OpenZeppelin库,我们可以确保代币合约符合ERC20标准,并减少代码中的漏洞。
评论前必须登录!
注册