以太坊智能合約開發(fā)指南3(ERC-20代碼實現(xiàn))

根據(jù)ERC-20標(biāo)準(zhǔn)定義接口

pragma solidity ^0.4.0;

contract ERC20Interface {
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    function name() public view returns (string name);
    function symbol() public view returns (string symbol);
    function decimals() public view returns (uint8 decimals);
    function totalSupply() public view returns (uint256 totalSupply);
    function balanceOf(address _owner) public view returns (uint256 balance);
    function transfer(address _to, uint256 _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
    function approve(address _spender, uint256 _value) public returns (bool success);
    function allowance(address _owner, address _spender) public view returns (uint256 remaining);
}

代碼實現(xiàn)一個ERC-20代幣合約

pragma solidity ^0.4.0;

import "./ERC20Interface.sol";

contract ERC20 is ERC20Interface{
    string private _name = "MyToken";
    string private _symbol = "MYT";
    uint8 private _decimals = 3;
    uint256 private _totalSupply = 10 * (10 ** uint256(_decimals));
    mapping(address=>uint256) private _balances;
    mapping(address=>mapping(address=>uint256)) private _allowances;

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
    function ERC20(){
        _balances[msg.sender] = _totalSupply;
    }

    function name() public view returns (string name){
        name = _name;
    }

    function symbol() public view returns (string symbol){
        symbol = _symbol;
    }

    function decimals() public view returns (uint8 decimals){
        decimals = _decimals;
    }

    function totalSupply() public view returns (uint256 totalSupply){
        totalSupply = _totalSupply;
    }

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

    function transfer(address _to, uint256 _value) public returns (bool success){
        require(_balances[msg.sender] >= _value);
        _balances[msg.sender] -= _value;
        _balances[_to] += _value;
        Transfer(msg.sender, _to, _value);
        success = true;
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success){
        require(_balances[_from] >= _value);
        require(_allowances[_from][msg.sender] >= _value);
        _balances[_from] -= _value;
        _allowances[_from][msg.sender] -= _value;
        _balances[_to] += _value;
        Transfer(_from, _to, _value);
        success = true;
    }

    function approve(address _spender, uint256 _value) public returns (bool success){
        _allowances[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        success = true;
    }

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

代碼說明

  • 代幣名稱為 “MyToken”
  • 代幣標(biāo)識符為 “MYT”
  • 小數(shù)位數(shù)為3
  • 代幣初始總供給為 10 * 1000 = 10000
  • 賬戶余額映射
  • 賬戶配額映射榴啸,這里是兩層映射,例如賬戶A授信給賬戶B額度為value的配額
  • 代幣轉(zhuǎn)移事件倦蚪,事件內(nèi)容為:將賬戶_from的代幣轉(zhuǎn)移到賬戶_to中弟头,金額為_value彻坛。indexed關(guān)鍵字是對事件的字段做索引珍逸,具體用途后面會說僧免。
  • 配額許可事件俭缓,事件內(nèi)容為:擁有者_owner許可給_spender配額克伊,額度為_value
  • 構(gòu)造方法,將代幣的初始總供給都分配給合約的部署賬戶华坦。合約的構(gòu)造方法只在合約部署時執(zhí)行一次愿吹。
  • 公共方法(合約外部可訪問),返回合約名稱惜姐。view關(guān)鍵子表示函數(shù)只查詢狀態(tài)變量犁跪,而不寫入。函數(shù)的view關(guān)鍵字與constant等價歹袁。
  • 公共方法坷衍,返回合約標(biāo)識符。
  • 公共方法条舔,返回合約小數(shù)位枫耳。
  • 公共方法,返回合約總供給額孟抗。
  • 公共方法迁杨,查詢賬戶_owner的賬戶余額钻心。
  • 公共方法,將合約調(diào)用者的代幣轉(zhuǎn)移到賬戶_to中铅协,金額為_value捷沸,轉(zhuǎn)移成功返回true。
  • 驗證合約調(diào)用者(msg.sender)賬戶余額是否大于等于_value
  • 合約調(diào)用者賬戶余額減去_value
  • 接收賬戶_to賬戶余額額加上_value
  • 發(fā)送Transfer()事件
  • 返回轉(zhuǎn)移成功(true)
  • 公共方法狐史,將賬戶_from的代幣轉(zhuǎn)移到賬戶_to中痒给,金額為_value,轉(zhuǎn)移成功返回true
  • 驗證賬戶_from的代幣余額是否大于等于_value
  • 驗證賬戶_from給合約調(diào)用者msg.sender的配額是否大于等于_value
  • 賬戶_from的賬戶余額減去_value
  • 賬戶_from給合約調(diào)用者(msg.sender)的配額減去_value
  • 接收賬戶_to賬戶余額額加上_value
  • 發(fā)送Transfer()事件
  • 返回轉(zhuǎn)移成功true
  • 公共方法预皇,合約調(diào)用者批準(zhǔn)給賬戶_spender配額侈玄,額度為_value,批準(zhǔn)成功返回true
  • 合約調(diào)用者msg.sender對賬戶_spender的配額等于_value
  • 發(fā)送Approval()事件
  • 返回批準(zhǔn)成功true
  • 公共方法吟温,查詢賬戶_owner批準(zhǔn)給賬戶_spender的配額
  • 返回賬戶_owner批準(zhǔn)給賬戶_spender的配額

參考文檔
https://github.com/ConsenSys/Tokens/blob/master/contracts/eip20/EIP20Interface.sol
https://github.com/ConsenSys/Tokens/blob/master/contracts/eip20/EIP20.sol

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末序仙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鲁豪,更是在濱河造成了極大的恐慌潘悼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爬橡,死亡現(xiàn)場離奇詭異治唤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)糙申,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門宾添,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柜裸,你說我怎么就攤上這事缕陕。” “怎么了疙挺?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵扛邑,是天一觀的道長。 經(jīng)常有香客問我铐然,道長蔬崩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任搀暑,我火速辦了婚禮沥阳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘自点。我一直安慰自己沪袭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冈绊,像睡著了一般侠鳄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上死宣,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天伟恶,我揣著相機(jī)與錄音,去河邊找鬼毅该。 笑死博秫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的眶掌。 我是一名探鬼主播挡育,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼朴爬!你這毒婦竟也來了即寒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤召噩,失蹤者是張志新(化名)和其女友劉穎母赵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體具滴,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡凹嘲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了构韵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片周蹭。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疲恢,靈堂內(nèi)的尸體忽然破棺而出凶朗,到底是詐尸還是另有隱情,我是刑警寧澤冈闭,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站抖单,受9級特大地震影響萎攒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矛绘,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一耍休、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧货矮,春花似錦羊精、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽读规。三九已至,卻和暖如春燃少,著一層夾襖步出監(jiān)牢的瞬間束亏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工阵具, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留碍遍,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓阳液,卻偏偏與公主長得像怕敬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子帘皿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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