ERC20 协议

蒋嘉颖
2023-12-01

https://www.jb51.net/blockchain/797814.html

https://blog.csdn.net/bareape/article/details/124275062

代币标准–ERC20协议源码解析

我们在买入USDT时,就会看到ERC20、TRC20、Omni这三个选项,那么这些究竟代表了什么呢。其实这都是代币协议,TRC20是基于TRON网络中的一种代币协议,存储在TRON的地址当中,充值、提现都是通过TRON网络进行的,Omni是一种在比特币地址上的代币协议,所以每次转账(链上转账)时,都需要支付少量的比特币作为矿工费。

1、ERC20协议是什么

ERC-20标准中定义了一些函数接口。ERC20标准规定了各个代币的基本功能,它可以快速发币,而且使用又方便,因此空投币和大部分基于以太坊合约的代币基本上就是利用ERC-20标准开发的;

除了ERC20之外,还有ERC721,ERC223,ERC621,ERC827, 具体不做累述,但是对ERC721顺便说一下,ERC721是主要用于区块链游戏的协议,大家经常看到的区块链游戏基本上是基于ERC721。

简单来说,ERC-20就是一套基于以太坊网络的标准代币发行协议。有了ERC-20,开发者们得以高效、可靠、低成本地创造专属自己项目的代币

2、ERC-20协议技术详解

ERC20的标准接口是这样的:

contract ERC20 {
      function name() constant returns (string name)
      
      function symbol() constant returns (string symbol)
      
      function decimals() constant returns (uint8 decimals)
      
      function totalSupply() constant returns (uint totalSupply);
      
      function balanceOf(address _owner) constant returns (uint balance);
      
      function transfer(address _to, uint _value) returns (bool success);
      
      function transferFrom(address _from, address _to, uint _value) returns (bool success);
      
      function approve(address _spender, uint _value) returns (bool success);
      
      function allowance(address _owner, address _spender) constant returns (uint remaining);
      
      event Transfer(address indexed _from, address indexed _to, uint _value);
      
      event Approval(address indexed _owner, address indexed _spender, uint _value);

2.1 name

返回ERC20代币的名字,例如”BNB”。

2.2 symbol

返回代币的简称,例如:MTT,这个也是我们一般在代币交易所看到的名字。

2.3 decimals

返回token使用的小数点后几位。比如如果设置为3,就是支持0.001表示。

2.4 totalSupply

function totalSupply() constant returns (uint totalSupply);

返回token的总供应量。
展示了目前该token的流通总量,可以被所有函数调取。每当有新token被通过挖矿的方式加入到流通市场,该逻辑就会更新内部变量totalSupply_的值

2.5 balanceOf

function balanceOf(address _owner) constant returns (uint balance);

返回某个地址(账户)的账户余额

2.6 transfer

function transfer(address _to, uint _value) returns (bool success);

从代币合约的调用者地址上转移_value的数量token到的地址_to,并且必须触发Transfer事件。
token转账是需要消耗gas的,因为转账将导致以太坊智能合约中一个状态的变化。

2.7 transferFrom

function transferFrom(address _from, address _to, uint _value) returns (bool success);

从地址_from发送数量为_value的token到地址_to,必须触发Transfer事件。transferFrom方法用于允许合同代理某人转移token。条件是from账户必须经过了approve。

2.8 approve

function approve(address _spender, uint _value) returns (bool success);

允许_spender多次取回您的帐户,最高达_value金额。 如果再次调用此函数,它将以_value覆盖当前的余量。

2.9 allowance

function allowance(address _owner, address _spender) constant returns (uint remaining);

返回_spender仍然被允许从_owner提取的金额。

2.10 event Transfer

event Transfer(address indexed _from, address indexed _to, uint _value);

在发生交易转移时触发。Solidity event在 EVM 的日志记录功能之上提供了一个抽象。应用程序可以通过以太坊客户端的 RPC 接口订阅和监听这些事件

2.11 event Approval

event Approval(address indexed _owner, address indexed _spender, uint _value);

在发生代币授权时触发该事件

3、一些概念

3.1 什么是ERC

ERC(EthereumRequest for Comment)即以太坊通用征求意见协议。每一个开源的社区都需要一个系统来处理成员提出的请求和对请求的采纳。ERC就在以太坊网络中行使这样的一个职能,ERC为开发者提供了技术指导,也对以太坊网络的发展提供了建议。

开发者可以通过提交EIP(Ethereum Improvement Proposal以太坊改进建议),向以太坊社区提交新的ERC标准提案。提交内容包括协议规范和合约标准。一旦该EIP获得以太坊委员会的批准并最终定型,它就会成为一个新的ERC。

新的ERC为以太坊开发者提供了一套可实施的标准。开发者就可以使用这些标准搭建智能合约。

3.2 什么是非同质化?

同质化的加密代币遵循相同的同质化协议,这意味着这些代币可以进行交易置换。就像是在一个游乐场,我们都需要把现金换成游戏币才能用这些游戏币去使用各种设施,你我的游戏币可以自由交换,因为我们两个的游戏币本质是相同的,我们交换时只会产生数量的变化,而质没有变。在区块链上,这些可置换的加密货币被称为同质化货币。

这些同质化货币具有一个特性——他们可以与其他基于相同协议的代币交换。比较流行的有以太坊的 ERC 20 协议。ERC 20 是较早的代币规格协议,若有两个代币都在以太坊平台上以 ERC 20 协议发行,那这两个代币之间就可以自由置换。

同质化代币的另一个特性是它们的可分割性,意思是他们可以被分为最小单位来进行交换。就好比我们国家的法定货币最小单位是“分”,而比特币可以被分到最小单位satoshi(聪)(1聪=0.00000001比特币)。
同质化的规则固然好用,但是在某种程度来说,非同质化的概念对区块链技术更有创新意义。通过非同质化协议发行的代币都有自己独有的基因,这让每一枚代币的价值都不相同,因而无法进行两个币交换。同时非同质化代币也是不可分割的。你只能使用一整个代币,而无法将其拆分成更小的单位去使用。

在区块链里,非同质化的概念正在成为一种新的趋势。以太坊区块链最近开发的 ERC 721 协议允许在区块链上创建非同质化资产,即非同质化代币(简称NFT(Non-Fungible Token))。以太坊养猫(CryptoKitties)游戏就是基于 ERC 721 协议开发出来的,里面每一只猫都有独立且唯一的编号。

各种区块链平台对非同质化代币采用不同的协议标准。比如以太坊用的是 ERC 721 协议,而 Metaverse 使用 MIT(Metaverse Identifiable Token)协议。

3.3 NFT

NFT,全称为Non-Fungible Token,指非同质化通证,实质是区块链网络里具有唯一性特点的可信数字权益凭证,是一种可在区块链上记录和处理多维、复杂属性的数据对象。

 类似资料: