国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

以太坊標準令牌系列之同質化令牌ERC20

Little_XM / 2747人閱讀

摘要:目前市面上,凡是基于以太坊的令牌,在交易所上線交易的均是令牌,那么今天我們就來聊聊令牌的標準方案吧。

0x00 寫在前面

眾所周知,以太坊在現階段最大的應用就是令牌發行,而在以太坊中有很多類型的令牌,最著名的當屬ERC20了,但是對于其他幾種令牌類型,可能還有一些朋友不知道,所以最近規劃了一個系列,就是以太坊標準令牌系列。

目前市面上,凡是基于以太坊的令牌,在交易所上線交易的均是ERC20令牌,那么今天我們就來聊聊ERC20令牌的標準方案吧。

0x01 ERC20標準制定動機

在基于以太坊發行令牌時,如果各個令牌發行方都使用自有標準去發行令牌,那對于錢包開發者以及交易所對接成本是極其高昂了,因為他們需要為每一種令牌去獨立進行對接,為了降低錢包開發者以及交易所的對接成本,以太坊社區制定了一個關于令牌的發行標準。

該標準中主要包含了,令牌的轉移,地址余額的獲取等方法。

0x02 ERC20標準規范

一個令牌的合約,一般需要令牌的發行量,每個地址的余額,令牌的轉移等方法, 而ERC20標準就是將這些最常用又是必不可少的方法,對此進行標準化,方便開發者進行令牌合約的開發,也方便錢包開發者以及交易所對接成本降到最低。

其中,定義了三類,方法、屬性、事件。

下面介紹這些標準方法:

A. 方法(Method) 1、totalSupply:令牌總量
函數原型
function totalSupply() constant returns (uint256 totalSupply)

方法 該方法用于獲取令牌總發行量

2、balanceOf:獲取余額
函數原型
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令牌中,定義了以下事件:

1、Transfer:轉移令牌
事件定義
event Transfer(address indexed _from, address indexed _to, uint256 _value)

當進行令牌轉移時,需要觸發調用該事件。其中記錄了令牌發送者_from,令牌接受者_to ,令牌發送量_value.

2、Approval:授權事件
事件定義
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

相關文章

  • 區塊鏈技術學習指引

    摘要:引言給迷失在如何學習區塊鏈技術的同學一個指引,區塊鏈技術是隨比特幣誕生,因此要搞明白區塊鏈技術,應該先了解下比特幣。但區塊鏈技術不單應用于比特幣,還有非常多的現實應用場景,想做區塊鏈應用開發,可進一步閱讀以太坊系列。 本文始發于深入淺出區塊鏈社區, 原文:區塊鏈技術學習指引 原文已更新,請讀者前往原文閱讀 本章的文章越來越多,本文是一個索引帖,方便找到自己感興趣的文章,你也可以使用左側...

    Cristic 評論0 收藏0
  • 關于區塊鏈通證模型,你想知道的都在這

    摘要:在以太坊出現后,進入了第二階段。以太坊可以被視作區塊鏈世界類似于和的底層操作系統。通證經濟的設計方向模式的組織,是天然的生態型組織。區塊鏈時代的生態組織,大致可以分成這幾種類型。 簡介 ??區塊鏈最重要的應用就是將實物價值或虛擬資產映射成鏈上Token,通過資產上鏈,實現跨地域、低成本的進行資產交易與轉移,本質上是權益再分配,核心是提高激勵性和效益。??很多人把Token譯為代幣,我更...

    huangjinnan 評論0 收藏0
  • 區塊鏈開發中使用的最流行的編程語言

    摘要:我們目前正處于一個新興的區塊鏈開發行業中。,一種在以太坊開發人員中流行的新的簡單編程語言,因為它是用于開發以太坊智能合約的語言。它是全球至少萬開發人員使用的世界上最流行的編程語言之一。以太坊,主要是針對工程師使用進行區塊鏈以太坊開發的詳解。 我們目前正處于一個新興的區塊鏈開發行業中。區塊鏈技術處于初期階段,然而這種顛覆性技術已經成功地風靡全球,并且最近經歷了一場與眾不同的繁榮。由于許多...

    2shou 評論0 收藏0
  • 剖析非質化代幣ERC721-全面解析ERC721標準

    摘要:本文就來剖析下什么是是什么在創建代幣一篇,我們講到過代幣,和一樣,同樣是一個代幣標準,官方簡要解釋是,簡寫為,多翻譯為非同質代幣。返回合約代幣符號,盡管是可選,但強烈建議實現,即便是返回空字符串。 本文首發于深入淺出區塊鏈社區原文鏈接:剖析非同質化代幣ERC721-全面解析ERC721標準原文已更新,請讀者前往原文閱讀 什么是ERC-721?現在我們看到的各種加密貓貓狗狗都是基于ERC...

    Sike 評論0 收藏0
  • Java開發區塊鏈的三大sdk庫

    摘要:是企業與區塊鏈相遇的地方。的框架旨在成為開發區塊鏈解決方案的支柱。以太坊,主要是針對工程師使用進行區塊鏈以太坊開發的詳解。 如果你想將區塊鏈合并到一個Java項目中,現在我們來看看就是這個細分領域中三個最大的OSS玩家。 好的伙計們,我們都聽說過比特幣,以太坊或其他加密貨幣,其中有一些時髦的名字圍繞著我們常見的新聞,但我們作為Java開發人員知道如何輕松地與這些區塊鏈技術進行交互嗎?以...

    iKcamp 評論0 收藏0

發表評論

0條評論

Little_XM

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<