自己動手發(fā)布 ERC20 Token

ERC20是以太坊網(wǎng)絡(luò)上發(fā)行代幣(Token)的一個標準協(xié)議接口亲茅,協(xié)議的github具體描述位于https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md锐朴。一個標準的協(xié)議促使了代幣可以在不同的應(yīng)用中得到使用晓猛,如錢包和去中心化交易所骂际。目前有很多實現(xiàn)該標準協(xié)議的Token Examples,我們將使用https://github.com/ConsenSys/Tokens提供的例子進行演示操作掂咒。我們先來看下這個實現(xiàn)庫中的主要合約文件:

ERC20 Token協(xié)議實現(xiàn)

  1. Token.sol ERC 20協(xié)議的抽象定義
//Abstract contract for the full ERC 20 Token standard
// https://github.com/ethereum/EIPs/issues/20

pragma solidity ^0.4.8;
contract Token {
    /// token總量洪鸭,默認會為public變量生成一個getter函數(shù)接口奇颠,名稱為totalSupply().
    uint256 public totalSupply;

    /// 獲取賬戶_owner擁有token的數(shù)量
    function balanceOf(address _owner) constant returns (uint256 balance);

    //從消息發(fā)送者賬戶中往_to賬戶轉(zhuǎn)數(shù)量為_value的token
    function transfer(address _to, uint256 _value) returns (bool success);

    //從賬戶_from中往賬戶_to轉(zhuǎn)數(shù)量為_value的token民珍,與approve方法配合使用
    function transferFrom(address _from, address _to, uint256 _value) returns  (bool success);

    //消息發(fā)送賬戶設(shè)置賬戶_spender能從發(fā)送賬戶中轉(zhuǎn)出數(shù)量為_value的token
    function approve(address _spender, uint256 _value) returns (bool success);

    //獲取賬戶_spender可以從賬戶_owner中轉(zhuǎn)出token的數(shù)量
    function allowance(address _owner, address _spender) constant returns  (uint256 remaining);

    //發(fā)生轉(zhuǎn)賬時必須要觸發(fā)的事件 
    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    //當函數(shù)approve(address _spender, uint256 _value)成功執(zhí)行時必須觸發(fā)的事件
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

  1. StandardToken.sol ERC20協(xié)議的標準實現(xiàn)
/*You should inherit from StandardToken or, for a token like you would want to
deploy in something like Mist, see DAToken.sol.
(This implements ONLY the standard functions and NOTHING else.
If you deploy this, you won't have anything useful.)
Implements ERC 20 Token standard: https://github.com/ethereum/EIPs/issues/20.*/

pragma solidity ^0.4.8;
import "./Token.sol";
contract StandardToken is Token {
    function transfer(address _to, uint256 _value) returns (bool success) {
        //默認totalSupply 不會超過最大值 (2^256 - 1).
        //如果隨著時間的推移將會有新的token生成零蓉,則可以用下面這句避免溢出的異常
        //require(balances[msg.sender] >= _value && balances[_to] + _value >balances[_to]);
        require(balances[msg.sender] >= _value);
        balances[msg.sender] -= _value;//從消息發(fā)送者賬戶中減去token數(shù)量_value
        balances[_to] += _value;//往接收賬戶增加token數(shù)量_value
        Transfer(msg.sender, _to, _value);//觸發(fā)轉(zhuǎn)幣交易事件
        return true;
    }
    function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
        //require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value > balances[_to]);
        require(balances[_from] >= _value && allowed[_from][msg.sender] >=  _value);
        balances[_to] += _value;//接收賬戶增加token數(shù)量_value
        balances[_from] -= _value; ;//支出賬戶_from減去token數(shù)量_value
        allowed[_from][msg.sender] -= _value;//消息發(fā)送者可以從賬戶_from中轉(zhuǎn)出的數(shù)量減少_value
        Transfer(_from, _to, _value);//觸發(fā)轉(zhuǎn)幣交易事件
        return true;
    }
    //查詢余額
    function balanceOf(address _owner) constant returns (uint256 balance) {
        return balances[_owner];
    }
    //授權(quán)賬戶_spender可以從消息發(fā)送者賬戶轉(zhuǎn)出數(shù)量為_value的token
    function approve(address _spender, uint256 _value) returns (bool success)   
    {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
    }
    function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
      return allowed[_owner][_spender];//允許_spender從_owner中轉(zhuǎn)出的token數(shù)
    }

    mapping (address => uint256) balances;
    mapping (address => mapping (address => uint256)) allowed;
}

  1. DAToken.sol 具體的token實現(xiàn)
import "./StandardToken.sol";
pragma solidity ^0.4.8;
contract DAToken is StandardToken {
    /* Public variables of the token */
    string public name;                   //名稱: eg Davie
    uint8 public decimals;                //最多的小數(shù)位數(shù)How many decimals to show. ie. There could 1000 base units with 3 decimals. Meaning 0.980 SBX = 980 base units. It's like comparing 1 wei to 1 ether.
    string public symbol;                 //token簡稱: eg DAC
    string public version = 'H0.1';       //版本

    function DAToken(uint256 _initialAmount, string _tokenName, uint8 _decimalUnits, string _tokenSymbol) {
        balances[msg.sender] = _initialAmount; // 初始token數(shù)量給予消息發(fā)送者
        totalSupply = _initialAmount;         // 設(shè)置初始總量
        name = _tokenName;                   // token名稱
        decimals = _decimalUnits;           // 小數(shù)位數(shù)
        symbol = _tokenSymbol;             // token簡稱
    }
    /* 同意轉(zhuǎn)出并調(diào)用接收合約(根據(jù)自己需求實現(xiàn)) */
    function approveAndCall(address _spender, uint256 _value, bytes _extraData) returns (bool success) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        //call the receiveApproval function on the contract you want to be notified. This crafts the function signature manually so one doesn't have to include a contract in here just for this.
        //receiveApproval(address _from, uint256 _value, address _tokenContract, bytes _extraData)
        //it is assumed that when does this that the call *should* succeed, otherwise one would use vanilla approve instead.

        require(_spender.call(bytes4(bytes32(sha3("receiveApproval(address,uint256,address,bytes)"))), msg.sender, _value, this, _extraData));
        return true;
    }
}

Token合約發(fā)布

我們將使用MetaMask和Remix(https://ethereum.github.io/browser-solidity)并選擇在Ropsten測試網(wǎng)絡(luò)進行Token合約發(fā)布。

  1. 切換MetaMask至Ropsten網(wǎng)絡(luò)
image.png

2.將所有相關(guān)代碼copy至Remix
或者從這里拷貝https://ropsten.etherscan.io/address/0xaa86b7bc852907e5649c958411465e878c954b67#code

image.png

在右側(cè)上方紅框標記處Environment選擇Injected Web3, 下方的Account列表將會列出MetaMask中的賬戶信息穷缤。然后在右側(cè)下方紅框中依次填入初始化DAToken需要的參數(shù),初始token數(shù)量(100000000)箩兽、token的名稱描述(My Test Token)津肛、decimal數(shù)(8)、token簡稱(MTT)汗贫。

  1. Token合約發(fā)布
    “Create”中填入創(chuàng)建的Token參數(shù)身坐,

第一個參數(shù)是Token的數(shù)量;

第二個參數(shù)是Token的全稱落包;

第三個參數(shù)是Token的精度部蛇,即Token最小為小數(shù)點后幾位;

第四個參數(shù)是Token的符號咐蝇;

例如:100000000,"zhongxh's test token",8,"ZTT"

上述例子代表創(chuàng)建的Token的全稱是"zhongxh's test token"涯鲁,符號是“ZTT”, ZTT的最大精度為小數(shù)點后8位有序,即最小是0.000000001ZTT抹腿,總共有1億份,那么總共有100000000 * 10^(-8)ZTT旭寿,即1ZTT

點擊合約DAToken處的create按鈕警绩,將彈出如下畫面:

image.png

點擊SUBMIT將該交易請求發(fā)布至Rosten網(wǎng)絡(luò)中,交易變成功打包后盅称〖缦椋可以查詢到本次操作的交易id為0x1aabf45bed257dd7521215f21744d0ad64b4275436bc2c8148fb44c2489efb84后室, 合約地址為0xaa86b7bc852907e5649c958411465e878c954b67,交易截圖如下:


image.png

4.合約源代碼上傳

接下來我們看下如何在https://ropsten.etherscan.io上傳合約的源代碼混狠,首先打開合約0xaa86b7bc852907e5649c958411465e878c954b67的詳情頁岸霹,并切換至Contrant Code標簽中,如下圖檀蹋。

image.png

在Contract code 標簽頁中點擊“Verify And Publish”鏈接松申,然后填入下圖紅框各項內(nèi)容。

image.png
  • Contract address為上面創(chuàng)建的合約地址俯逾;
  • Contract name為在Remix中選擇創(chuàng)建的合約名稱DAToken贸桶;
  • Compiler版本需選擇在Remix進行合約創(chuàng)建時選擇的編譯器版本一致;
  • 是否優(yōu)化Optimization也需要與Remix發(fā)布合約時保持一致桌肴;
  • 在“Enter the Solidity Contract Code below”中填入之前在Remix中的solidity合約代碼皇筛;
  • 在“Constructor Arguments ABI-encoded”中填入構(gòu)造函數(shù)參數(shù)(100000000,“My Test Token”,8,“MTT”)的ABI編碼,這個會自動填好坠七。

填好上述數(shù)據(jù)后水醋,點擊Verify and Publish,如果驗證通過了就會出現(xiàn)如下頁面:

image.png

最后我們切換到合約的詳情頁彪置,點擊Contract Source標簽拄踪,就能看到上傳的合約源代碼了,如下圖:

image.png

如果遇到錯誤"Unable to Verify Contract at this point time"拳魁,請確認在提交合約源代碼時惶桐,選擇的編譯器版本與是否優(yōu)化選項,與你在Remix中的選擇是否一致潘懊。

  1. 添加發(fā)布的Token到錢包

我們可以在MetaMask中添加上面生成的Token至MetaMask錢包中姚糊,如下圖。


image.png

填入Token地址


image.png

點擊Add后可以在Tokens標簽頁中看到上面發(fā)布的Token MTT. (因為我們在創(chuàng)建DAToken時授舟,輸入的初始量為1000000救恨,而decimal值為8,這個初始量值的單位是token的最低單位释树,故總量為0.01MTT肠槽,大家可以根據(jù)自己的情況作出相應(yīng)調(diào)整。)


image.png

接下來就可以在Ropsten測試網(wǎng)絡(luò)上進行Token的轉(zhuǎn)賬以及相關(guān)的測試操作了奢啥,如果測試沒問題就按照同樣的流程把合約部署至以太坊主網(wǎng)絡(luò)中發(fā)行真實的token了署浩。

因為Metamask不支持toekn的發(fā)送,我們切換到MyEtherWallet錢包扫尺。

需要注意的是筋栋,MyEtherWallet也需要切換到Rostpen網(wǎng)絡(luò)

image.png

接下來切換到“發(fā)送以太幣/發(fā)送代幣”

image.png

在這里我選擇用私鑰的方式解鎖錢包,私鑰可以從Metamask獲得

點擊Metamask右上角的“...”正驻,然后點擊"Export Private Key "弊攘,輸入密碼抢腐,即可獲得私鑰

image.png

將私鑰拷到MyEtherWallet,就可以解鎖你的錢包了襟交。

點擊右下角的“Load Token Balance”

image.png

右下角顯示的正是剛剛創(chuàng)建的Token迈倍,也就是ZTT,余額為1捣域,這表明我的ERC20 Token發(fā)布成功了啼染!

image.png

給另一個賬戶轉(zhuǎn)token

獲取第二個賬戶地址
切換到account2


image.png

復(fù)制賬戶地址


image.png

填入轉(zhuǎn)賬地址和金額,token


image.png

注意這里選擇我們剛才發(fā)布的LOVE token


image.png

點擊生成交易焕梅,然后發(fā)送交易迹鹅。

稍后回到Metamask查看


image.png

可以看到賬戶 account2收到了 100個LOVE

如果你覺得對你有幫助的話,請點擊下方的“贊賞支持”贞言,幫我買個煎餅吃吧斜棚,??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市该窗,隨后出現(xiàn)的幾起案子弟蚀,更是在濱河造成了極大的恐慌,老刑警劉巖酗失,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件义钉,死亡現(xiàn)場離奇詭異,居然都是意外死亡规肴,警方通過查閱死者的電腦和手機捶闸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奏纪,“玉大人,你說我怎么就攤上這事斩启⌒虻鳎” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵兔簇,是天一觀的道長发绢。 經(jīng)常有香客問我,道長垄琐,這世上最難降的妖魔是什么边酒? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮狸窘,結(jié)果婚禮上墩朦,老公的妹妹穿的比我還像新娘。我一直安慰自己翻擒,他們只是感情好氓涣,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布牛哺。 她就那樣靜靜地躺著,像睡著了一般劳吠。 火紅的嫁衣襯著肌膚如雪引润。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天痒玩,我揣著相機與錄音淳附,去河邊找鬼。 笑死蠢古,一個胖子當著我的面吹牛奴曙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播便瑟,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼缆毁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了到涂?” 一聲冷哼從身側(cè)響起脊框,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎践啄,沒想到半個月后浇雹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡屿讽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年昭灵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伐谈。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡烂完,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诵棵,到底是詐尸還是另有隱情抠蚣,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布履澳,位于F島的核電站嘶窄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏距贷。R本人自食惡果不足惜柄冲,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忠蝗。 院中可真熱鬧现横,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至得哆,卻和暖如春脯颜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贩据。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工栋操, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饱亮。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓矾芙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親近上。 傳聞我的和親對象是個殘疾皇子剔宪,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容