Try   HackMD

同質化代幣合約 EIP20 介紹

contributed by < steven1lung >

EIP20 介紹

EIP 全名 Ethereum Improvement Proposals,這個專案是為了將 ethereum 的標準合約都集中起來說明,讓使用 ethereum 的客戶或是應用程式可以更輕鬆使用。

EIP20 就是一個標準的加密貨幣介面,可以允許一些智能合約透過 API 溝通。這個合約提供了基本貨幣功能,像是轉帳或是允許貨幣經過認證被使用在其他的鏈上的第三方程式。

EIP20 原始碼

變數

name

這個變數就是加密貨幣的名稱,像是 Ethereum

symbol

這個變數就是加密貨幣的簡稱,像是 ETH

decimals

這個變數是加密貨幣的精準度,到時候設定貨幣發行數量時也要考慮到精準度。

函式

Constructor

function EIP20(
        uint256 _initialAmount,
        string _tokenName,
        uint8 _decimalUnits,
        string _tokenSymbol
    ) public {
        balances[msg.sender] = _initialAmount;               // Give the creator all initial tokens
        totalSupply = _initialAmount;                        // Update total supply
        name = _tokenName;                                   // Set the name for display purposes
        decimals = _decimalUnits;                            // Amount of decimals for display purposes
        symbol = _tokenSymbol;                               // Set the symbol for display purposes
    }

看到建構子將我們所給予的名稱、代號、精準度的參數就將值設定好了。

transfer

function transfer(address _to, uint256 _value) public returns (bool success) {
        require(balances[msg.sender] >= _value);
        balances[msg.sender] -= _value;
        balances[_to] += _value;
        emit Transfer(msg.sender, _to, _value); //solhint-disable-line indent, no-unused-vars
        return true;
    }

這就是當你購買加密貨幣時,會使用這個函式將貨幣轉到你的錢包地址裡。一開始先檢查貨幣地址的剩餘數量夠不夠,再將雙方的餘額數量設定好,就可以呼叫 Transfer() 將貨幣轉給購買者。

transferFrom

function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        uint256 allowance = allowed[_from][msg.sender];
        require(balances[_from] >= _value && allowance >= _value);
        balances[_to] += _value;
        balances[_from] -= _value;
        if (allowance < MAX_UINT256) {
            allowed[_from][msg.sender] -= _value;
        }
        emit Transfer(_from, _to, _value); //solhint-disable-line indent, no-unused-vars
        return true;
    }

這個函式就是在你要跟其他人交易貨幣時所使用的,像是其他人向你購買貨幣,就可以使用這個 transferFrom 函式。可以看到這個函式比上面的 transfer 多了一個 address _from 參數,表示要從這個 _from 的位址轉移貨幣給 _to,其他運作都跟上面一樣。

balanceOf

function balanceOf(address _owner) public view returns (uint256 balance) {
        return balances[_owner];
    }

這個函式就是回傳一個位址所擁有的貨幣數量,非常直覺。

approve

function approve(address _spender, uint256 _value) public returns (bool success) {
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value); //solhint-disable-line indent, no-unused-vars
        return true;
    }

這個函式會允許某個錢包位址花費 _value 個貨幣,首先會設定好位址可以花費的數量,再呼叫 Approval()

allowance

function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
        return allowed[_owner][_spender];
    }

這個函式會回傳剛剛再 approve 所設定位址允許花費的貨幣數量。