成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

以太坊標(biāo)準(zhǔn)令牌系列之同質(zhì)化令牌ERC20

Little_XM / 2753人閱讀

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

0x00 寫在前面

眾所周知,以太坊在現(xiàn)階段最大的應(yīng)用就是令牌發(fā)行,而在以太坊中有很多類型的令牌,最著名的當(dāng)屬ERC20了,但是對于其他幾種令牌類型,可能還有一些朋友不知道,所以最近規(guī)劃了一個系列,就是以太坊標(biāo)準(zhǔn)令牌系列。

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

0x01 ERC20標(biāo)準(zhǔn)制定動機(jī)

在基于以太坊發(fā)行令牌時(shí),如果各個令牌發(fā)行方都使用自有標(biāo)準(zhǔn)去發(fā)行令牌,那對于錢包開發(fā)者以及交易所對接成本是極其高昂了,因?yàn)樗麄冃枰獮槊恳环N令牌去獨(dú)立進(jìn)行對接,為了降低錢包開發(fā)者以及交易所的對接成本,以太坊社區(qū)制定了一個關(guān)于令牌的發(fā)行標(biāo)準(zhǔn)。

該標(biāo)準(zhǔn)中主要包含了,令牌的轉(zhuǎn)移,地址余額的獲取等方法。

0x02 ERC20標(biāo)準(zhǔn)規(guī)范

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

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

下面介紹這些標(biāo)準(zhǔn)方法:

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

方法 該方法用于獲取令牌總發(fā)行量

2、balanceOf:獲取余額
函數(shù)原型
function balanceOf(address _owner) constant returns (uint256 balance)

方法 該方法用于獲取地址 _owner 的令牌余額

3、transfer:轉(zhuǎn)賬
函數(shù)原型
function transfer(address _to, uint256 _value) returns (bool success)

方法 該方法用于將調(diào)用令牌合約的地址中的_value個令牌轉(zhuǎn)給_to 地址

4、transferFrom:轉(zhuǎn)賬
函數(shù)原型
function transferFrom(address _from, address _to, uint256 _value) returns (bool success)

方法 該方法用于從_from 地址中發(fā)送_value 個令牌給_to地址。

當(dāng)你希望能夠使用其他智能合約控制你的令牌轉(zhuǎn)移,則可以使用transferFrom方法,而使用transferFrom方法有一個前提條件,那就是需要調(diào)用者需要得到 _from 地址的授權(quán),才可以進(jìn)行令牌轉(zhuǎn)移的操作。而如何進(jìn)行授權(quán),我們接下來會介紹。

5、approve:授權(quán)
函數(shù)原型
function approve(address _spender, uint256 _value) returns (bool success)

方法 允許 _spender 地址從你的賬戶中轉(zhuǎn)移 _value 個令牌到任何地方。

當(dāng)你設(shè)置了一個 _value 之后,_spender 地址可以分任何多次將令牌進(jìn)行轉(zhuǎn)移,直至_value為0.

6、allowance:獲取被授權(quán)令牌余額
函數(shù)原型
function allowance(address _owner, address _spender) constant returns (uint256 remaining)

方法 獲取 _owner 地址授權(quán)給 _spender 地址可以轉(zhuǎn)移的令牌的余額。

B. 事件(Event)

事件是EVM內(nèi)置的日志功能,而且在DAPP中,我們可以通過JS來監(jiān)聽事件的回調(diào)。在ERC-20令牌中,定義了以下事件:

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

當(dāng)進(jìn)行令牌轉(zhuǎn)移時(shí),需要觸發(fā)調(diào)用該事件。其中記錄了令牌發(fā)送者_from,令牌接受者_to ,令牌發(fā)送量_value.

2、Approval:授權(quán)事件
事件定義
event Approval(address indexed _owner, address indexed _spender, uint256 _value)

當(dāng)進(jìn)行授權(quán)時(shí),需要觸發(fā)調(diào)用該事件,其中記錄了授權(quán)者_owner,被授權(quán)者_spender,授權(quán)令牌量_value

0x03 ERC20令牌接口

通過以上的標(biāo)準(zhǔn),我們可以了解到一個遵守ERC20令牌標(biāo)準(zhǔn)的令牌合約需要實(shí)現(xiàn)的方法,以下是通過規(guī)范實(shí)現(xiàn)的一個ERC20令牌的接口。

contract EIP20Interface {
    
    ///////////////////////////// 方法 ///////////////////////////////////
    
      // 獲取令牌發(fā)行量
    // 注意:constant的修飾符是提示該方法中不能進(jìn)行變量的修改。
    //      但編譯器不會強(qiáng)制校驗(yàn)。
    // @return uint256 totalSupply 總發(fā)行量
    function totalSupply() constant returns (uint256 totalSupply)

       // 獲取指定地址
    // @param address _owner 想要獲取的地址
    // @return uint256 balance 令牌余額
    function balanceOf(address _owner) public view returns (uint256 balance);

    // 從`msg.sender`中發(fā)送`_value`個令牌給`_to` 
    // @param address _to 接收令牌的地址
    // @param uint256 _value 發(fā)送的令牌數(shù)量
    // @return bool success 發(fā)送令牌成功狀態(tài)
    function transfer(address _to, uint256 _value) public returns (bool success);

    // 從`_from`地址發(fā)送`_value`令牌到`_to`地址
    // 需要滿足條件,需要被`_from`地址授權(quán)給`msg.sender`
    // @param address _from 發(fā)送者地址
    // @param address _to 接收者地址
    // @param uint256 _value 發(fā)送的令牌數(shù)量
    // @return bool success 發(fā)送令牌成功狀態(tài)
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);

    // `msg.sender`授權(quán)`_spender`地址可以任意轉(zhuǎn)移`_value`數(shù)量的令牌
    // @param address _spender 被授權(quán)發(fā)送令牌的地址
    // @param uint256 _value 授權(quán)發(fā)送令牌的數(shù)量
    // @return bool success 授權(quán)成功狀態(tài)
    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
    // 獲取被授權(quán)限額
    // @param address _owner 令牌所有者的賬戶
    // @param address _spender 令牌被授權(quán)者賬戶
    // @return uint256 remaining 剩余可發(fā)送的令牌數(shù)量
    function allowance(address _owner, address _spender) public view returns (uint256 remaining);
    
    ///////////////////////////// 事件 ///////////////////////////////////
    // 令牌轉(zhuǎn)移事件 當(dāng)發(fā)生令牌的轉(zhuǎn)移時(shí),需要調(diào)用該事件
    event Transfer(address indexed _from, address indexed _to, uint256 _value); 
    // 授權(quán)轉(zhuǎn)移事件 當(dāng)進(jìn)行授權(quán)時(shí),需要觸發(fā)該事件
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
0x04 ERC20代碼示例

在標(biāo)準(zhǔn)的基礎(chǔ)上,有很多代碼的實(shí)現(xiàn)方法,比如有的在代碼中實(shí)現(xiàn)空投,有的在實(shí)現(xiàn)鎖定,有的實(shí)現(xiàn)挖礦等等,但是最常規(guī)的實(shí)現(xiàn)已經(jīng)有了官方的實(shí)現(xiàn)代碼,也有很多組織實(shí)現(xiàn)了一些范例,如果沒有定制化的地方,完全可以直接采用這些代碼去創(chuàng)建ERC20令牌。

示例代碼:

pragma solidity ^0.4.18;

contract ERC20 {

    // 定義一個mapping 存儲各個地址的令牌
    mapping (address => uint256) public balances;
    // 定義一個mapping 存儲授權(quán)詳情
    mapping (address => mapping (address => uint256)) public allowed;
    
    // 以下參數(shù)非必須,但是盡量添加,大多數(shù)錢包會通過此獲取相關(guān)信息

    // 令牌發(fā)行總量
    uint256 public totalSupply;

    // 令牌名稱,如 OmiseGO
    string public name;      
    // 支持的小數(shù)位數(shù)
    // 因?yàn)樵贓VM中對浮點(diǎn)數(shù)的支持很差,在令牌的創(chuàng)建中直接采用整數(shù)
    // 然后通過該字段進(jìn)行小數(shù)的處理
    uint8 public decimals;                
    // 令牌簡稱,如 OMG
    string public symbol;              

    // 令牌合約的構(gòu)造函數(shù)
    // 在solidity中,和合約名稱一致的方法為構(gòu)造函數(shù),在第一次創(chuàng)建合約時(shí),僅執(zhí)行一次。
    function ERC20(
        uint256 _totalSupply,    // 令牌創(chuàng)建總量
        string _name,        // 令牌名稱
        uint8 _decimals,    // 支持小數(shù)位數(shù)
        string _symbol        // 令牌簡稱
    ) public {
        // 給創(chuàng)建者賬戶初始化令牌
        balances[msg.sender] = _totalSupply;               
        // 設(shè)置令牌發(fā)行量
        totalSupply = _totalSupply;                        
        // 設(shè)置令牌名稱
        name = _name;                                   
        // 設(shè)置令牌支持小數(shù)位數(shù)
        decimals = _decimals;                            
        // 設(shè)置令牌簡稱
        symbol = _symbol;                               
    }

    /**
     * 獲取令牌總發(fā)行量
     * @return uint256 totalSupply 發(fā)行總量
     */
    function totalSupply() constant returns (uint256 totalSupply) {
        return totalSupply;
    }

    /**
     * 轉(zhuǎn)移令牌
     * @param address _to 令牌接收者地址       
     * @param uint256 _value 發(fā)送令牌數(shù)量
     * @return bool success 發(fā)送成功狀態(tài)
     */
    function transfer(address _to, uint256 _value) public returns (bool success) {
        // 判斷發(fā)送者余額是否充足
        require(balances[msg.sender] >= _value);
        // 從發(fā)送者余額中減去`_value`數(shù)量的令牌
        balances[msg.sender] -= _value;
        // 給接收者賬戶中添加`_value`數(shù)量的令牌
        balances[_to] += _value;
        // 記錄令牌轉(zhuǎn)移的事件
        Transfer(msg.sender, _to, _value);
        return true;
    }

    /**
     * 轉(zhuǎn)移令牌(授權(quán))
     * @param address _from 令牌發(fā)送者地址
     * @param address _to 令牌接收者地址
     * @param uint256 _value 令牌發(fā)送數(shù)量
     * @return bool success 方法執(zhí)行狀態(tài)
     */
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {

        // 其中`msg.sender`是合約方法調(diào)用者的地址

        // 獲取`_from`地址授權(quán)給`msg.sender`地址的可轉(zhuǎn)移令牌余額
        uint256 allowance = allowed[_from][msg.sender];
        
        // 判斷`_from`地址余額是否充足以及授權(quán)轉(zhuǎn)移令牌是否充足
        require(balances[_from] >= _value && allowance >= _value);
        
        // 從`_from`地址減去`_value`數(shù)量的令牌
        balances[_from] -= _value;
        
        // 從授權(quán)余額中減去`_value`數(shù)量的令牌
        allowed[_from][msg.sender] -= _value;

        // 給`_to`地址添加`_value`數(shù)量的令牌
        balances[_to] += _value;

        // 記錄轉(zhuǎn)移令牌的事件
        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];
    }   

    /**
     * 授權(quán)令牌轉(zhuǎn)移方法
     * @param address _spender 被授權(quán)地址
     * @param uint256 _value 授權(quán)可轉(zhuǎn)移的數(shù)量
     * @return bool success 方法執(zhí)行狀態(tài)
     */
    function approve(address _spender, uint256 _value) public returns (bool success) {
        // `msg.sender`授權(quán)`_spender`地址轉(zhuǎn)移`_value`數(shù)量的令牌
        allowed[msg.sender][_spender] = _value;

        // 記錄授權(quán)事件
        Approval(msg.sender, _spender, _value);
        return true;
    }

    /**
     * 獲取被授權(quán)的令牌余額
     * @param address _owner 授權(quán)地址
     * @param address _spender 被授權(quán)地址        
     * @return uint256 remaining 可轉(zhuǎn)移的令牌余額
     */
    function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
        return allowed[_owner][_spender];
    }   
}
0x05 寫在后面

大多數(shù)在交易所交易的令牌的合約代碼就這么簡單,其實(shí)每一個方法拆分開來都是最簡單的編程代碼,而核心的處理都被EVM進(jìn)行了封裝,以太坊在令牌發(fā)行方面確實(shí)極大的解放了人類,簡單幾十行代碼就可以發(fā)行一個令牌。ERC20令牌又被成為同質(zhì)化令牌,就是每個令牌都是一致的,無法區(qū)分,而市場上現(xiàn)在冒出了很多以太貓,以太狗的游戲,而這里面也是使用以太坊的令牌來實(shí)現(xiàn)的,但是他們選擇的不是ERC20令牌,而是被成為非同質(zhì)化的令牌,被稱為ERC721令牌。

下期,我們一起來聊非同質(zhì)化令牌ERC721。

喜歡,不要說話,掃我~

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24010.html

相關(guān)文章

  • 區(qū)塊鏈技術(shù)學(xué)習(xí)指引

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

    Cristic 評論0 收藏0
  • 關(guān)于區(qū)塊鏈通證模型,你想知道的都在這

    摘要:在以太坊出現(xiàn)后,進(jìn)入了第二階段。以太坊可以被視作區(qū)塊鏈?zhǔn)澜珙愃朴诤偷牡讓硬僮飨到y(tǒng)。通證經(jīng)濟(jì)的設(shè)計(jì)方向模式的組織,是天然的生態(tài)型組織。區(qū)塊鏈時(shí)代的生態(tài)組織,大致可以分成這幾種類型。 簡介 ??區(qū)塊鏈最重要的應(yīng)用就是將實(shí)物價(jià)值或虛擬資產(chǎn)映射成鏈上Token,通過資產(chǎn)上鏈,實(shí)現(xiàn)跨地域、低成本的進(jìn)行資產(chǎn)交易與轉(zhuǎn)移,本質(zhì)上是權(quán)益再分配,核心是提高激勵性和效益。??很多人把Token譯為代幣,我更...

    huangjinnan 評論0 收藏0
  • 區(qū)塊鏈開發(fā)中使用的最流行的編程語言

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

    2shou 評論0 收藏0
  • 剖析非質(zhì)化代幣ERC721-全面解析ERC721標(biāo)準(zhǔn)

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

    Sike 評論0 收藏0
  • Java開發(fā)區(qū)塊鏈的三大sdk庫

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

    iKcamp 評論0 收藏0

發(fā)表評論

0條評論

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