登录/注册

广告一 广告二 广告三 广告四 广告五
首页 文章 如何以简单的方式创建ERC20代币

如何以简单的方式创建ERC20代币

文章来源:区块网

ERC20,以太坊代币,

2018/10/12 14:25

17564

文章页2
本文的目标是演示如何在短时间内创建ERC20代币。

让我们从基础开始,首先提出一个问题:什么是ERC20代币?

近年来,ERC20代币标准已成为以太坊代币的事实标准。换句话说,今天大多数以太坊合约都符合ERC20标准。本文将详细介绍如何创建自己的以太坊代币,但在我们开始教学之前,先让我们仔细弄懂什么是ERC20标准。
是什么让ERC20代币如此具有吸引力并取得成功?有几个因素在起作用:

1.正如您将在本教程中看到的那样,ERC20代币简单易用。

2.ERC20标准解决了一个重大问题,因为基于区块链的市场和加密钱包需要一组标准化的命令来与他们管理的代币系列进行通信。这包括不同代币之间的交互规则,以及代币购买规则。

3.这是第一个提供以太坊代币标准化的流行标准。它绝不是第一个,但由于它的受欢迎程度高,它很快成为行业标准。
与其他以太坊代币一样,ERC20代币使用的是智能合约,并以去中心化的方式在以太坊虚拟机(EVM)上执行。

Solidity:智能合约编程语言

以太坊智能合约是用Solidity编写的。虽然有其他语言,但几乎没有人将它们用于代币编辑。Solidity类似于JavaScript,所以如果你对JavaScript,甚至Java和其他类C语言都有一定的了解,那么你应该毫不费力地找出Solidity中的一段代码,甚至在你使用之前就完全掌握Solidity。

下面的内容有兴趣的可以认真阅读一下了,因为您应该可以根据以下内容立即开始创建简单的ERC20智能合约。这是一项简单的任务,非常简单,本文将演示如何在一小时内编写和部署ERC20代币。

我们将在此演示中创建的代币将是一个简单的ERC20运用,没有太多的花里胡哨的东西。但是,我在现实世界中看到过许多类似的简单代币,而且它们往往做得很好。

ERC20代币标准概述

什么是ERC20?

简而言之,ERC20标准定义了一组由所有ERC20代币实现的功能,以便与其他只能智能合约,钱包或市场集成。这组功能相当简短和基本。

function totalSupply() public view returns (uint256);
function balanceOf(address tokenOwner) public view returns (uint);
function allowance(address tokenOwner, address spender)
public view returns (uint);
function transfer(address to, uint tokens) public returns (bool);
function approve(address spender, uint tokens)  public returns (bool);
function transferFrom(address from, address to, uint tokens) public returns (bool);

ERC20功能允许外部用户(例如加密钱包应用程序)查找用户的余额,并通过适当的授权将资金从一个用户转移到另一个用户。

智能合约定义了两个明确定义的事件:

event Approval(address indexed tokenOwner, address indexed spender,
uint tokens);
event Transfer(address indexed from, address indexed to,
uint tokens);

当用户被授予从帐户中提取代币的权限,并且在实际转移代币之后,将调用或发出这些事件。

除了标准的ERC20功能之外,许多ERC20代币还具有其他字段,有些已经成为ERC20标准的事实上的一部分,如果不是在实践中写的话。以下是此类字段的一些示例。

string public constant name;
string public constant symbol;
uint8 public constant decimals;

以下是关于ERC20和Solidity命名法的几点:

·一个public功能可以在智能合约本身的外部访问
·view,基本上意味着不变,即智能合约的内部状态不会被功能改变
·An event是Solidity允许客户(例如您的应用程序前端)在智能合约中的特定事件得到通知的方式

如果您已经拥有必要的Java / JavaScript技能,那么大多数Solidity语言结构应该是清晰的。

在Solidity中编写ERC20代币
现在我们已经概述了基础知识并解释了创建ERC20代币所需的内容,现在是时候开始编写一些逻辑了。

首先,我们需要定义两个映射对象。这是关联或键/值数组的Solidity概念:

mapping(address => uint256) balances;
mapping(address => mapping (address => uint256)) allowed;

该表达式mapping(address => uint256)定义了一个关联数组,其键的类型为address- 用于表示帐户地址的数字,其值为类型uint256?- 通常用于存储代币余额的256位整数。

第一个映射对象balances将保存每个所有者帐户的代币余额。

第二个映射对象allowed将包括批准从给定帐户中提取的所有帐户以及每个帐户允许的提款金额。

如您所见,允许映射的值字段本身就是将帐户地址映射到其批准的提取金额的映射。

这些映射与所有其他智能合约字段一起将存储在区块链中并将被挖掘,从而导致更改传播到所有网络用户节点。

区块链存储成本很高,智能合约用户需要以某种方式付费。因此,您应该始终尝试最小化存储大小并写入区块链。

现在我们已经拥有了所需的数据结构,我们可以开始将ERC20逻辑实际编写到适当的函数中。

设置ICO代币数量

我们如何设置ICO代币的数量?那么,有很多方法可以设置ICO代币的最大数量,这个问题本身可能值得长时间讨论。

根据我们的ECR20教程的需要,我们将使用最简单的方法:在智能合约创建时设置代币总数,并最初将所有代币分配给“智能合约所有者”,即部署智能合约的帐户:

uint256 totalSupply_;
constructor(uint256 total) public {
totalSupply_ = total;
balances[msg.sender] = _totalSupply;
}

构造函数是在智能合约部署后立即由以太坊自动调用的特殊函数。它通常用于使用智能合约的部署帐户传递的参数初始化代币的状态。

msg是由以太坊本身声明和填充的全局变量。它包含执行智能合约的重要数据。我们在这里使用的字段:msg.sender包含执行当前智能合约函数的以太坊帐户。

只有部署帐户才能输入智能合约的构造函数。智能合约启动时,此功能会将可用代币分配给“智能合约所有者”帐户。

获得总代币供应

function totalSupply() public view returns (uint256) {
return totalSupply_;
}

此函数将返回此智能合约分配的所有代币的数量,而不管所有者。

获取所有者的代币余额

function balanceOf(address tokenOwner) public view returns (uint) {
return balances[tokenOwner];
}

balanceOf 将返回帐户的当前代币余额,由其所有者的地址标识。

将代币转移到另一个帐户

function transfer(address receiver,
uint numTokens) public returns (bool) {
require(numTokens <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender] — numTokens;
balances[receiver] = balances[receiver] + numTokens;
emit Transfer(msg.sender, receiver, numTokens);
return true;
}

顾名思义,该transfer函数用于将numTokens代币数量从所有者的余额移动到另一个用户的余额,或者receiver。转移所有者msg.sender即执行该功能的所有者,这意味着只有代币的所有者才能将其转移给其他人。

Solidity断言谓词的方式是require。在这种情况下,转移帐户具有足够的余额来执行转移。如果require语句失败,则会立即回滚事务,而不会将更改写入区块链。

在退出之前,该函数触发ERC20事件,Transfer允许已注册的侦听器对其完成作出反应。

批准提取代币

此功能最常用于代币市场场景。

function approve(address delegate,
uint numTokens) public returns (bool) {
allowed[msg.sender][delegate] = numTokens;
emit Approval(msg.sender, delegate, numTokens);
return true;
}

approve允许所有者即msg.sender批准代理帐户(可能是市场本身)从其帐户中提取代币并将其转移到其他帐户的做法是什么。

如您所见,此功能用于所有者在市场上提供代币的场景。它允许市场在不等待事先批准的情况下完成交易。

在执行结束时,此函数会触发一个Approval事件。

获取批准提款的代币数量

function allowance(address owner,
address delegate) public view returns (uint) {
return allowed[owner][delegate];
}

此函数将所有者当前批准的代币数返回给特定委托,如approve函数中所设置。

通过委托转移代币

该transferFrom函数是函数的对等approve函数,我们之前已经讨论过。它允许被批准提取的代表将所有者资金转移到第三方帐户。

function transferFrom(address owner, address buyer,
uint numTokens) public returns (bool) {
require(numTokens <= balances[owner]);
require(numTokens <= allowed[owner][msg.sender]);
balances[owner] = balances[owner] — numTokens;
allowed[owner][msg.sender] =
allowed[from][msg.sender] — numTokens;
balances[buyer] = balances[buyer] + numTokens;
Transfer(owner, buyer, numTokens);
return true;
}

require功能开始时的两个陈述是验证交易是否合法,即所有者是否有足够的代币转移,并且该代表已经批准(至少)numTokens退出。

除了将numTokens金额从所有者转移到买方之外,此功能还会减去numTokens代表的津贴。这基本上允许具有给定限额的代表将其分成几个单独的提款,这是典型的市场行为。

我们可以在这里停下来并有一个有效的ERC20实施。但是,我们希望更进一步,因为我们需要一个工业强度代币。这要求我们使代码更安全,尽管我们仍然能够保持代币相对简单,如果不是基本的话。

SafeMath 是Solidity 语言数据库

SafeMath是一个 Solidity语言库,旨在解决黑客已经破解智能合约的方式:整数溢出攻击。在这种攻击中,黑客通过传递将使相关整数超过其最大值的参数来强制智能合约使用不正确的数值。
SafeMath通过在执行算术操作之前测试溢出来防止这种情况,从而消除了溢出攻击的危险。该库非常小,对智能合约规模的影响很小,不会产生任何性能和很少的存储成本惩罚。

我们将SafeMath添加到我们的代码中:

library SafeMath { // Only relevant functions
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a — b;
}
function add(uint256 a, uint256 b) internal pure returns (uint256)   {
uint256 c = a + b;
assert(c >= a);
return c;
}
}

SafeMath使用assert语句来验证传递参数的正确性。如果assert失败,将立即停止函数执行并回滚所有区块链更改。

接下来,让我们添加以下语句将库引入Solidity编译器:

using SafeMath for uint256;

然后,我们用SafeMath函数替换我们在开头使用的天真算术:

balances[msg.sender] = balances[msg.sender].sub(numTokens);
balances[receiver] = balances[receiver].add(numTokens);
balances[buyer] = balances[buyer].add(numTokens);
balances[owner] = balances[owner].sub(numTokens);

将它们一起包装在Solidity中,智能合约的功能和事件被包装到一个称为合约的实体中,您可以默默地将其转换为“区块链类”。以下是我们创建的与ERC20兼容的智能合约,包括我们代码的要点。名称和符号字段可以随意更改。大多数令牌将十进制值保持在18,所以我们也会这样做。

以太坊智能合约部署

现在是将我们的智能合约部署到区块链的时候了。部署后,我们的智能合约将转移到参与网络的所有节点。对智能合约所做的任何和所有更改都将传播到所有参与节点。

以太坊开发人员通常使用诸如Truffle之类的部署工具。即使是Truffle对于本文的有限需求也是过度的,而一个名为Remix的简单在线工具就足够了。

要使用它时,您需要在浏览器和Rinkeby(以太坊测试网络)帐户上安装MetaMask插件,其中至少包含一些Rinkeby Ether。这些步骤相对简单,因此我们不会详细介绍。

如果您没有,请访问MetaMask和Rinkeby获取下载链接并获取明确的安装和使用说明。

现在我们已经有了所有构建块,我们将转向Remix并将上面的代码(包括pragma行和SafeMath库)粘贴到在线编辑器中。

然后,我们将跳到右侧的第二个选项卡“ Run ”并单击“ Deploy”。将出现MetaMask弹出窗口,要求我们确认交易。当然,我们会批准它。
绿框:确保你在Rinkeby上
蓝框:设置您的总代币供应量
红框:部署!

恭喜!您刚刚部署了第一个ERC20令牌,就像真正的以太坊专业人士一样。正如所承诺的那样,令牌简单轻巧,功能齐全,符合ERC20标准,并通过MathSafe进行保护。它已准备好在区块链中购买,支付和转移。

这就是智能合约全部的内容吗?

不,只是一小部分,因为我们只是做了一个表面简短的演示,仅涉及智能合约开发的一个方面。

智能合约比实际看上去的还复杂,具体取决于您的业务逻辑,用户交互的建模,是否允许代币铸造和刻录,您在智能合约中引入的生命周期变更,以及管理级别功能的需求,这通常伴随着管理员授权的一组功能,等等。

尽管如此,如果你可以复制我们在这里所做的事情,那么这是扩展你的知识并在必要时转向更复杂智能合约的坚实基础。

智能合约是在以太坊虚拟机上执行的一段代码。以太坊智能合约是不可变的,可以发送或接收以太网和数据。

简而言之,ERC20代币是实施ERC20标准的智能合约。这些智能合约处理的操作包括获取代币的总供应和余额,以及用于转移它们的方法。

以太坊开发目前在Solidity中进行,Solidity是一种受JavaScript,Python和C ++启发的面向智能合约的编程语言。

原文:https://www.toptal.com/ethereum/create-erc20-token-tutorial

翻译:考拉

更多区块链信息:www.qukuaiwang.com.cn/news

文章下面


比特币多空调查

看涨
盘整
看跌
  • 看涨
  • 盘整
  • 看跌
投票

PC右侧250*250
内页右边3