摘要:目前市面上,凡是基于以太坊的令牌,在交易所上線交易的均是令牌,那么今天我們就來聊聊令牌的標準方案吧。
0x00 寫在前面
眾所周知,以太坊在現階段最大的應用就是令牌發行,而在以太坊中有很多類型的令牌,最著名的當屬ERC20了,但是對于其他幾種令牌類型,可能還有一些朋友不知道,所以最近規劃了一個系列,就是以太坊標準令牌系列。
目前市面上,凡是基于以太坊的令牌,在交易所上線交易的均是ERC20令牌,那么今天我們就來聊聊ERC20令牌的標準方案吧。
0x01 ERC20標準制定動機在基于以太坊發行令牌時,如果各個令牌發行方都使用自有標準去發行令牌,那對于錢包開發者以及交易所對接成本是極其高昂了,因為他們需要為每一種令牌去獨立進行對接,為了降低錢包開發者以及交易所的對接成本,以太坊社區制定了一個關于令牌的發行標準。
該標準中主要包含了,令牌的轉移,地址余額的獲取等方法。
0x02 ERC20標準規范一個令牌的合約,一般需要令牌的發行量,每個地址的余額,令牌的轉移等方法, 而ERC20標準就是將這些最常用又是必不可少的方法,對此進行標準化,方便開發者進行令牌合約的開發,也方便錢包開發者以及交易所對接成本降到最低。
其中,定義了三類,方法、屬性、事件。
下面介紹這些標準方法:
A. 方法(Method) 1、totalSupply:令牌總量function totalSupply() constant returns (uint256 totalSupply)
方法 該方法用于獲取令牌總發行量
function balanceOf(address _owner) constant returns (uint256 balance)
方法 該方法用于獲取地址 _owner 的令牌余額
3、transfer:轉賬function transfer(address _to, uint256 _value) returns (bool success)
方法 該方法用于將調用令牌合約的地址中的_value個令牌轉給_to 地址
4、transferFrom:轉賬function transferFrom(address _from, address _to, uint256 _value) returns (bool success)
方法 該方法用于從_from 地址中發送_value 個令牌給_to地址。
當你希望能夠使用其他智能合約控制你的令牌轉移,則可以使用transferFrom方法,而使用transferFrom方法有一個前提條件,那就是需要調用者需要得到 _from 地址的授權,才可以進行令牌轉移的操作。而如何進行授權,我們接下來會介紹。
5、approve:授權function approve(address _spender, uint256 _value) returns (bool success)
方法 允許 _spender 地址從你的賬戶中轉移 _value 個令牌到任何地方。
當你設置了一個 _value 之后,_spender 地址可以分任何多次將令牌進行轉移,直至_value為0.
6、allowance:獲取被授權令牌余額function allowance(address _owner, address _spender) constant returns (uint256 remaining)
方法 獲取 _owner 地址授權給 _spender 地址可以轉移的令牌的余額。
B. 事件(Event)事件是EVM內置的日志功能,而且在DAPP中,我們可以通過JS來監聽事件的回調。在ERC-20令牌中,定義了以下事件:
event Transfer(address indexed _from, address indexed _to, uint256 _value)
當進行令牌轉移時,需要觸發調用該事件。其中記錄了令牌發送者_from,令牌接受者_to ,令牌發送量_value.
event Approval(address indexed _owner, address indexed _spender, uint256 _value)
當進行授權時,需要觸發調用該事件,其中記錄了授權者_owner,被授權者_spender,授權令牌量_value
0x03 ERC20令牌接口通過以上的標準,我們可以了解到一個遵守ERC20令牌標準的令牌合約需要實現的方法,以下是通過規范實現的一個ERC20令牌的接口。
contract EIP20Interface { ///////////////////////////// 方法 /////////////////////////////////// // 獲取令牌發行量 // 注意:constant的修飾符是提示該方法中不能進行變量的修改。 // 但編譯器不會強制校驗。 // @return uint256 totalSupply 總發行量 function totalSupply() constant returns (uint256 totalSupply) // 獲取指定地址 // @param address _owner 想要獲取的地址 // @return uint256 balance 令牌余額 function balanceOf(address _owner) public view returns (uint256 balance); // 從`msg.sender`中發送`_value`個令牌給`_to` // @param address _to 接收令牌的地址 // @param uint256 _value 發送的令牌數量 // @return bool success 發送令牌成功狀態 function transfer(address _to, uint256 _value) public returns (bool success); // 從`_from`地址發送`_value`令牌到`_to`地址 // 需要滿足條件,需要被`_from`地址授權給`msg.sender` // @param address _from 發送者地址 // @param address _to 接收者地址 // @param uint256 _value 發送的令牌數量 // @return bool success 發送令牌成功狀態 function transferFrom(address _from, address _to, uint256 _value) public returns (bool success); // `msg.sender`授權`_spender`地址可以任意轉移`_value`數量的令牌 // @param address _spender 被授權發送令牌的地址 // @param uint256 _value 授權發送令牌的數量 // @return bool success 授權成功狀態 function approve(address _spender, uint256 _value) public returns (bool success); /// @param _owner The address of the account owning tokens /// @param _spender The address of the account able to transfer the tokens /// @return Amount of remaining tokens allowed to spent // 獲取被授權限額 // @param address _owner 令牌所有者的賬戶 // @param address _spender 令牌被授權者賬戶 // @return uint256 remaining 剩余可發送的令牌數量 function allowance(address _owner, address _spender) public view returns (uint256 remaining); ///////////////////////////// 事件 /////////////////////////////////// // 令牌轉移事件 當發生令牌的轉移時,需要調用該事件 event Transfer(address indexed _from, address indexed _to, uint256 _value); // 授權轉移事件 當進行授權時,需要觸發該事件 event Approval(address indexed _owner, address indexed _spender, uint256 _value); }0x04 ERC20代碼示例
在標準的基礎上,有很多代碼的實現方法,比如有的在代碼中實現空投,有的在實現鎖定,有的實現挖礦等等,但是最常規的實現已經有了官方的實現代碼,也有很多組織實現了一些范例,如果沒有定制化的地方,完全可以直接采用這些代碼去創建ERC20令牌。
示例代碼:
pragma solidity ^0.4.18; contract ERC20 { // 定義一個mapping 存儲各個地址的令牌 mapping (address => uint256) public balances; // 定義一個mapping 存儲授權詳情 mapping (address => mapping (address => uint256)) public allowed; // 以下參數非必須,但是盡量添加,大多數錢包會通過此獲取相關信息 // 令牌發行總量 uint256 public totalSupply; // 令牌名稱,如 OmiseGO string public name; // 支持的小數位數 // 因為在EVM中對浮點數的支持很差,在令牌的創建中直接采用整數 // 然后通過該字段進行小數的處理 uint8 public decimals; // 令牌簡稱,如 OMG string public symbol; // 令牌合約的構造函數 // 在solidity中,和合約名稱一致的方法為構造函數,在第一次創建合約時,僅執行一次。 function ERC20( uint256 _totalSupply, // 令牌創建總量 string _name, // 令牌名稱 uint8 _decimals, // 支持小數位數 string _symbol // 令牌簡稱 ) public { // 給創建者賬戶初始化令牌 balances[msg.sender] = _totalSupply; // 設置令牌發行量 totalSupply = _totalSupply; // 設置令牌名稱 name = _name; // 設置令牌支持小數位數 decimals = _decimals; // 設置令牌簡稱 symbol = _symbol; } /** * 獲取令牌總發行量 * @return uint256 totalSupply 發行總量 */ function totalSupply() constant returns (uint256 totalSupply) { return totalSupply; } /** * 轉移令牌 * @param address _to 令牌接收者地址 * @param uint256 _value 發送令牌數量 * @return bool success 發送成功狀態 */ function transfer(address _to, uint256 _value) public returns (bool success) { // 判斷發送者余額是否充足 require(balances[msg.sender] >= _value); // 從發送者余額中減去`_value`數量的令牌 balances[msg.sender] -= _value; // 給接收者賬戶中添加`_value`數量的令牌 balances[_to] += _value; // 記錄令牌轉移的事件 Transfer(msg.sender, _to, _value); return true; } /** * 轉移令牌(授權) * @param address _from 令牌發送者地址 * @param address _to 令牌接收者地址 * @param uint256 _value 令牌發送數量 * @return bool success 方法執行狀態 */ function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { // 其中`msg.sender`是合約方法調用者的地址 // 獲取`_from`地址授權給`msg.sender`地址的可轉移令牌余額 uint256 allowance = allowed[_from][msg.sender]; // 判斷`_from`地址余額是否充足以及授權轉移令牌是否充足 require(balances[_from] >= _value && allowance >= _value); // 從`_from`地址減去`_value`數量的令牌 balances[_from] -= _value; // 從授權余額中減去`_value`數量的令牌 allowed[_from][msg.sender] -= _value; // 給`_to`地址添加`_value`數量的令牌 balances[_to] += _value; // 記錄轉移令牌的事件 Transfer(_from, _to, _value); return true; } /** * 獲取`_owner`地址的令牌余額 * @param address _owner 要獲取余額的地址 * @return uint256 balance 返回`_owner`地址的余額 */ function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; } /** * 授權令牌轉移方法 * @param address _spender 被授權地址 * @param uint256 _value 授權可轉移的數量 * @return bool success 方法執行狀態 */ function approve(address _spender, uint256 _value) public returns (bool success) { // `msg.sender`授權`_spender`地址轉移`_value`數量的令牌 allowed[msg.sender][_spender] = _value; // 記錄授權事件 Approval(msg.sender, _spender, _value); return true; } /** * 獲取被授權的令牌余額 * @param address _owner 授權地址 * @param address _spender 被授權地址 * @return uint256 remaining 可轉移的令牌余額 */ function allowance(address _owner, address _spender) public view returns (uint256 remaining) { return allowed[_owner][_spender]; } }0x05 寫在后面
大多數在交易所交易的令牌的合約代碼就這么簡單,其實每一個方法拆分開來都是最簡單的編程代碼,而核心的處理都被EVM進行了封裝,以太坊在令牌發行方面確實極大的解放了人類,簡單幾十行代碼就可以發行一個令牌。ERC20令牌又被成為同質化令牌,就是每個令牌都是一致的,無法區分,而市場上現在冒出了很多以太貓,以太狗的游戲,而這里面也是使用以太坊的令牌來實現的,但是他們選擇的不是ERC20令牌,而是被成為非同質化的令牌,被稱為ERC721令牌。
下期,我們一起來聊非同質化令牌ERC721。
喜歡,不要說話,掃我~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24010.html
摘要:在以太坊出現后,進入了第二階段。以太坊可以被視作區塊鏈世界類似于和的底層操作系統。通證經濟的設計方向模式的組織,是天然的生態型組織。區塊鏈時代的生態組織,大致可以分成這幾種類型。 簡介 ??區塊鏈最重要的應用就是將實物價值或虛擬資產映射成鏈上Token,通過資產上鏈,實現跨地域、低成本的進行資產交易與轉移,本質上是權益再分配,核心是提高激勵性和效益。??很多人把Token譯為代幣,我更...
摘要:我們目前正處于一個新興的區塊鏈開發行業中。,一種在以太坊開發人員中流行的新的簡單編程語言,因為它是用于開發以太坊智能合約的語言。它是全球至少萬開發人員使用的世界上最流行的編程語言之一。以太坊,主要是針對工程師使用進行區塊鏈以太坊開發的詳解。 我們目前正處于一個新興的區塊鏈開發行業中。區塊鏈技術處于初期階段,然而這種顛覆性技術已經成功地風靡全球,并且最近經歷了一場與眾不同的繁榮。由于許多...
摘要:本文就來剖析下什么是是什么在創建代幣一篇,我們講到過代幣,和一樣,同樣是一個代幣標準,官方簡要解釋是,簡寫為,多翻譯為非同質代幣。返回合約代幣符號,盡管是可選,但強烈建議實現,即便是返回空字符串。 本文首發于深入淺出區塊鏈社區原文鏈接:剖析非同質化代幣ERC721-全面解析ERC721標準原文已更新,請讀者前往原文閱讀 什么是ERC-721?現在我們看到的各種加密貓貓狗狗都是基于ERC...
摘要:是企業與區塊鏈相遇的地方。的框架旨在成為開發區塊鏈解決方案的支柱。以太坊,主要是針對工程師使用進行區塊鏈以太坊開發的詳解。 如果你想將區塊鏈合并到一個Java項目中,現在我們來看看就是這個細分領域中三個最大的OSS玩家。 好的伙計們,我們都聽說過比特幣,以太坊或其他加密貨幣,其中有一些時髦的名字圍繞著我們常見的新聞,但我們作為Java開發人員知道如何輕松地與這些區塊鏈技術進行交互嗎?以...
閱讀 1638·2021-10-12 10:11
閱讀 3755·2021-09-03 10:35
閱讀 1441·2019-08-30 15:55
閱讀 2128·2019-08-30 15:54
閱讀 998·2019-08-30 13:07
閱讀 1011·2019-08-30 11:09
閱讀 578·2019-08-29 13:21
閱讀 2647·2019-08-29 11:32