主页 > imtoken钱包官网app下载 > 了解 ERC-20 代币合约

了解 ERC-20 代币合约

imtoken钱包官网app下载 2023-06-19 07:26:05

本周早些时候(译者注:原文发表于9月15日)usdt交易手续费怎么算,ERC-20代币接口正式成为改进协议,明确了其定义。 本文将简要介绍各种符合ERC-20标准的代币,并解释ERC-20的特点和功能,让读者了解什么是代币合约,以及开发者应该如何使用该标准。

ERC-20 最初是试图为以太坊上的代币合约提供一个通用的功能和接口标准,现在已经证明是非常成功的。 ERC-20 有很多好处,包括允许钱包显示数百种不同代币的账户余额; 创建一个交易工具,仅提供代币合约的地址以列出更多代币。 创建 ERC-20 兼容代币的好处如此之多usdt交易手续费怎么算,以至于今天几乎没有其他代币合约是通过其他方式创建的。

什么是代币合约?

关于代币合约到底是什么,仍有很多争论。 本质上,代币合约是一种智能合约(Smart Contract),其中包含账户地址及其余额的映射。 账户余额表示由合约创建者定义的值:代币合约可能使用余额来表示实物,或表示另一种货币价值,或表示持有人的声誉。 余额单位通常称为代币。

淘宝交易有手续费吗_usdt交易手续费怎么算_比特时代交易有手续费

当代币从一个账户转移到另一个账户时,代币合约会更新两个账户的余额。 例如,将 10 个代币从 0x2299…3ab7 转移到 0x1f59…3492 将导致余额列表更新,如下所示:

淘宝交易有手续费吗_比特时代交易有手续费_usdt交易手续费怎么算

如果代币合约允许,可能有两种方法可以改变代币的总供应量。 可以通过铸造新代币来增加代币的总供应量。 例如,向地址 0x4ba5...ae22 铸造 100 个代币将导致余额更新,如下图所示:

usdt交易手续费怎么算_比特时代交易有手续费_淘宝交易有手续费吗

代币的总供应量也可以通过“销毁”现有代币来减少。 例如,0x4919…413d 销毁了 50 个代币,这将导致余额更新如下所示:

淘宝交易有手续费吗_比特时代交易有手续费_usdt交易手续费怎么算

另一种销毁令牌的方法是将令牌发送到一个没有创建私钥的地址,通常是地址0。这使得那些令牌无法使用,在这方面它与销毁令牌具有相同的效果,但它不会减少代币总数。 比如0x93f1…1b09这样销毁50个token会得到如下图所示的余额:

淘宝交易有手续费吗_比特时代交易有手续费_usdt交易手续费怎么算

简单的代币合约将上述信息存储在从地址到余额的映射中。 当出现更复杂的情况时,例如股息,替代或补充结构通常必须变得更强大。 但是,不管这些操作细节如何,外部可见的代币余额始终如上图所示。

ERC-20 代币合约的定义

ERC-20 合约由合约的地址和可用代币的总供应量来定义,但它通常也会提供一些可选的东西,这也为用户提供了更多的细节。 它们包括令牌的名称、标志和小数位。 下面详细介绍了其中的每一个。

在深入了解细节之前,了解代币合约没有集中注册很重要,因此无法保证特定名称和符号的唯一性。 创建代币合约后,您应该请求将其添加到公共站点,例如:Etherscan、MyEtherWallet 和 CoinMarketCap。 当然,确保您遵循网站上的说明可以最大限度地提高您的申请被接受的机会。

代币合约的名称是代币合约应该知道的全名,例如“我的代币”。 名字的长度没有限制,但是全名在一些钱包应用中更容易出现显示不全的情况,所以名字还是短一些为好。

代币合约的token是代币合约应该知道的符号,比如“MYT”。 从广义上讲,它相当于股票代码,虽然没有严格的长度限制,但通常为 3 或 4 个字母。

小数位通常是混淆的根源,但如果解释得当,这是可以理解的。 小数位是指令牌的可分性,从小数点后 0 位(即根本不可整除)到小数点后 18 位(几乎是连续的),如果需要还可以更多。 从技术上讲,小数位的含义是在屏幕上显示令牌值时小数点后的位数。 存在小数位的原因是以太坊不处理带小数的数字,只显示整数的数值。 考虑以下两个示例:

第一个例子是 LicenseToken,一个显示给定软件产品的软件许可分配的代币合约; 有了 LicenseToken,用户就可以使用该软件。 持有少于1个LicenseToken是没有意义的,所以token创建者将小数位设置为0。部分LicenseToken持有者的账户余额如下。

usdt交易手续费怎么算_淘宝交易有手续费吗_比特时代交易有手续费

可以看到,这里有100个license,主要是一个账号持有。 当用户购买许可证时,代币将从持有账户转移到购买者的账户。 许可证验证者可以检查特定帐户是否实际持有 LicenseToken,然后采取相应行动。

第二个例子是 GoldToken,一种代表实物黄金所有权的代币合约。 合约创建者希望每个单位代表 1 公斤黄金,但也希望允许用户在克级别(但不能更低)持有和交易黄金。 因为以太坊不支持小数,1个token必须代表1克黄金,而为了对外表示1000克为1Kg单位,小数位必须设置为3位(因为10^3克是1公斤黄金是代币 合约创建者希望以 1token 为单位显示。 一些 GoldToken 持有者可以用下面的图片表示。

淘宝交易有手续费吗_比特时代交易有手续费_usdt交易手续费怎么算

在这里您可以看到总共代表 50 公斤黄金(每个代币 1 克乘以 50,000 个代币)。

但是,如果小数位设置为 3,则用户的情况将如下所示:

比特时代交易有手续费_淘宝交易有手续费吗_usdt交易手续费怎么算

可以看出,设置小数位为3,字面意思是在显示GoldToken余额时,小数点后应有3位。

小数位通常被称为人性化元素,因为它允许代币合约定义他们希望如何向用户显示余额。 GoldToken 内部不处理小数位,并且在它自己的计算中从不使用小数位,因为一切都以克为单位计算,但它允许用户使用黄金的通用单位(千克)而不是合约中使用的单位(克).

如上图 GoldToken 所示,可分性的概念允许代币合约显示非常小的分数值,并且代币通常将小数位设置为 18 位,以赋予代币近乎连续的数值范围。

总而言之,在决定取多少小数位时应遵循以下规则:

代币合约是否代表一个不可分割的对象? (如果是)然后将小数位设置为 0

代币合约是否表示具有特定小数位的对象?然后将小数位设置为该数字

如果以上都不是,请将小数点设置为18位

了解小数位对合约创建的影响很重要。 创建的代币数量应等于代币总数,要求是10^小数位的倍数。 从 GoldToken 的例子可以看出,代币创建者想要创建代表 50 公斤黄金的代币,但由于小数点后 3 位,他们不得不发行 50,000 个代币(50×10^3)来做这件事。

总供应量是定义 ERC-20 代币合约的最后一件事,正如我们提到的,它是唯一的强制参数。 虽然在 ERC-20 规范中没有明确提及,但总供应量的概念很简单:总供应量等于所有余额的总和。 上面的例子一直显示的是总供应量,这里就不再赘述了。

ERC-20 代币合约的功能

ERC-20 代币合约具有一系列功能,可以让用户发现用户的余额,也可以让余额在验证后从一个账户转移到另一个账户。 这些功能如下所述。

balance() 函数提供给定地址持有的代币数量。 请记住,任何人都可以检查任何地址的余额,因为所有数据都在区块链上公开。

有两种方法可以将令牌从一个地址发送到另一个地址。 tranfer() 函数可以直接将一些令牌从信息发送者转移到森林中的一个地址。 请记住,人们不会检查接收地址,因此发送方有责任确保接收方的行为符合预期。

虽然 transfer() 非常适合将代币发送给另一个用户,但当代币将用于支付智能合约中的功能时,它就不起作用了。 这是因为,当智能合约运行时,它无法获得哪个地址转账到哪里的详细信息,因此无法保证调用此合约的用户已经支付了启动合约所需的资金数额。

想象一下,网络上部署了一个合约 Doer。 Doer 有一个函数 dosomething() 需要 10 个 Do 令牌才能运行。 Joe 希望调用 dosomething() 并且他的账户上还有 50Do 代币。 Joe 如何向 Doer 付款,以便后者可以成功运行 dosomething()?

approve() 和 transferFrom() 是使用两步过程解决上述问题的两个方程式。 第一步,代币持有者给另一个地址(通常是智能合约)批准从本地转移一个最大特定数量的代币,也就是所谓的配额。 令牌持有者使用 approve() 来提供此信息。

usdt交易手续费怎么算_淘宝交易有手续费吗_比特时代交易有手续费

在上面的示例中,第二行显示地址为 0x1f59...3492 的 Joe 允许地址为 0xd8f0...c028 的 Doer 从 Joe 的账户中转出 25 个代币。

创建许可证后,智能合约可以从用户的配额中获取许可数量的代币作为运行合约的一部分。 继续这个例子。 Joe 现在可以调用 dosomething(),dosomething() 可以使用 transferFrom() 从 Joe 的帐户中获取 10 个 Dotoken,然后开始工作。 如果 Joe 的账户没有 10 个令牌,或者配额低于 10 个令牌,dosomething() 将崩溃。

allowance() 函数提供允许从给定地址提取到另一个给定地址的代币数量。 请记住,任何人都可以查看任何地址的余额,因为所有信息都在区块链上公开。 重要的是要知道配额是“软”的,因为所有个人或累积配额都可以超过地址的余额。 在上表中,持有人 0x2299…3ab7 最多允许转移 500 个代币,但如上所示,他的余额只有 90 个代币。 任何使用 allowance() 的合约在计算可用代币数量时都必须额外考虑用户的余额。

ERC-20 代币合约中的事件

ERC-20 定义了两种类型的事件,当合约采取相关行动时必须触发这些事件。 第一类事件是 Transfer(),它发布从一个地址到另一个地址的代币转账细节。 第二种事件是 Approval(),它发布了将令牌从一个地址转移到另一个地址的详细信息。 这些可用于跟踪地址余额和配额的变化,而无需查询区块链。

铸造令牌会发出一个以 o 地址为源的 Transfer() 事件。

当令牌被销毁时,不会发出任何事件。 正因为如此,ERC-20 代币合约经常通过 transfer() 将代币发送到地址 0 来销毁代币,而不是真正销毁。

超越 ERC-20

ERC-20 为构建代币合约提供了良好的基础,但它并非没有问题。 ERC-223 协议提供了额外的功能和安全措施,但与 ERC-20 不兼容。 Token合约的构建将继续遵循今天的ERC-20,开发者应该跟踪ERC-223协议并为之做出贡献。