您的位置:首頁»數碼科技»正文

区块链中的ERC-20 代币标准

簡介

ERC-20是以太坊的一種token合約標準, 為token合約提供了接口的共同標準, 允許以太坊上發行的各種代幣被其他應用使用, 如錢包、去中心化交易所等。 目前很多區塊鏈項目所發行的代幣就是基于以太坊的ERC-20標準, 下圖是Etherscan上查詢到的一些ERC-20代幣的信息:

Token合約是什么?

現在仍存在著大量關于“token合約到底是什么”的爭論。 本質上來說, 一個token合約就是一個包含了一個對賬戶地址及其余額的映射的智能合約(Smart Contract)。 賬戶余額表示一種由合約創建者定義的值:一個token合約也許使用余額來表示物理對象, 或是表示另一種貨幣價值,

還可以表示持有人的名譽。 余額的單位通常被稱為token。

當token從一個賬戶被轉移到另一個賬戶的時候, token合約更新兩個賬戶的余額。 比如, 一筆從 0x2299…3ab7 到 0x1f59…3492 的10個token的轉賬將導致余額列表如下圖所示進行更新:

如果該token合約允許的話, 變更一種token的總供給可能有兩種辦法。 token的總供給可以通過鑄造新token來增加。 舉個例子, 鑄造出100個token到地址 0x4ba5…ae22 將導致余額如下圖所示進行更新:

token的總供給也可以通過“銷毀”現有的token來減少。 比如, 0x4919…413d 銷毀了50個token, 這將導致余額如下圖所示更新:

銷毀token的另一種方式是將token發送到一個未創建私鑰的地址, 通常來說就是0地址。 這會使得這些token不可用, 在這方面, 它與銷毀token有同樣的效果, 但并沒有減少token的總數。 比如, 0x93f1…1b09 用此種方式銷毀了50個token將導致如下圖所示的余額:

簡單的token合約在一個從地址到余額的映射中保存上述信息。 當更多復雜的情景出現時, 比如發放股息, 替代性結構或者增補性結構常常要變得更強悍。 但是, 不管那些操作上的細節的話, 對外部可見的token余額總是像上面的圖示那樣的。

ERC-20 代幣標準的說明

下面的合約展示了ERC-20標準規定的標準接口, 為token合約提供了基礎的代幣轉移、授權第三方提取代幣等功能。

contract ERC20 { mapping(address => uint256) balances; mapping(address => mapping(address => uint256)) internal allowed; function name() constant returns (string name); function symbol() constant returns (string symbol); function decimals() constant returns (uint8 decimals); function totalSupply() constant returns (uint256 totalSupply); function balanceOf(address _owner) constant returns (uint256 balance); function allowance(address _owner, address _spender) constant returns (uint256 remaining); function transfer(address _to, uint256 _value) returns (bool success); function transferFrom(address _from, address _to, uint256 _value) returns (bool success); function approve(address _spender, uint256 _value) returns (bool success); event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value);}

Methods

name

返回代幣的名稱, 如 “MyToken”

function name() constant returns (string name)

symbol

返回代幣的標識, 如“HIX”

function symbol() constant returns (string symbol)

decimals

返回代幣使用的小數位數, 如decimals為8時意味著代幣最小可以劃分到0.00000001

function decimals() constant returns (uint8 decimals)

totalSupply

返回代幣的總供應量

function totalSupply() constant returns (uint256 totalSupply)

balanceOf

返回地址 _owner對應賬戶的代幣余額

function balanceOf(address _owner) constant returns (uint256 balance)

transfer

將 _value數量的代幣轉移給地址 _to, 并且必須觸發 Transfer事件。 當 _from 賬戶沒有足夠的代幣可以使用時,

函數應該拋出異常(throw)。

注意:_value 為0時也必須當做正常的轉賬來處理, 并且要觸發 Transfer事件

function transfer(address _to, uint256 _value) returns (bool success)

transferFrom

將 _value數量的代幣從地址 _from轉移到地址 _to, 并且必須觸發 Transfer事件 。

transferFrom方法可以用于允許一個合約以你的名義進行代幣的轉移。 若 _from賬戶沒有通過某些機制對消息的發送者進行授權的話, 這個函數應該拋出異常(throw)。

注意:_value 為0時也必須當做正常的轉賬來處理, 并且要觸發 Transfer事件

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

approve

允許 _spender從你的賬戶多次提款, 直到到達上限 _value。 如果這個函數被再次調用, 當前的限額會被新的 _value覆蓋。

function approve(address _spender, uint256 _value) returns (bool success)

allowance

返回當前 _spender能從 _owner處提款的數額大小。

function allowance(address _owner, address _spender) constant returns (uint256 remaining)

Events

Transfer

當發生代幣轉移時必須觸發, 包括數額為0的代幣轉移。

當一個token合約創建新代幣時, 也應該觸發 Transfer事件, 此時的 _from設置為 0x0

event Transfer(address indexed _from, address indexed _to, uint256 _value)

Approval

成功調用 approve(address _spender, uint256 _value)時必須觸發 Approval事件

event Approval(address indexed _owner, address indexed _spender, uint256 _value)

ERC-20 標準的實現

目前以太坊網絡上已經有非常多符合ERC-20標準的代幣。 不同的團隊針對ERC-20標準有著不同的實現, 以下是兩個ERC-20標準實現的例子:

https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC20/StandardToken.sol

https://github.com/ConsenSys/Tokens/blob/master/contracts/eip20/EIP20.sol

參考資料

ERC-20標準的官方文檔:https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md

科普 | 理解ERC-20 token合約:http://ethfans.org/ajian1984/articles/686

Next Article
喜欢就按个赞吧!!!
点击关闭提示