# ERC-20

By [un.Block](https://paragraph.com/@un-block) · 2021-10-09

---

这次我们将进一步学习代币的相关知识，代币背后的协议—— ERC-20

### **什么是 ERC-20**

在学习 ERC-20 前，我们在脑中应该先建立一个“代币” (Token) 的概念，在区块链网络中，一切物品都是可以被 “Token” 化的，无论是加密货币、图片、音乐、彩票等，而 ERC-20 就是规范这些代币的标准之一。

ERC-20 引入了一个关于可兑换代币 (fungible) 的标准，这些代币都有共同的属性，所以可以被理解为是一样的东西。市场上交易的大部分代币，如 $UNI、$MATIC、$SHIB 都是标准的 ERC-20 代币。

ERC-20 代币本质是一个**智能合约**，这个这个合约就像一个账本，记录着不同用户的代币余额，通过调用合约，可以完成授权、转账等交易。

你可以在 Ethersacn 上查看任意代币的智能合约，例如 UniSwap 的 [_$UNI_](https://link.zhihu.com/?target=https%3A//bit.ly/2SwS4LT)

### **ERC-20 的组成**

![](https://storage.googleapis.com/papyrus_images/a3b7359177bb3ab3a6e355e60f95c548639c4fd27dfa9c3f74aefd161d6bc7d4.jpg)

任何人都可以根据 ERC-20 编写智能合约，创造自己的代币，前提是智能合约需要满足以下功能：

### **查询总供应量**

![](https://storage.googleapis.com/papyrus_images/d21a1ebf79daf9dfbd281693347c1c964fe0da10e3e0a2af06b75821720d2717.png)

用户调用该函数时，将返回智能合约的代币总量

### **查询账户余额**

![](https://storage.googleapis.com/papyrus_images/388bb79d33745a6907031639acdf539b6dca020ea8c55b9558a146dd7faeb17d.png)

查询账户余额需要传入钱包地址作为参数，返回值是钱包中的代币数量。区块链网络中的钱包地址是公开的，因此知道地址，可以查询任意用户的余额

### **转账**

![](https://storage.googleapis.com/papyrus_images/829ee6ced1bc619c0018601134301bc0d95503a50da5bca73fbb03338a8c7753.png)

转账是将代币从自己的钱包转出到目标钱包，需要提供转账目的钱包和金额。

在调用转账函数时，会触发转账事件，转账的记录将被记录上链。

### **授权转账**

![](https://storage.googleapis.com/papyrus_images/e81fce0ba78381c16785357f4161f2da1134578f10a19b8dba4db765ba2387c6.png)

授权转账是另一种形式的转账，授权给合约后，合约可以代替你来进行转账操作（会触发转账事件）。例如订阅服务的付费，通过授权转账可以实现每个月自动缴费，这样就不需要麻烦的手动操作了。授权转账的形式拓展了 DApp 的可编程性。

### **授权**

![](https://storage.googleapis.com/papyrus_images/a96b73cd325f70a1fd05f594c5017ecb868c4ecde5c33ea75d6e8692a0c4cf60.png)

授权函数用于处理授权操作，\_spender 是你要授权的对象，\_value 是授权的金额数量。通过授权，可以限制合约的授权转账操作，降低资金被窃取的风险。

调用授权函数时，会触发授权事件，授权的相关记录将被记录上链。

### **查看允许量**

![](https://storage.googleapis.com/papyrus_images/769ee0406a4a7ccf06b38281842e08fda4c6b479adb7ee73f54f5a29da894a89.png)

查看允许量用于查询授权的额度还剩下多少，假如你通过 approve 授权了 20 个 Token 给 ContractA，ContractA 使用 transferFrom 每天从你钱包中转出 1 Token，5 天后，你调用 allowance ，可以看到结果是 15。

以上就是实现 ERC-20 需要的基本功能，除此之外，你还可以自定义代币名称，代币缩写，代币精度等可选参数，或实现铸币 mint 、燃烧代币 burn 等额外功能。

### **创造自己的 ERC-20 代币**

创造自己的 ERC-20 代币最简单的方式就是通过 [_OpenZeppelin_](https://link.zhihu.com/?target=https%3A//docs.openzeppelin.com/contracts/4.x/erc20) 的 ERC-20 库完成部署。你可以复制以下代码到 [_Remix_](https://link.zhihu.com/?target=https%3A//remix.ethereum.org/)，修改代码名称、代币缩写、初始化供应量，然后 Deploy 到虚拟链上

![](https://storage.googleapis.com/papyrus_images/02710761082dab6afeacead6518c45832fab6e73998c8f72e5a5e4986f34bc82.jpg)

### **除了 ERC-20**

虽然说 ERC-20 是最受欢迎的代币标准，但它并不是唯一的，市面上还有许多的其他标准，他们的出现或是为了实现不同的功能，或是为了改进 ERC-20：

*   ERC-721：流行的 NFT 代币 (not-fungible) 协议，他向用户提供了接口，用户可以自由铸造 NFT
    
*   ERC-777：ERC-20 的改进，解决了 ERC-20 小数点混乱的问题，引入了 hook 的概念，用户在发送或接受代币时会触发 hook
    

### **相关阅读：**

*   [_ERC-20 TOKEN STANDARD_](https://link.zhihu.com/?target=https%3A//ethereum.org/en/developers/docs/standards/tokens/erc-20/)
    
*   [_OpenZeppelin: ERC-20_](https://link.zhihu.com/?target=https%3A//docs.openzeppelin.com/contracts/4.x/erc20)
    
*   [_Binance Academy: ERC-20_](https://link.zhihu.com/?target=https%3A//academy.binance.com/zt/articles/an-introduction-to-erc-20-tokens%23what-can-erc-20-tokens-do)

---

*Originally published on [un.Block](https://paragraph.com/@un-block/erc-20)*
