ERC-20的目標(biāo)是為以太坊上的代幣合約(token contract)提供一組特征與接口的通用標(biāo)準(zhǔn)。通用的標(biāo)準(zhǔn)有很多好處,比如允許錢(qián)包顯示數(shù)以百計(jì)的不同代幣的賬戶(hù)余額額;代幣交易所,只需要知道代幣合約的地址就可以將其列入交易列表中。事實(shí)上,ERC-20已經(jīng)成為目前創(chuàng)建代幣合約的標(biāo)準(zhǔn)。
代幣合約(token contract)是什么?
代幣合約就是一個(gè)包含了賬戶(hù)地址(address)到余額(balance)映射(mapping)的智能合約(smart contract).賬戶(hù)余額表示合約創(chuàng)建者定義的某種權(quán)益,可以是物理實(shí)體,也可以是另一種貨幣,甚至可以是持有人的信用。
變更代幣的總供給(totalSupply)有兩種方式:
- 鑄造新的代幣來(lái)增加
- 銷(xiāo)毀現(xiàn)有代幣來(lái)減少,銷(xiāo)毀代幣可以將代幣發(fā)送到一個(gè)未創(chuàng)建私鑰的地址(一般使用0地址)
定義一個(gè)ERC-20代幣合約
一個(gè)ERC-20合約通過(guò)地址和總供給(totalSupply)來(lái)定義,通常還提供一些非必須(optional)的東西,為用戶(hù)提供更多細(xì)節(jié)。包括名字(name),標(biāo)識(shí)(symbol),小數(shù)位(decimals)
- 名字(name) 是代幣合約的完整名稱(chēng),例如"My Token"。但是為了在一些錢(qián)包應(yīng)用中能顯示完全(可能會(huì)被截?cái)囡@示),這個(gè)名字最好短一點(diǎn)。
- 標(biāo)識(shí)符(symbol) 是代幣合約的標(biāo)識(shí)符號(hào),比如"MYT"。通常3到4個(gè)字母。
- 小數(shù)位(decimals) 的存在是因?yàn)橐蕴徊惶幚硇?shù),為了在合約處理的最小單位和用戶(hù)顯示單位之間進(jìn)行轉(zhuǎn)化。例如一個(gè)物理黃金所有權(quán)的代幣合約,合約需要處理的最小單位為克,而用戶(hù)表示的單位是千克,那么小數(shù)位(decimals)設(shè)置為3,即10^3克等于1千克。小數(shù)位的取值規(guī)則為:
- 如果代幣合約表示的是不可切分的物體,則取值為0
- 如果表示的是一個(gè)有特定小數(shù)位的物體,那么取值就是那個(gè)小數(shù)位
- 如果上述兩者都不是,設(shè)置為18
- 總供給(totalSupply)是定義一個(gè)ERC-20合約需要的最后一個(gè)參數(shù),也是唯一的強(qiáng)制參數(shù)??偣┙o等于所有余額之和。
一個(gè)ERC-20代幣合約的功能
- balance() 函數(shù)提供查詢(xún)給定地址持有代幣的數(shù)量。任何人都可以查詢(xún),正如所有數(shù)據(jù)在區(qū)塊鏈上都是公開(kāi)的。
- transfer() 函數(shù)將調(diào)用者地址的代幣轉(zhuǎn)移指定數(shù)量到指定地址。系統(tǒng)不會(huì)對(duì)目的地址做驗(yàn)證(也無(wú)法驗(yàn)證),所以如果將代幣發(fā)送到一個(gè)沒(méi)有擁有者的地址上,那代幣就遺失了。
transfer() 的使用有局限性,它只能由函數(shù)調(diào)用者來(lái)指定代幣的轉(zhuǎn)移,不能由合約按預(yù)定算法進(jìn)行代幣轉(zhuǎn)移。而approve()和transforFrom()配合使用則可以完成這個(gè)目標(biāo)。 - approve() 函數(shù)允許調(diào)用者給另一個(gè)地址(通常是一個(gè)智能合約)授信一定額度代幣,稱(chēng)之為配額(allowence),在這個(gè)額度內(nèi),指定地址(智能合約)可以支出調(diào)用者的賬戶(hù)代幣。
- transferFrom() 調(diào)用者在配額(allowence)范圍內(nèi),從一個(gè)地址(_from)將代幣轉(zhuǎn)移到另外一個(gè)地址(_to)。
- allowance() 函數(shù)提供查詢(xún)擁有者地址(_owner)配額給消費(fèi)者地址(_spender)的金額。
- 注意:任何人都可以查詢(xún)到所有的配額情況,正如所有信息在區(qū)塊鏈上都是公開(kāi)的。
- 另外,配額(allowance)是軟性的,即單獨(dú)或者累積的配額可以超過(guò)這個(gè)地址上的余額。余額的驗(yàn)證需要在transferFrom函數(shù)或者其它根據(jù)配額進(jìn)行支付的函數(shù)中進(jìn)行。
ERC-20代幣合約中的事件
ERC-20定義了在合約中的操作,兩類(lèi)事件是必須要被觸發(fā)的。
- 第一類(lèi)事件是Transfer(),這個(gè)事件將放出從一個(gè)地址轉(zhuǎn)移到另一個(gè)地址的代幣轉(zhuǎn)移細(xì)節(jié)。
- 第二類(lèi)事件是Approval(),這個(gè)事件將放出一個(gè)地址許可另外一個(gè)地址轉(zhuǎn)移代幣配額的細(xì)節(jié)。
- 這些細(xì)節(jié)可以讓外部應(yīng)用(Dapp)跟蹤地址余額和配額的變更,而無(wú)需查詢(xún)區(qū)塊鏈。
- 鑄造代幣會(huì)發(fā)出一個(gè)源地址(_from)為0的Transfer()事件。
- 銷(xiāo)毀代幣時(shí),沒(méi)有事件發(fā)出。因此,ERC-20代幣合約通常使用transfer()函數(shù)發(fā)出代幣到0地址來(lái)銷(xiāo)毀代幣,
參考文檔 https://medium.com/@jgm.orinoco/understanding-erc-20-token-contracts-a809a7310aa5