快速实现一个最简单的代币合约。在RemixIDE中新建源文件 MyCoin.sol。
在RemixIDE中新建源文件 MyCoin.sol,代码如下:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract HToken{
address public minter;
mapping (address => uint) public balances;
//定义事件,在web3中可以用wathch方法监听该事件
event eSent(address from, address to, uint a);
//构造函数,只会在合约部署时执行一次.
constructor() {
minter = msg.sender;//msg.sender 是合约部署时的帐号地址,将其存储在minter变量中。
}
//给指定的地址铸造代币
function mint(address receiver, uint amount) public {
if (msg.sender != minter) return; //检查调用者是否是全部部署者
balances[receiver] += amount;
}
//从自己的帐号转移代币到指定的帐号
function send(address receiver, uint amount) public {
if (balances[msg.sender] < amount) return;//检查余额
balances[msg.sender] -= amount;
balances[receiver] += amount;
//发送事件,在web3中可以用watch方法监听。
emit eSent(msg.sender, receiver, amount);
}
//查询指定帐号地址余额
function balanceOf(address account) public view returns (uint256) {
return balances[account];
}
}
address public minter;
mapping (address => uint) public balances;
变量minter,用于存储合约的发布者地址。他会在合约创建的时候进行赋值。 变量balances,是一个mapping类型变量,key=>value对应的是帐号地址和帐户余额。
constructor() {
minter = msg.sender;
}
构造函数定义,构造函数只会在部署合约的时候执行一次,msg是一个默认变量,msg.sender是当前调用者地址,部署合约时的调用者就是合约的发布帐号,所以将其存储下来,用于后续函数的调用者权限检查,合约部署上链后,所有人都可以看到合约信息,也可以调用合约的函数,本合约发布的代码只允许合约发布者可以调用,所以使用minter作了一次检查。
function mint(address receiver, uint amount) public {
if (msg.sender != minter) return; //只请允许合约部署者调用
balances[receiver] += amount;
}
铸造代币函数,两个参数,receiver是需要铸币的帐号地址,amount是铸币的数量。首先检查调用者是否是合约发布者,然后给对应balances对应receiver增加amount数量的币。该函数执行过程需要消耗gas费用。
//从自己的帐号转移代币到指定的帐号
function send(address receiver, uint amount) public {
if (balances[msg.sender] < amount) return;//检查余额
balances[msg.sender] -= amount;
balances[receiver] += amount;
//发送事件,在web3中可以用watch方法监听。
emit eSent(msg.sender, receiver, amount);
}
发送代币,从调用者自己的帐户中转移amount个代币到receiver帐户下。转移完成后发送了一个eSent事件,该事件可以在程序端中监听到,后续会有专门章节讲解。
//查询指定帐号地址余额
function balanceOf(address account) public view returns (uint256) {
return balances[account];
}
查询帐户余额,这里没有任何限制,所有人都可以调用该函数查询指定帐户地址上的余额。
部署完成后,可以在合约中看到部署的合约地址,也可查看到合约可调用的函数,public变量会自动生成读取函数,所以会看到多出来两个balances和minter的读取函数。
向指定地址发送1000个代币:
执行成功后查询指定地址的余额。
返回值为1000,说明mint和查询都执行正常。最基本的代币发行合约就完成了。当然这个合约还是过于简单,要想完成一个功能健全,安全可靠的代币合约,可以遵照ERC20协议完成一个合约代码,在下一章节中详细介绍。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!