以太坊开发入门-发行一个简单代币

  • Harry.H
  • 更新于 2022-08-19 11:06
  • 阅读 3460

快速实现一个最简单的代币合约。在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];
    }
}

代码定义了一个HToken的合约。

    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];
    }

查询帐户余额,这里没有任何限制,所有人都可以调用该函数查询指定帐户地址上的余额。

完成上述代码并编译完成后,将其部署至Rinkeby测试网络。

image.png 部署完成后,可以在合约中看到部署的合约地址,也可查看到合约可调用的函数,public变量会自动生成读取函数,所以会看到多出来两个balances和minter的读取函数。

调用函数:

向指定地址发送1000个代币:

image.png 执行成功后查询指定地址的余额。

image.png 返回值为1000,说明mint和查询都执行正常。最基本的代币发行合约就完成了。当然这个合约还是过于简单,要想完成一个功能健全,安全可靠的代币合约,可以遵照ERC20协议完成一个合约代码,在下一章节中详细介绍。

点赞 3
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Harry.H
Harry.H
web3世界的一粒量子