以太坊开发教程(学习以太坊开发的必备教程 – 不到50行代码开发一个简单ERC20代币)
以太坊开发教程-不到50行代码开发一个简单ERC20代币
以太坊是一个具有自己编程语言Solidity的区块链平台,可以用来开发智能合约和去中心化应用程序(DApp)。在这篇文章中,我们将通过不到50行的代码,展示如何开发简单的ERC20代币,并在以太坊网络中进行部署并进行测试。
第一步:安装Truffle和Ganache-cli
Truffle是一个用于开发、测试和部署智能合约的全球性工具集。Ganache-cli是一个用于本地开发、测试和调试以太坊应用程序的命令行工具。我们需要在本地计算机上安装这两个工具,才能开始本次代币开发。
第二步:创建项目
使用任何您习惯的IDE,创建一个空项目,将项目名设为您选择的名称。在项目的根目录下,使用以下命令创建新的Truffle项目文件夹:
truffle init
第三步:创建ERC20代币合约
在项目的contracts目录下创建一个名为Token.sol的Solidity合约文件,该文件包括以下代码:
“`
pragma solidity ^0.5.0;
// ERC20标准接口
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}
// 实现ERC20代币
contract Token is IERC20 {
string public name;
string public symbol;
uint8 public decimals = 18;
uint256 private _totalSupply;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowed;
constructor (string memory _name, string memory _symbol, uint256 initialSupply) public {
name = _name;
symbol = _symbol;
_totalSupply = initialSupply * 10 ** uint256(decimals);
_balances[msg.sender] = _totalSupply;
emit Transfer(address(0), msg.sender, _totalSupply);
}
function totalSupply() public view returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public returns (bool) {
require(amount <= _balances[msg.sender], "Insufficient balance.");
_balances[msg.sender] = _balances[msg.sender] – amount;
_balances[recipient] = _balances[recipient] + amount;
emit Transfer(msg.sender, recipient, amount);
return true;
}
function allowance(address owner, address spender) public view returns (uint256) {
return _allowed[owner][spender];
}
function approve(address spender, uint256 amount) public returns (bool) {
_allowed[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
require(amount <= _allowed[sender][msg.sender], "Insufficient allowance.");
require(amount <= _balances[sender], "Insufficient balance.");
_allowed[sender][msg.sender] = _allowed[sender][msg.sender] – amount;
_balances[sender] = _balances[sender] – amount;
_balances[recipient] = _balances[recipient] + amount;
emit Transfer(sender, recipient, amount);
return true;
}
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
“`
在这个合约中,我们实现了ERC20标准接口中的功能,包括代币的名称、符号、小数位、总供应量、以及代币的转账、授权和转账操作。
第四步:编译合约
在项目的根目录下,使用以下命令编译合约:
truffle compile
该命令会在项目的build/contracts目录下生成JSON合约描述文件。
第五步:部署合约
在项目的migrations目录下,创建一个名为2_deploy_token.js的JavaScript文件,包含以下代码:
“`
const Token = artifacts.require(“Token”);
module.exports = function(deployer) {
const name = “My Token”;
const symbol = “MTK”;
const initialSupply = 1000000;
deployer.deploy(Token, name, symbol, initialSupply);
};
“`
我们指定了代币的名称、符号和初始供应量,并使用deployer.deploy函数将Token合约部署到以太坊网络上。
在项目的根目录下,使用以下命令部署合约:
truffle migrate --reset --network development
该命令将重新部署所有的合约,并在以太坊网络上生成新的合约实例。我们在Ganache界面上可以看到代币被成功创建了,我们可以通过合约地址和ABI接口去使用这个代币。
第六步:使用代币
我们可以使用web3或Ethers.js来与代币交互,例如:
“`
const Token = artifacts.require(“Token”);
contract(“Token”, accounts => {
it(“should transfer tokens”, async () => {
const tokenInstance = await Token.deployed();
const balanceReceiverBefore = await tokenInstance.balanceOf(accounts[1]);
assert.equal(balanceReceiverBefore.toNumber(), 0);
const amountToTransfer = 10;
await tokenInstance.transfer(accounts[1], amountToTransfer, { from: accounts[0] });
const balanceSenderAfter = await tokenInstance.balanceOf(accounts[0]);
assert.equal(balanceSenderAfter.toNumber(), 999990);
const balanceReceiverAfter = await tokenInstance.balanceOf(accounts[1]);
assert.equal(balanceReceiverAfter.toNumber(), amountToTransfer);
});
});
“`
在这个示例中,我们使用JavaScript编写了一个单元测试。我们使用代币的实例变量来转移代币,以及检查发送者和接收者的代币余额。
结论
这就是一个简单的ERC20代币开发教程。通过这个教程,我们可以了解如何在以太坊上创建自己的代币,并进行部署和测试。稍微深入学习一下,就可以开发更为高级和有趣的智能合约,以实现更多吸引人的去中心化应用。
原创文章,作者:区块链,如若转载,请注明出处:https://www.53moban.com/14736.html