以太坊科普:理解ERC-20 token合約
ETH(Ethereum)以太坊錢包基本概念介紹:http://chabaoo.cn/blockchain/801260.html
這篇文章會(huì)簡單介紹各種符合ERC-20標(biāo)準(zhǔn)的token,解釋ERC-20的特征和功能,以供讀者了解什么是token合約,以及開發(fā)者應(yīng)該如何使用該標(biāo)準(zhǔn)。
ERC-20最初作為一種嘗試,旨在為以太坊(Ethereum)上的token合約提供一個(gè)特征與接口的共同標(biāo)準(zhǔn),并且,它現(xiàn)在已經(jīng)被證明是非常成功的了。ERC-20有很多好處,包括允許錢包顯示數(shù)以百計(jì)不同token的賬戶余額;創(chuàng)建一個(gè)交易工具,只需提供token合約的地址就可以將更多token列入表中。創(chuàng)建ERC-20兼容token的好處很多,以至于在今天,很少有其他token合約用其他方式創(chuàng)建。
Token合約是什么?
現(xiàn)在仍存在著大量關(guān)于“token合約到底是什么”的爭論。本質(zhì)上來說,一個(gè)token合約就是一個(gè)包含了一個(gè)對賬戶地址及其余額的映射的智能合約(Smart Contract)。賬戶余額表示一種由合約創(chuàng)建者定義的值:一個(gè)token合約也許使用余額來表示物理對象,或是表示另一種貨幣價(jià)值,還可以表示持有人的名譽(yù)。余額的單位通常被稱為token。
當(dāng)token從一個(gè)賬戶被轉(zhuǎn)移到另一個(gè)賬戶的時(shí)候,token合約更新兩個(gè)賬戶的余額。比如,一筆從 0x2299…3ab7 到 0x1f59…3492 的10個(gè)token的轉(zhuǎn)賬將導(dǎo)致余額列表如下圖所示進(jìn)行更新:
如果該token合約允許的話,變更一種token的總供給可能有兩種辦法。token的總供給可以通過鑄造新token來增加。舉個(gè)例子,鑄造出100個(gè)token到地址 0x4ba5…ae22 將導(dǎo)致余額如下圖所示進(jìn)行更新:
token的總供給也可以通過“銷毀”現(xiàn)有的token來減少。比如, 0x4919…413d 銷毀了50個(gè)token,這將導(dǎo)致余額如下圖所示更新:
銷毀token的另一種方式是將token發(fā)送到一個(gè)未創(chuàng)建私鑰的地址,通常來說就是0地址。這會(huì)使得這些token不可用,在這方面,它與銷毀token有同樣的效果,但并沒有減少token的總數(shù)。比如, 0x93f1…1b09 用此種方式銷毀了50個(gè)token將導(dǎo)致如下圖所示的余額:
簡單的token合約在一個(gè)從地址到余額的映射中保存上述信息。當(dāng)更多復(fù)雜的情景出現(xiàn)時(shí),比如發(fā)放股息,替代性結(jié)構(gòu)或者增補(bǔ)性結(jié)構(gòu)常常要變得更強(qiáng)悍。但是,不管那些操作上的細(xì)節(jié)的話,對外部可見的token余額總是像上面的圖示那樣的。
一個(gè)ERC-20 token合約的定義
一個(gè)ERC-20 合約是通過合約的地址以及它可用的token總供給來定義的,但它通常還提供一些非必須的東西,也是為用戶提供更多細(xì)節(jié)。它們包括該token的名字、標(biāo)志、小數(shù)位。這些中的每一個(gè)都會(huì)包括在下面的細(xì)節(jié)中。
在深入到細(xì)節(jié)之前,理解這件事情是重要的:token合約沒有一個(gè)中心化的登記處,因此無法保證特定名字和符號(hào)的唯一性。一旦你已經(jīng)創(chuàng)建了一個(gè)token合約,你應(yīng)該請求將它加入公共站點(diǎn),比如:Etherscan,MyEtherWallet 以及 CoinMarketCap。當(dāng)然,確保符合網(wǎng)站上的說明可以最大化你的申請被接受的機(jī)會(huì)。
Token合約的名字乃是該token合約應(yīng)該被知道的完整名稱,比如“My Token”。名字的長度沒有限制,但完整名稱在一些錢包應(yīng)用中更容易顯示不完全,所以,最好讓名字短一點(diǎn)。
Token合約的標(biāo)志乃是該token合約應(yīng)該被知道的符號(hào),比如“MYT”。廣義上,它是股票代碼的對應(yīng)物,而且,雖然沒有嚴(yán)格的長度限制,但它在長度上常常是3或4個(gè)字母。
小數(shù)位常常是混淆的來源,但經(jīng)過合理的解釋這是非常容易理解的。小數(shù)位意味著一個(gè)token的可切分性,從0個(gè)小數(shù)位(即完全不可切分)到18位小數(shù)(幾乎是連續(xù)的),如果需要,可以有更多的小數(shù)位。從技術(shù)上來說,小數(shù)位的意義在于顯示token價(jià)值在屏幕上的時(shí)候小數(shù)點(diǎn)后面跟著的位數(shù)。小數(shù)位存在的理由是以太坊并不處理有小數(shù)的數(shù)字,只顯示整數(shù)的數(shù)字價(jià)值??紤]下面兩個(gè)例子:
第一個(gè)例子是LicenseToken,一個(gè)為給定軟件產(chǎn)品顯示軟件許可分配的token合約;持有一個(gè)LicenseToken,使用者就可以使用該軟件。而持有小于1個(gè)的LicenseToken則沒有任何意義,所以token創(chuàng)建者將小數(shù)位設(shè)為0。一些LicenseToken的持有人賬戶余額如下。
可以看到,在這里有100份許可,主要被一個(gè)賬戶所持有。當(dāng)用戶購買一份許可的時(shí)候,一個(gè)token將從持有賬戶轉(zhuǎn)賬到購買者賬戶。而許可驗(yàn)證者可以查看一個(gè)特定的賬戶是否真的持有一個(gè)LicenseToken,然后做出相應(yīng)的行動(dòng)。
第二個(gè)例子是GoldToken,一個(gè)表示物理黃金所有權(quán)的token合約。合約創(chuàng)建者希望每單位表示1千克黃金的單位,但同樣希望允許用戶以克的級(jí)別(但不能更低)持有和交易黃金。因?yàn)橐蕴徊⒉恢С中?shù)因此1個(gè)token必須表示1克黃金,以及,為了向外界表示1000克作為單一的1Kg單位,小數(shù)位要設(shè)置成3(因?yàn)?10^3 克也就是1千克黃金才是token合約創(chuàng)建者希望顯示為1token的單位)。一些GoldToken的持有者可以用圖像表示在下方。
在這里你可以看到總共有50Kg的黃金被表示出來(每token 1克乘以50,000個(gè)token)。
但是,如果小數(shù)位被設(shè)成3,用戶的情形就會(huì)像下面這樣:
可以看到,將小數(shù)位設(shè)置成3在字面上就意味著在顯示GoldToken余額的時(shí)候,應(yīng)該有3位數(shù)跟在小數(shù)點(diǎn)后面。
小數(shù)位經(jīng)常被稱為是一個(gè)人性化的元素,因?yàn)樗试Stoken合約定義他們希望余額怎樣顯示給用戶。GoldToken并不在內(nèi)部處理小數(shù)位,也從不將小數(shù)位用在它自己的計(jì)算中因?yàn)橐磺卸际怯每藖碛?jì)算的,但它允許用戶使用黃金的共通單位(千克)而不是在合約中使用的單位(克)。
正如在上述GoldToken中顯示的,可切分性的觀念允許token合約顯示非常小的小數(shù)值,并且token也常常把小數(shù)位設(shè)成18,以給予token一個(gè)近乎連續(xù)的價(jià)值范圍。
總結(jié)一下,在決定要取幾個(gè)小數(shù)位時(shí),下述規(guī)則是應(yīng)該被遵循的:
token合約表示的是一個(gè)不可切分的物體嗎?(如果是)那么將小數(shù)位設(shè)為0
token合約表示的是一個(gè)有特定小數(shù)位的物體嗎?那么將小數(shù)位設(shè)置到那個(gè)數(shù)字
如果上述兩者都不是,請?jiān)O(shè)置小數(shù)位為18
重要的是要知道小數(shù)位對合約創(chuàng)建的影響。被創(chuàng)建的Token數(shù)量應(yīng)該等于token的全部數(shù)量,要求是10^小數(shù)位的倍數(shù)。正如在GoldToken例子中可以看到的,token創(chuàng)建者希望創(chuàng)建token來表示50千克的黃金,但因?yàn)?位小數(shù),他們必須發(fā)行50,000 token(50×10^3)來做成這件事。
總供給是定義一個(gè)ERC-20 token合約的最后一個(gè)東西,并且,正如我們提到過的,它是唯一的強(qiáng)制參數(shù)。雖然在ERC-20說明書中并沒有明確提到,但總供給的概念是簡單的:總供給等于所有余額的和。上面的例子中一直顯示著總供給,所以這里就無需贅述了。
一個(gè)ERC-20 token合約的功能
ERC-20 token合約擁有一系列的功能,允許用戶發(fā)現(xiàn)用戶的余額,也允許余額經(jīng)過驗(yàn)證從一個(gè)賬戶轉(zhuǎn)賬到另一個(gè)賬戶。下面來描述一下這些功能。
balance()函數(shù)提供了被一個(gè)給定地址持有的token的數(shù)量。記住,任何人都可以查到任何地址的余額,正如所有數(shù)據(jù)在區(qū)塊鏈上都是公開的。
從一個(gè)地址發(fā)送token到另一個(gè)地址有兩種辦法。tranfer()函數(shù)可以從信息發(fā)送者那里直接轉(zhuǎn)一些token到林一個(gè)地址。記住,人們不會(huì)查驗(yàn)接收地址,因此確保接收者按預(yù)期的方式行動(dòng)是發(fā)送者的責(zé)任。
雖然用transfer()來發(fā)送toke給另一個(gè)用戶是很棒的,但當(dāng)token要被用來為一個(gè)智能合約中的函數(shù)進(jìn)行支付的時(shí)候,它就起不了作用了。這是因?yàn)?,?dāng)智能合約運(yùn)行的時(shí)候,它沒辦法獲得哪個(gè)地址轉(zhuǎn)賬到哪里的細(xì)節(jié),因此也就無法保證調(diào)用這個(gè)合約的用戶已經(jīng)支付了啟動(dòng)合約要求數(shù)量的資金。
想象一下,有一個(gè)合約Doer被部署在網(wǎng)絡(luò)上。Doer擁有一個(gè)函數(shù)dosomething(),它要求10 Do token來運(yùn)行。Joe希望調(diào)用dosomething(),也有50Do token在他的賬戶上。Joe怎樣能夠支付給Doer以致后者可以成功運(yùn)行dosomething()呢?
approve()和transferFrom()是兩個(gè)方程,它們使用一個(gè)兩步過程,可以解決上面的問題。第一步,一個(gè)token持有者給另一個(gè)地址(常常是一個(gè)智能合約)批準(zhǔn)從本地轉(zhuǎn)出一個(gè)最大特定數(shù)量的token,也就是所謂的配額(allowence)。Token持有者使用approve()來提供這些信息。
在上述例子中,第二行顯示,地址為 0x1f59…3492 的Joe已經(jīng)允許地址為 0xd8f0…c028 的Doer從Joe的賬戶中轉(zhuǎn)出25個(gè)token。
一旦一個(gè)許可被創(chuàng)建,智能合約就可以從一個(gè)用戶的配額中占用許可數(shù)量的token,作為該合約運(yùn)行的一部分。繼續(xù)這個(gè)例子。Joe現(xiàn)在可以調(diào)用dosomething(),而dosomething()可以使用transferFrom()以從Joe的賬戶中獲得10個(gè)Do token, 然后開始它的工作。如果Joe的賬戶上沒有10個(gè)token,或者配額低于10個(gè)token,dosomething()就會(huì)當(dāng)機(jī)。
allowance()函數(shù)提供了允許從一個(gè)給定地址提取到另一個(gè)給定地址的token的數(shù)量。記住,任何人都可以查到任何地址的余額,正如所有信息在區(qū)塊鏈上都是公開的。重要的是知道,配額是“軟性”的,因?yàn)樗袉为?dú)的或者累積的配額可以超過一個(gè)地址的余額。在上面展示的表格中,持有者 0x2299…3ab7 許可了最高500個(gè)token的轉(zhuǎn)出,但他的余額,如上所示,只有90個(gè)token。任何使用allowance()的合約,在計(jì)算可用的token數(shù)量的時(shí)候,都必須額外考慮用戶的余額。
一個(gè)ERC-20 token合約中的事件
ERC-20定義了在合約采取了相關(guān)行動(dòng)的時(shí)候,兩類事件是必須被觸發(fā)的。第一類事件是Transfer(),就是放出從一個(gè)地址轉(zhuǎn)移到另一個(gè)地址的token轉(zhuǎn)移的細(xì)節(jié)。第二類事件是Approval(),就是放出從一個(gè)地址許可轉(zhuǎn)移token到另一個(gè)地址的細(xì)節(jié)。這些可以被用來跟蹤地址余額和配額的變更,而無需查詢區(qū)塊鏈。
鑄造token會(huì)發(fā)出了一個(gè)帶有o地址的Transfer()事件作為源。
當(dāng)token被銷毀的時(shí)候,沒有事件會(huì)發(fā)出。因?yàn)檫@一點(diǎn),ERC-20 token 合約常常通過transfer()發(fā)送token到0地址來銷毀token,代替真正的銷毀。
超越ERC-20
ERC-20提供了一個(gè)良好的基礎(chǔ)來構(gòu)建token合約,但也并不是沒有問題。ERC-223協(xié)議提供了額外的特性和安全措施,但與ERC-20并不兼容。Token合約的建構(gòu)在今天還要繼續(xù)遵循ERC-20,而開發(fā)者應(yīng)該跟蹤 ERC-223協(xié)議,并為它做出貢獻(xiàn)。
以上就是以太坊科普:理解ERC-20 token合約的詳細(xì)內(nèi)容,更多關(guān)于理解ERC-20 token合約的資料請關(guān)注腳本之家其它相關(guān)文章!
你可能感興趣的文章
-
什么是合約地址?一個(gè)幣的合約地址有什么用
這篇文章主要介紹了什么是合約地址?一個(gè)幣的合約地址有什么用的相關(guān)資料,對于合約地址,那么很多人不知道到底一個(gè)幣的合約地址有什么用,感興趣的朋友,看完這篇文章,你…
2021-08-13 -
科普:什么是以太坊上的礦工費(fèi)?如何設(shè)置礦工費(fèi)?
這篇文章主要介紹了科普:什么是以太坊上的礦工費(fèi)?如何設(shè)置礦工費(fèi)的相關(guān)資料,希望這篇關(guān)于什么是以太坊上的礦工費(fèi)的文章,能夠幫助各位朋友對以太坊礦工費(fèi)有個(gè)更加深入的…
2023-12-19 -
科普:以太坊中的賬戶、交易、Gas 和區(qū)塊 Gas Limit
這篇文章主要介紹了科普:以太坊中的賬戶、交易、Gas 和區(qū)塊 Gas Limit的相關(guān)資料,希望這篇關(guān)于以太坊中的賬戶、交易、Gas 和區(qū)塊 Gas Limit的文章,能夠幫助各位朋友對以…
2021-12-08 -
科普:以太坊交易的生命周期?
這篇文章主要介紹了科普:以太坊交易的生命周期的相關(guān)資料,希望這篇關(guān)于以太坊交易的生命周期的文章,能夠幫助各位朋友對以太坊有個(gè)更加深入的了解?!?/p> 2021-12-08
-
ETH(Ethereum)以太坊錢包基本概念介紹
這篇文章主要介紹了ETH(Ethereum)以太坊錢包基本概念介紹的相關(guān)資料,希望這篇關(guān)于以太坊錢包基本概念介紹的文章,能夠幫助各位朋友對以太坊錢包有個(gè)更加深入的了解?!?/p> 2021-12-08
-
以太坊代幣錢包MyEtherWallet使用教程
這篇文章主要介紹了MyEtherWallet使用教程的相關(guān)資料,希望這篇關(guān)于MyEtherWallet使用教程的文章,能夠幫助到大家更深入的了解MyEtherWallet?!?/p> 2021-12-07
-
以太坊智能合約及大部分Token都在用的ERC標(biāo)準(zhǔn)是什么?
這篇文章主要介紹了以太坊智能合約,以及大部分Token都在用的ERC標(biāo)準(zhǔn)是什么?的相關(guān)資料,希望這篇關(guān)于以太坊智能合約和ERC標(biāo)準(zhǔn)是什么的文章,能夠幫助各位朋友對ERC有個(gè)更加…
2021-12-02 -
以太坊科普:Eth2驗(yàn)證者如何生成和保護(hù)取款密鑰
這篇文章主要介紹了以太坊科普:Eth2驗(yàn)證者如何生成和保護(hù)取款密鑰的相關(guān)資料,希望這篇關(guān)于Eth2驗(yàn)證者如何生成和保護(hù)取款密鑰的文章,能夠幫助各位投資者對Eth2有一個(gè)更加…
2021-11-30 -
以太坊合約交易怎么玩?以太坊合約交易教程
這篇文章主要介紹了以太坊合約交易怎么玩?以太坊合約交易教程的相關(guān)資料,需要的朋友可以參考下,以太坊合約交易是指交易雙方,在交易所通過買賣以太坊合約,并根據(jù)約定在…
2021-11-29 -
科普:以太坊轉(zhuǎn)賬手續(xù)費(fèi)怎么算?教你省錢的方法
這篇文章主要介紹了科普:以太坊轉(zhuǎn)賬手續(xù)費(fèi)怎么算?的相關(guān)資料,希望這篇關(guān)于以太坊轉(zhuǎn)賬手續(xù)費(fèi)怎么算的文章,讓大家都能明白以太坊轉(zhuǎn)賬手續(xù)費(fèi)的算法,下面一起來看看吧!…
2021-11-10