天天看點

了解ERC-20 token合約

了解ERC-20 token合約

ERC-20最初作為一種嘗試,旨在為以太坊(Ethereum)上的token合約提供一個特征與接口的共同标準,并且,它現在已經被證明是非常成功的了。ERC-20有很多好處,包括允許錢包顯示數以百計不同token的賬戶餘額;建立一個交易工具,隻需提供token合約的位址就可以将更多token列入表中。建立ERC-20相容token的好處很多,以至于在今天,很少有其他token合約用其他方式建立。

Token合約是什麼?

現在仍存在着大量關于“token合約到底是什麼”的争論。本質上來說,一個token合約就是一個包含了一個對賬戶位址及其餘額的映射的智能合約(Smart Contract)。賬戶餘額表示一種由合約建立者定義的值:一個token合約也許使用餘額來表示實體對象,或是表示另一種貨币價值,還可以表示持有人的名譽。餘額的機關通常被稱為token。

了解ERC-20 token合約

當token從一個賬戶被轉移到另一個賬戶的時候,token合約更新兩個賬戶的餘額。比如,一筆從 0x2299…3ab7 到 0x1f59…3492 的10個token的轉賬将導緻餘額清單如下圖所示進行更新:

了解ERC-20 token合約

如果該token合約允許的話,變更一種token的總供給可能有兩種辦法。token的總供給可以通過鑄造新token來增加。舉個例子,鑄造出100個token到位址 0x4ba5…ae22 将導緻餘額如下圖所示進行更新:

了解ERC-20 token合約

token的總供給也可以通過“銷毀”現有的token來減少。比如, 0x4919…413d 銷毀了50個token,這将導緻餘額如下圖所示更新:

了解ERC-20 token合約

銷毀token的另一種方式是将token發送到一個未建立私鑰的位址,通常來說就是0位址。這會使得這些token不可用,在這方面,它與銷毀token有同樣的效果,但并沒有減少token的總數。比如, 0x93f1…1b09 用此種方式銷毀了50個token将導緻如下圖所示的餘額:

了解ERC-20 token合約

簡單的token合約在一個從位址到餘額的映射中儲存上述資訊。當更多複雜的情景出現時,比如發放股息,替代性結構或者增補性結構常常要變得更強悍。但是,不管那些操作上的細節的話,對外部可見的token餘額總是像上面的圖示那樣的。

一個ERC-20 token合約的定義

一個ERC-20 合約是通過合約的位址以及它可用的token總供給來定義的,但它通常還提供一些非必須的東西,也是為使用者提供更多細節。它們包括該token的名字、标志、小數位。這些中的每一個都會包括在下面的細節中。

在深入到細節之前,了解這件事情是重要的:token合約沒有一個中心化的登記處,是以無法保證特定名字和符号的唯一性。一旦你已經建立了一個token合約,你應該請求将它加入公共站點,比如:Etherscan,MyEtherWallet 以及 CoinMarketCap。當然,確定符合網站上的說明可以最大化你的申請被接受的機會。

Token合約的名字乃是該token合約應該被知道的完整名稱,比如“My Token”。名字的長度沒有限制,但完整名稱在一些錢包應用中更容易顯示不完全,是以,最好讓名字短一點。

Token合約的标志乃是該token合約應該被知道的符号,比如“MYT”。廣義上,它是股票代碼的對應物,而且,雖然沒有嚴格的長度限制,但它在長度上常常是3或4個字母。

小數位常常是混淆的來源,但經過合理的解釋這是非常容易了解的。小數位意味着一個token的可切分性,從0個小數位(即完全不可切分)到18位小數(幾乎是連續的),如果需要,可以有更多的小數位。從技術上來說,小數位的意義在于顯示token價值在螢幕上的時候小數點後面跟着的位數。小數位存在的理由是以太坊并不處理有小數的數字,隻顯示整數的數字價值。考慮下面兩個例子:

第一個例子是LicenseToken,一個為給定軟體産品顯示軟體許可配置設定的token合約;持有一個LicenseToken,使用者就可以使用該軟體。而持有小于1個的LicenseToken則沒有任何意義,是以token建立者将小數位設為0。一些LicenseToken的持有人賬戶餘額如下。

了解ERC-20 token合約

可以看到,在這裡有100份許可,主要被一個賬戶所持有。當使用者購買一份許可的時候,一個token将從持有賬戶轉賬到購買者賬戶。而許可驗證者可以檢視一個特定的賬戶是否真的持有一個LicenseToken,然後做出相應的行動。

第二個例子是GoldToken,一個表示實體黃金所有權的token合約。合約建立者希望每機關表示1千克黃金的機關,但同樣希望允許使用者以克的級别(但不能更低)持有和交易黃金。因為以太坊并不支援小數是以1個token必須表示1克黃金,以及,為了向外界表示1000克作為單一的1Kg機關,小數位要設定成3(因為 10^3 克也就是1千克黃金才是token合約建立者希望顯示為1token的機關)。一些GoldToken的持有者可以用圖像表示在下方。

了解ERC-20 token合約

在這裡你可以看到總共有50Kg的黃金被表示出來(每token 1克乘以50,000個token)。

但是,如果小數位被設成3,使用者的情形就會像下面這樣:

了解ERC-20 token合約

可以看到,将小數位設定成3在字面上就意味着在顯示GoldToken餘額的時候,應該有3位數跟在小數點後面。

小數位經常被稱為是一個人性化的元素,因為它允許token合約定義他們希望餘額怎樣顯示給使用者。GoldToken并不在内部處理小數位,也從不将小數位用在它自己的計算中因為一切都是用克來計算的,但它允許使用者使用黃金的共通機關(千克)而不是在合約中使用的機關(克)。

正如在上述GoldToken中顯示的,可切分性的觀念允許token合約顯示非常小的小數值,并且token也常常把小數位設成18,以給予token一個近乎連續的價值範圍。

總結一下,在決定要取幾個小數位時,下述規則是應該被遵循的:

token合約表示的是一個不可切分的物體嗎?(如果是)那麼将小數位設為0

token合約表示的是一個有特定小數位的物體嗎?那麼将小數位設定到那個數字

如果上述兩者都不是,請設定小數位為18

重要的是要知道小數位對合約建立的影響。被建立的Token數量應該等于token的全部數量,要求是10^小數位的倍數。正如在GoldToken例子中可以看到的,token建立者希望建立token來表示50千克的黃金,但因為3位小數,他們必須發行50,000 token(50×10^3)來做成這件事。

總供給是定義一個ERC-20 token合約的最後一個東西,并且,正如我們提到過的,它是唯一的強制參數。雖然在ERC-20說明書中并沒有明确提到,但總供給的概念是簡單的:總供給等于所有餘額的和。上面的例子中一直顯示着總供給,是以這裡就無需贅述了。

一個ERC-20 token合約的功能

ERC-20 token合約擁有一系列的功能,允許使用者發現使用者的餘額,也允許餘額經過驗證從一個賬戶轉賬到另一個賬戶。下面來描述一下這些功能。

balance()函數提供了被一個給定位址持有的token的數量。記住,任何人都可以查到任何位址的餘額,正如所有資料在區塊鍊上都是公開的。

從一個位址發送token到另一個位址有兩種辦法。tranfer()函數可以從資訊發送者那裡直接轉一些token到林一個位址。記住,人們不會查驗接收位址,是以確定接收者按預期的方式行動是發送者的責任。

雖然用transfer()來發送toke給另一個使用者是很棒的,但當token要被用來為一個智能合約中的函數進行支付的時候,它就起不了作用了。這是因為,當智能合約運作的時候,它沒辦法獲得哪個位址轉賬到哪裡的細節,是以也就無法保證調用這個合約的使用者已經支付了啟動合約要求數量的資金。

想象一下,有一個合約Doer被部署在網絡上。Doer擁有一個函數dosomething(),它要求10Dotoken來運作。Joe希望調用dosomething(),也有50Dotoken在他的賬戶上。Joe怎樣能夠支付給Doer以緻後者可以成功運作dosomething()呢?

approve()和transferFrom()是兩個方程,它們使用一個兩步過程,可以解決上面的問題。第一步,一個token持有者給另一個位址(常常是一個智能合約)準許從本地轉出一個最大特定數量的token,也就是所謂的配額(allowence)。Token持有者使用approve()來提供這些資訊。

了解ERC-20 token合約

在上述例子中,第二行顯示,位址為 0x1f59…3492 的Joe已經允許位址為 0xd8f0…c028 的Doer從Joe的賬戶中轉出25個token。

一旦一個許可被建立,智能合約就可以從一個使用者的配額中占用許可數量的token,作為該合約運作的一部分。繼續這個例子。Joe現在可以調用dosomething(),而dosomething()可以使用transferFrom()以從Joe的賬戶中獲得10個Dotoken, 然後開始它的工作。如果Joe的賬戶上沒有10個token,或者配額低于10個token,dosomething()就會當機。

allowance()函數提供了允許從一個給定位址提取到另一個給定位址的token的數量。記住,任何人都可以查到任何位址的餘額,正如所有資訊在區塊鍊上都是公開的。重要的是知道,配額是“軟性”的,因為所有單獨的或者累積的配額可以超過一個位址的餘額。在上面展示的表格中,持有者 0x2299…3ab7 許可了最高500個token的轉出,但他的餘額,如上所示,隻有90個token。任何使用allowance()的合約,在計算可用的token數量的時候,都必須額外考慮使用者的餘額。

一個ERC-20 token合約中的事件

ERC-20定義了在合約采取了相關行動的時候,兩類事件是必須被觸發的。第一類事件是Transfer(),就是放出從一個位址轉移到另一個位址的token轉移的細節。第二類事件是Approval(),就是放出從一個位址許可轉移token到另一個位址的細節。這些可以被用來跟蹤位址餘額和配額的變更,而無需查詢區塊鍊。

鑄造token會發出了一個帶有o位址的Transfer()事件作為源。

當token被銷毀的時候,沒有事件會發出。因為這一點,ERC-20 token 合約常常通過transfer()發送token到0位址來銷毀token,代替真正的銷毀。

超越ERC-20

ERC-20提供了一個良好的基礎來建構token合約,但也并不是沒有問題。ERC-223協定提供了額外的特性和安全措施,但與ERC-20并不相容。Token合約的建構在今天還要繼續遵循ERC-20,而開發者應該跟蹤 ERC-223協定,并為它做出貢獻。

原文連結:https://medium.com/@jgm.orinoco/understanding-erc-20-token-contracts-a809a7310aa5

作者:Jim McDonald

翻譯&校對:阿劍 & Elisa

稿源:以太坊愛好者(https://ethfans.org/ajian1984/articles/686)

繼續閱讀