主页 > imtoken手机版下载 > 创建您自己的数字货币(ERC20 代币)

创建您自己的数字货币(ERC20 代币)

imtoken手机版下载 2023-02-06 05:28:34

本文从技术角度详细介绍了如何基于以太坊ERC20创建代币的过程。

写在前面

本文中提到的代币是使用以太坊智能合约创建的。 在阅读本文之前,您应该对以太坊和智能合约有一定的了解。 如果你还不知道,我建议你读一读以太坊是什么

代币

如果不追求精确的定义,代币就是数字货币,比特币、以太坊都是代币。 使用以太坊的智能合约,可以轻松编写自己的代币以太坊代币转账消耗以太币吗,代币可以代表任何可以交易的东西,比如积分、财产、证书等。因此,无论是商业还是学习,很多人都想创建自己的代币,先发个图看看创建的token长什么样子。

代币

今天我们将详细讨论如何创建这样的令牌。

ERC20代币

可能大家经常看到ERC20和代币在一起,ERC20是以太坊定义的一种代币标准。 实现代币需要我们遵守的协议,比如指定代币名称、总量、实现代币交易功能等,只有协议支持,以太坊钱包才能支持。 它的界面如下:

contract ERC20Interface {
    string public constant name = "Token Name";
    string public constant symbol = "SYM";
    uint8 public constant decimals = 18;  // 18 is the most common number of decimal places
    function totalSupply() public constant returns (uint);
    function balanceOf(address tokenOwner) public constant returns (uint balance);
    function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
    function transfer(address to, uint tokens) public returns (bool success);
    function approve(address spender, uint tokens) public returns (bool success);
    function transferFrom(address from, address to, uint tokens) public returns (bool success);
    event Transfer(address indexed from, address indexed to, uint tokens);

以太坊eth2.0代币开发_以太坊代币模型_以太坊代币转账消耗以太币吗

event Approval(address indexed tokenOwner, address indexed spender, uint tokens); }

简单说明: name: Token name symbol: Token symbol decimals: Token 小数位,token 的最小单位,18 表示我们可以有 .00000000000000000001 个单位的 token。 totalSupply() :发行的代币总量。 balanceOf():查看对应账户的代币余额。 transfer():实现代币转账交易,用于向用户发送代币(从我们的账户)。 transferFrom():对于授权用户,他可以从我们的(参数from)账户发送代币给其他用户(参数to)。 allowance():返回授权花费的代币数量。 approve():授权用户可以代表我们花费的代币数量。

编写代币合约代码

代币合约代码:

pragma solidity ^0.4.16;
interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }
contract TokenERC20 {
    string public name;
    string public symbol;
    uint8 public decimals = 18;  // 18 是建议的默认值
    uint256 public totalSupply;
    mapping (address => uint256) public balanceOf;  //
    mapping (address => mapping (address => uint256)) public allowance;
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Burn(address indexed from, uint256 value);

以太坊eth2.0代币开发_以太坊代币模型_以太坊代币转账消耗以太币吗

function TokenERC20(uint256 initialSupply, string tokenName, string tokenSymbol) public { totalSupply = initialSupply * 10 ** uint256(decimals); balanceOf[msg.sender] = totalSupply; name = tokenName; symbol = tokenSymbol; } function _transfer(address _from, address _to, uint _value) internal { require(_to != 0x0); require(balanceOf[_from] >= _value); require(balanceOf[_to] + _value > balanceOf[_to]); uint previousBalances = balanceOf[_from] + balanceOf[_to]; balanceOf[_from] -= _value; balanceOf[_to] += _value; Transfer(_from, _to, _value); assert(balanceOf[_from] + balanceOf[_to] == previousBalances); } function transfer(address _to, uint256 _value) public returns (bool) { _transfer(msg.sender, _to, _value); return true; }

以太坊代币转账消耗以太币吗_以太坊代币模型_以太坊eth2.0代币开发

function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { require(_value <= allowance[_from][msg.sender]); // Check allowance allowance[_from][msg.sender] -= _value; _transfer(_from, _to, _value); return true; } function approve(address _spender, uint256 _value) public returns (bool success) { allowance[msg.sender][_spender] = _value; return true; } function approveAndCall(address _spender, uint256 _value, bytes _extraData) public returns (bool success) { tokenRecipient spender = tokenRecipient(_spender); if (approve(_spender, _value)) { spender.receiveApproval(msg.sender, _value, this, _extraData); return true; } }

以太坊代币转账消耗以太币吗_以太坊代币模型_以太坊eth2.0代币开发

function burn(uint256 _value) public returns (bool success) { require(balanceOf[msg.sender] >= _value); balanceOf[msg.sender] -= _value; totalSupply -= _value; Burn(msg.sender, _value); return true; } function burnFrom(address _from, uint256 _value) public returns (bool success) { require(balanceOf[_from] >= _value); require(_value <= allowance[_from][msg.sender]); balanceOf[_from] -= _value; allowance[_from][msg.sender] -= _value; totalSupply -= _value; Burn(_from, _value); return true; } }

详细的代码解读,欢迎订阅我的小专栏。

部署

在开发和测试智能合约时,MetaMask 和 Remix Solidity IDE 是两个非常有用的工具。 使用它们来完成今天的部署。

要安装和配置 MetaMask,请参阅开发和部署第一个去中心化应用程序。 不同的是,本文选择了以太坊的测试网络 Ropsten。 如果您没有余额,请点击购买,您进入的网站会送您一些测试以太币。 ,配置完成后,界面应该是这样的:

以太坊代币转账消耗以太币吗_以太坊代币模型_以太坊eth2.0代币开发

配置好之后

在浏览器中打开Remix Solidity IDE,将上面的源码复制粘贴,参考右边的设置如图:

浏览器打开Remix

注意Environment、Account和MetaMask是一致的,然后选择合约TokenERC20,填写你想要的流通量、名称和代码,就可以创建合约了。 此时MetaMask会弹出交易确认框,点击SUBMIT。 合约部署交易确认后,复制合约地址。

打开Metamask界面,切换到TOKENS,点击Add Contract,出现如下对话框:

点添加合约

填写刚刚复制的地址,点击ADD,即可看到创建的token,如图:

创建的代币

哈哈,你已经完成了token的创建和部署(正式网的部署方式和测试网一样),你可以在Etherscan上查询我们刚刚部署的token。 你可以用它来做ICO,你会走上人生的巅峰(开个玩笑,我们不鼓励大家发行无意义的代币)。

代币交易

由于MetaMask插件不提供代币交易功能,考虑到很多人没有以太坊钱包或者被以太坊钱包网络的同步问题折磨,今天我就用网页版钱包来讲解一下代币交易。

进入,第一次进入,有一些安全提示需要用户确认。 进入后按照下图设置:

网页钱包1

连接好后,如图

网页钱包2

需要添加代币以太坊代币转账消耗以太币吗,填写代币合约地址。进行代币转账交易

网页钱包3

在接下来的交易确认中,只需点击确定。 交易完成后,可以看到MetaMask中的代币余额有所减少,如图:

网页钱包4

代币交易是不是很简单? 只要了解交易流程,使用其他钱包也是一样的。

另外,强烈推荐几个视频课程给大家:

如果您在创建代币的过程中遇到问题,我的知识星球可以为您解答。 作为星球会员权益,会员还可以加入区块链技术付费交流群。

参考文件

深入浅出地讲解区块链——打造优质的区块链技术博客,来这里学习区块链,关注知乎和微博,掌握区块链技术动态。