ERC20标准
? 今天我來認識ERC20標準。
?
? 以太坊是一個分布式的智能合約平臺,可以分發代幣(Token)。目前以太坊上有超過2萬個代幣的智能合約,我們可以在以太坊區塊鏈瀏覽器中查看:https://www.etherscan.io ???
?
? 如果這么多代幣的標準不統一,對于其他人來查看代碼是相當痛苦的,眾籌的人也就沒有辦法來檢查代幣分發的是否合理,也沒有辦法做到多種錢包的兼容。
?
? 所以才推出了一種以太坊代幣的標準:ERC20標準。
?
ERC20標準涵蓋了哪些內容?
?
? 我們可以在https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md查看ERC20代幣的標準API。
?
? ERC實際上就是 以太坊請求協議。后面的20相當于是個編號,類似的還有ERC721、ERC827等等協議。
?
Method
在Method目錄下面我們可以看到一些方法,所有的ERC20代幣都是按照下面這些方法來定義的。下面我們講解一下每個方法的作用。
?
1.name
function name() constant returns (string name)返回string類型的ERC20代幣的名字,例如:StatusNetwork
?
2.symbol(符號)
function symbol() constant returns (string symbol)返回string類型的ERC20代幣的符號,也就是代幣的簡稱,例如:SNT。
?
3.decimals(小數)
function decimals() constant returns (uint8 decimals)支持幾位小數點后幾位。如果設置為3。也就是支持0.001表示。
?
4.totalSupply
function totalSupply() constant returns (uint256 totalSupply)發行代幣的總量,可以通過這個函數來獲取。所有智能合約發行的代幣總量是一定的,totalSupply必須設置初始值。如果不設置初始值,這個代幣發行就說明有問題。
?
5.balanceOf
function balanceOf(address _owner) constant returns (uint256 balance)輸入地址,可以獲取該地址代幣的余額,注意不是以太幣的余額。
?
6.transfer
function transfer(address _to, uint256 _value) returns (bool success)轉賬功能,調用者調用transfer函數將自己_value數量的token轉賬給 _to
?
7.approve(批準)
function approve(address _spender, uint256 _value) returns (bool success)批準_spender賬戶從自己的賬戶轉移_value個token。可以分多次轉移。
?
8.transferFrom
function transferFrom(address _from, address _to, uint256 _value) returns (bool success)與approve搭配使用,approve批準之后,_spender調用transferFrom函數來轉移_value個token到 _to的賬戶中。
?
9.allowance(限額)
function allowance(address _owner, address _spender) constant returns (uint256 remaining)查看_owner授權給_spender的剩余token數量。
(owner:主人;所有者? ? ? ? spender:花錢者)
?
approve、transferFrom及allowance解釋:
賬戶A有1000個ETH,想允許B賬戶隨意調用100個ETH。
A賬戶按照以下形式調用approve函數approve(B,100)。
當B賬戶想用這100個ETH中的10個ETH給C賬戶時,則調用transferFrom(A, C, 10)。
這時調用allowance(A, B)可以查看B賬戶還能夠調用A賬戶多少個token。
?
Events
1.Transfer
event Transfer(address indexed _from, address indexed _to, uint256 _value)當成功轉移token時,一定要觸發Transfer事件
?
2.Approval
event Approval(address indexed _owner, address indexed _spender, uint256 _value)當調用approval函數成功時,一定要觸發Approval事件
?
簡易ERC20代碼示例:
pragma solidity ^0.4.17;?contract simpletokenstruct{ string public name; //定義公開 字符串類型 name string public simple; //定義公開 字符串類型 simple uint8 public decimals; //定義公開 8字節無符號整型 simple uint256 public totalSupply; //定義公開 256字節無符號整型 totalSupply //function balanceOf(address _owner) public view returns (uint256 balance){ // //} function transfer(address _to, uint256 _value) public returns (bool success){ } //定義函數transfer 接受地址_to和 256字節無符號整型_value傳參 并返回成功 function transferFrom(address _from, address _to, uint256 _value) public returns (bool success){ } //定義函數transferFrom 接受地址_from,地址_to和256字節無符號整型_value傳參 并返回成功 function approve(address _spender, uint256 _value) public returns (bool success){ } //定義函數approve 接受地址_spender,和256字節無符號整型_value傳參 并返回成功 function allowance(address _owner, address _spender) public view returns (uint256 remaining){ } //定義函數allowance 接受地址_owner,和地址_spender傳參 并返回256字節無符號整型 remaining event Transfer(address indexed _from, address indexed _to, uint256 _value); //定義時間Transfer 當出現地地址_from,_to和256字節無符號整型 _value觸發 event Approval(address indexed _owner, address indexed _spender, uint256 _value); //定義時間Transfer 當出現地地址_owner,_spender和256字節無符號整型 _value觸發}?contract simpletoken is simpletokenstruct{//合約 simpletoken繼承合約simpletokenstruct內容 constructor() public{ name='xiong'; //將'xiong'賦值給name simple='XIO'; //將'XIO'賦值給simple decimals=1; //將1賦值給decimals totalSupply=1000; //將1000賦值給totalSupply balanceOf[msg.sender]=totalSupply; //將totalSupply的值賦值給上個發送方 } mapping(address=>uint256) public balanceOf; //定義一個映射balanceOf 地址=>無符號整型 mapping(address=>mapping(address=>uint256)) internal approvemapping; //定義一個映射approvemapping 地址=>映射(地址=>無符號整型) function transfer(address _to, uint256 _value) public returns (bool success){ //定義函數transfer 接受地址_to和 256字節無符號整型_value傳參 并返回成功 require(_to != address(0)); //判斷_to是否為空地址 是結束執行 否繼續執行 require(balanceOf[msg.sender]>=_value);//判斷_value值是否小于等于1000 require(balanceOf[_to]+_value>=balanceOf[_to]);//判斷傳參地址余額+傳參值是否大于等于參地址余額 //判斷完成 balanceOf[msg.sender]-=_value; //將balanceOf[msg.sender]減去傳參值_value balanceOf[_to]+=_value; //將傳參_to地址余額加上傳參值_value emit Transfer(msg.sender,_to,_value);//觸發事件 success = true; } function transferFrom(address _from, address _to, uint256 _value) public returns (bool success){ //定義函數transferFrom 接受地址_from,地址_to和256字節無符號整型_value傳參 并返回成功 require(_to != address(0));//判斷_to是否為空地址 是結束執行 否繼續執行 require(balanceOf[_from]>=_value);//判斷_value值是否小于等于地址_from余額 require(approvemapping[_from][msg.sender]>=_value);//判斷_value值是否小于等于地址_from對應的地址msg.sender對應的值 require(balanceOf[_to]+_value>=balanceOf[_to]);//判斷傳參地址_to對應的余額是否小等于_value傳參的值+傳參地址_to對應的余額 balanceOf[_from]-=_value;//傳參地址_from的余額-傳參_value的值 balanceOf[_to]+=_value;//傳參地址_to的余額+傳參_value的值 success = true; } function approve(address _spender, uint256 _value) public returns (bool success){ //定義函數approve接受地址_spender和256字節無符號整型_value傳參 返回success approvemapping[msg.sender][_spender]=_value;//將傳參的_value值賦值給msg.sender對應的_spender對應的地址 emit Approval(msg.sender,_spender,_value);//觸發事件 success = true; } function allowance(address _owner, address _spender) public view returns (uint256 remaining){ //定義函數allowance接受地址 _owner和地址 _spender傳參 返回256字節無符號整型remaining return approvemapping[_owner][_spender];//返回owner對應的_spender對應的值 } event Transfer(address indexed _from, address indexed _to, uint256 _value);//觸發事件 event Approval(address indexed _owner, address indexed _spender, uint256 _value);//觸發事件 }擁有erc20代幣——在測試網絡上發布
?
使用metamask發布自己的代幣
1.在Chrome中安裝metamask插件
2.注冊之后可以看到自己的以太坊主網賬號了,但是我們不用這個
3.切換到Kovan測試網絡
3.沒錢時,點
存入->
測試水管獲取ether->
?
4.在remix里選擇injected web3,會自動關聯metamask
可以看到賬戶變成了我們自己的賬戶
5.再部署時就會彈出metamask對話框,選擇一下gas fee然后確認即可
gas fee 就是付給礦工的錢讓他記錄數據,太低了沒人干活。但是這里是測試網絡錢不是錢,所以低一點也無所謂
6.等待發布
7.之后,便可以看到我們的交易哈希等等了。
?
總結
- 上一篇: 开发人员常用的ID网站整理!
- 下一篇: ORACLE安装入门篇OEL5.4安装O