以太坊科普:理解ERC-20 token合约

admin 2024年2月14日01:44:26评论11 views字数 4855阅读16分11秒阅读模式

背景知识

Token,即可交换的一种权益证明,其中每个权益具有相同性质,所以叫同质化代币。也就是在货币的概念下,这个可以表示某种币。

我们可以试想一下,假如你是一家银行,拥有发行一种货币的能力(可以发行多种货币,不同种类的货币,这里举一种),并且需要以接口的形式,这种纯IT的技术手段,把你发行的这种货币及对应的功能给暴露给大众用户,那么你需要怎么做?

【这里的,假设、想象,把一种新的事物跟自己了解的事物联系起来,并把自己作为一个角色代入进去,进行设想,我觉得是非常好的一种理解性学习的方法,话说爱因斯坦就是这么发明相对论的】

发行货币的思维游戏

一个思维游戏,你需要发行货币,来定义一下:

首先,货币的总量,需要定义一下,因为这好像比较重要,这个决定了你发行的货币,流通中的总价值量,如果这个东西不进行定义,那么你发行的货币就失去了价值,跟一个普通的纸片没有任何的区别了。

所以,我们说,必须要定义货币的总量,这个体现的这种货币,对应的某种价值的衡量的总的度量,即总价值量。

其次,还需要定义每个用户,有多少货币,并且需要提供给货币持有者进行查询,即货币余额查询的功能。

最后,还需要有转移货币的功能,允许一个用户,把他持有的货币,转移给另一个用户,即转账。

有了上面的思维热身,那么我们再看一下ERC-20,上述所说的,如果通过代码的形式,来把发行的货币表示出来(这里表示出来的,是同质化货币,可互相交换),这么一种定义货币的一个标准,落实到代码层面,就是一个ERC-20标准。

理解ERC-20 Token合约

在以太坊(Ethereum)的区块链网络中,ERC-20 Token合约是最常见和使用最广泛的一类智能合约。ERC-20是以太坊区块链上的一种标准,它规定了代币(Token)的基本特性和接口规范,使得代币的创建和交互变得简单和可靠。

ERC-20 Token合约 官方的定义说明

ERC-20是以太坊上使用的一种代币标准,它定义了代币合约的基本功能和标准方法。ERC-20 Token合约可以在以太坊网络上创建和部署,它们是智能合约的一种特殊类型,可以代表数字资产或代币。

ERC-20合约规定了代币的基本属性,包括代币的名称、符号、小数位数、总供应量等。除此之外,ERC-20还定义了代币转账、余额查询、授权他人代理转账等功能的标准接口方法。合约开发者按照ERC-20标准规范实现这些方法,使得不同代币之间的交互和兼容成为可能。

ERC-20合约的基本特性

在ERC-20合约中,每个代币被看作是一个独立的智能合约。通过ERC-20,代币合约可以方便地在以太坊网络上进行交易、发送和接收。

ERC-20合约规定的基本特性包括:

1. 代币名称(Token Name): 每个ERC-20代币合约都必须定义一个代币的名称,用于标识这个代币。

2. 代币符号(Token Symbol): 在ERC-20合约中,每个代币都要有一个简化的符号,类似于股票代号,在交易所和钱包中以简短的形式显示。

3. 小数位数(Decimals): ERC-20代币合约还规定了代币的小数位数,用于确定代币的精度。

4. 总供应量(Total Supply): 代币合约还要定义代币的总供应量,即代币的总数量。

5. 代币余额(Balance): ERC-20合约需要提供查询代币余额的方法,使用户可以查询自己的代币余额。

6. 代币转账(Transfer): 代币合约必须提供转账方法,使用户可以将代币发送给其他地址。

7. 授权代理转账(Approve and TransferFrom): ERC-20代币合约还支持授权代理转账,即用户可以授权其他地址转移代币,增加交易灵活性。

为什么使用ERC-20 Token

ERC-20 Token在以太坊生态系统中广泛应用的原因有以下几个方面:

1. 标准化: ERC-20定义了代币合约的标准接口和规范,使得不同代币之间可以无缝交互,增加了代币的流动性。

2. 灵活性: 通过ERC-20合约,代币发行者可以自定义代币的名称、符号、总供应量等属性,并提供丰富的代币操作功能。

3. 兼容性: 多个钱包、交易所和智能合约平台已经支持ERC-20标准,这意味着ERC-20代币可以在这些平台上自由交易和使用。

4. 安全性: ERC-20合约经过广泛测试和审查,可以提供相对稳定和安全的代币操作功能,减少了代币交易的风险。

一个ERC-20标准的代币合约的代码解读

如下,是以太坊生态中,比较著名的自动做市商应用Uniswap V2中,关于ERC20代币部分实现的源码,其代码解读如下:

contract UniswapV2ERC20 is IUniswapV2ERC20 {    // 为unit类型加上SafeMath的方法    using SafeMath for uint;    // token的名字    string public constant name = 'Uniswap V2';    // token的symbol    string public constant symbol = 'UNI-V2';    // token所支持的精度    uint8 public constant decimals = 18;    // token的总供应量    uint  public totalSupply;    // 地址与余额之间的映射,相当于于hash表    mapping(address => uint) public balanceOf;    // 授权交易与授权交易数额之间的映射    mapping(address => mapping(address => uint)) public allowance;    bytes32 public DOMAIN_SEPARATOR;    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");    bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;    // 地址与nonce之间的映射    mapping(address => uint) public nonces;    // 授权event    event Approval(address indexed owner, address indexed spender, uint value);    // 交易event    event Transfer(address indexed from, address indexed to, uint value);    constructor() public {        ......    }    // 铸币方法 这个方法主要的目的是向某个地址发送一定数量的token    // 0地址,就是空,可以理解为一个“黑洞”    function _mint(address to, uint value) internal {        totalSupply = totalSupply.add(value);        balanceOf[to] = balanceOf[to].add(value);        emit Transfer(address(0), to, value);    }    // 销毁方法 这个方法主要的目的是销毁某个地址的所持有的token    // 0地址,就是空,可以理解为一个“黑洞”    function _burn(address from, uint value) internal {        balanceOf[from] = balanceOf[from].sub(value);        totalSupply = totalSupply.sub(value);        emit Transfer(from, address(0), value);    }    // 授权私有方法 这个方法的逻辑也非常简单,就是修改allowance对应的映射并发出event    function _approve(address owner, address spender, uint value) private {        allowance[owner][spender] = value;        emit Approval(owner, spender, value);    }    // 转账私有方法 该方法实现了一个转账的逻辑,具体逻辑也非常简单,就是将from对应的banlanceOf减去value,to对应的balanceOf加上value,最后发出Transferevent    function _transfer(address from, address to, uint value) private {        balanceOf[from] = balanceOf[from].sub(value);        balanceOf[to] = balanceOf[to].add(value);        emit Transfer(from, to, value);    }    // approve授权方法 直接调用的授权的私有方法,并返回true    function approve(address spender, uint value) external returns (bool) {        _approve(msg.sender, spender, value);        return true;    }    // 转账方法 token的拥有者直接调用的方法,将token从拥有者身上转到to地址上去    function transfer(address to, uint value) external returns (bool) {        _transfer(msg.sender, to, value);        return true;    }    // 授权转账方法 在执行该方法之前,需要通过approve授权方法或者permit授权方法进行授权。转账之前需要确认msg.sender在allowance中是否有值,如果有值就减去对应的金额。    function transferFrom(address from, address to, uint value) external returns (bool) {        if (allowance[from][msg.sender] != uint(-1)) {            allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);        }        _transfer(from, to, value);        return true;    }    // permit授权方法    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {        // 检查时效时间是否超时        require(deadline >= block.timestamp, 'UniswapV2: EXPIRED');        // 构建电子签        bytes32 digest = keccak256(            abi.encodePacked(                'x19x01',                DOMAIN_SEPARATOR,                keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))            )        );        // 验证签名并获取签名信息的地址        address recoveredAddress = ecrecover(digest, v, r, s);        // 确保地址不是0地址, 并且等于token的owner        require(recoveredAddress != address(0) && recoveredAddress == owner, 'UniswapV2: INVALID_SIGNATURE');        // 进行授权        _approve(owner, spender, value);    }}

代码完整参考:

https://blog.csdn.net/zhoujianwei/article/details/124893118

以太坊科普:理解ERC-20 token合约

原文始发于微信公众号(黑客与极客):以太坊科普:理解ERC-20 token合约

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月14日01:44:26
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   以太坊科普:理解ERC-20 token合约https://cn-sec.com/archives/2217772.html

发表评论

匿名网友 填写信息