天天看點

【Ethereum】以太坊ERC20與ERC233的差別什麼是ERC223相關說明概述動機規格方法事件示例代碼參考資料

ERC223是繼ERC20後推出的新标準,解決了ERC20中的一些問題

1.合約中意外丢失token: 有兩種不同的方式來轉移ERC20 token: 1) 合約位址 2) 錢包位址 ,你需要調用<code>transfer</code>發送給錢包位址 或者 調用<code>approve</code>在token合約然後調用<code>transferFrom</code>在接收的合約來發送到合約。意外地,對合同位址調用 <code>transfer</code>函數的調用将導緻接收方合同内的token丢失,令牌将永遠不會被通路。

2.無法處理進入的令牌交易: ERC20 token交易是合約内的<code>transfer</code>函數的調用。當交易發生時,ERC20令牌合同不會通知接收方。此外,沒有辦法通過合同處理傳入的令牌交易,也沒有辦法拒絕任何不支援的令牌。

3.實際上,錢包位址和合同之間的ERC20令牌交易是兩個不同的交易:你應該在合約上調用<code>approve</code>,然後再調用<code>transferFrom</code>在另一份合約上,當你想你的token委托過去。

4.Ether交易和token交易行為不同: 開發ERC223的目标之一是進行與Ether交易相似token牌交易,以避免使用者在轉移token時出錯,并為契約開發人員更容易地與token交易進行互動。

1.提供避免不符合發送令牌的合同内的意外丢失令牌的可能性。

2.允許使用者通過一個函數調用發送到任何地方他們的令牌。 收件人是否是合同是沒有差別的。 沒有必要了解令牌合約如何為正常使用者發送令牌。

3.允許合同開發人員處理傳入令牌中的交易。

4.ERC223轉移到合同消耗比ERC20準許少2倍gas和transferFrom在接收機的合同。

5.允許将令牌存入單一交易的合約。 防止額外blockchain腫脹。

6.token交易類似于Ether交易。

ERC223令牌應通過以令牌合約的方式<code>transfer</code>函數發送,但請注意,如果接收方是合同或電子錢包位址,則不會有差異。如果接收者是錢包,則ERC223令牌傳輸将與ERC20傳輸相同。如果接收方是合約,ERC223令牌合約将嘗試在接收方合約中調用tokenFallback函數。如果接收方沒有tokenFallback函數,合約事務将失敗。tokenFallback函數是Ether事務的後備功能模拟,可用于處理傳入事務。有一種方法可以将<code>bytes _data</code>附加到類似于連接配接到Ether 事務的<code>_data</code>的令牌事務。它将通過令牌合約,并将通過接收方合同的<code>tokenFallback</code>函數處理。還有一種方法可以在沒有資料參數的情況下使用ERC223令牌合約傳輸函數,或者使用沒有傳輸函數資料的ERC20 ABI。 在這種情況下_data将為空位元組數組。

ERC: 223

Title: Token standard

Author: Dexaran, [email protected]

Status: Draft

Type: ERC

Created: 5-03.2017

以下描述标準功能,令牌合同和使用指定令牌的合同可以實施,以防止意外發送令牌到合同,并使令牌交易的行為像ether交易。

ERC223解決了ERC20的一些問題:

1.無法處理接收合同中的進賬交易。

2.令牌可以發送到合同中沒有設計不處理與标記工作,并可能會丢失。目前至少有四十萬美元的損失。

3.令牌交易應與Ethereum意識形态一緻。當一個使用者轉賬的時候,必須自己執行<code>transfer</code>.使用者存入合同或發送到外部擁有的賬戶無關緊要。

這些将允許合同處理傳入令牌交易并防止意外發送的令牌被合同接受。

例如,分散式交換将不再需要強制使用者通過令牌合約來呼叫準許,然後通過從允許的令牌擷取正在調用transfer的呼叫存款。 令牌交易将在交易所合約内自動處理。

這裡最重要的是在執行合同交易時調用tokenFallback。

Token

使用token的合約

注意: 一個重要的一點是,如果合同開發人員希望他們的合同使用指定的令牌,那麼合同開發人員必須實作tokenFallback。

如果接收方未實作tokenFallback函數,則認為合同不是設計為使用令牌,那麼事務必須失敗,并且不會傳輸令牌。 在嘗試将Ether發送到沒有實作function())的合同時,與Ether事務的類比是失敗的。

擷取總量

得到token的名字

得到token的符号

得到token的小數點後幾位

得到位址是<code>_owner</code>的賬戶的餘額

由于向後相容性原因,因為ERC20傳輸函數沒有位元組參數。如果<code>_to</code>是合約,則此函數必須傳輸令牌并調<code>_to中</code>的函數<code>tokenFallback(address,uint256,bytes)</code>。如果<code>_to</code>(接收方合同)中沒有實作<code>tokenFallback</code>函數,則事務必須失敗,并且不會發生令牌的傳輸。

重要:将在接收方合約中調用的令牌備用功能必須命名為<code>tokenFallback</code>,并使用參數<code>address</code>,<code>uint256</code>,<code>bytes</code>。 此函數必須具有<code>0xc0ee0b8a</code>簽名。

當某人想要轉移令牌時總是調用這個函數。

如果<code>_to</code>是合約,則此函數必須傳輸令牌并調用<code>_to</code>中的函數<code>tokenFallback (address, uint256, bytes)</code>。 如果<code>_to</code>(接收方合同)中沒有實作<code>tokenFallback</code>函數,則事務必須失敗,并且不會發生令牌的傳輸。

如果<code>_to</code>是外部擁有的位址,則必須發送事務,而不嘗試在<code>_to</code>中執行<code>tokenFallback</code>。

<code>_data</code>可以附加到這個令牌交易中,它将永遠保持在塊狀(需要更多的gas)。 <code>_data</code>可以是空的。

注意: 檢查<code>_to</code>是合約還是位址的推薦方法是組裝<code>_to</code>的代碼。 如果<code>_to</code>中沒有代碼,那麼這是一個外部擁有的位址,否則就是一個合約。

重要: 将在接收方合約中調用的令牌備用功能必須命名為<code>tokenFallback</code>,并使用參數<code>address</code>, <code>uint256</code>,<code>bytes</code>。 此函數必須具有<code>0xc0ee0b8a</code>簽名。

當token轉移的時候觸發。

令牌持有者發送令牌時處理從令牌合同所調用的令牌傳輸的功能。 <code>_from</code>是令牌發送者,<code>_value</code>是傳入令牌的數量,<code>_data</code>是附加的資料,類似于Ether事務中的資料。 适用于以太交易的回退功能,并且不傳回任何内容。

注意: msg.sender将是tokenFallback函數内的令牌合同。 過濾哪些令牌(通過令牌契約位址)發送可能很重要。 令牌發送者(誰發起了代币交易的人)将_from thetokenFallback函數内。

重要: 這個函數必須命名為<code>tokenFallback</code>,并使用參數位址<code>uint256</code>,位元組來比對函數簽名<code>0xc0ee0b8a</code>。

<a href="https://github.com/ethereum/EIPs/issues/223" target="_blank">https://github.com/ethereum/EIPs/issues/223</a>

<a href="https://github.com/Dexaran/ERC223-token-standard/tree/Recommended" target="_blank">https://github.com/Dexaran/ERC223-token-standard/tree/Recommended</a>

<a href="https://www.reddit.com/r/ethereum/comments/60ql37/attention_be_careful_using_ethereum_tokens/" target="_blank">https://www.reddit.com/r/ethereum/comments/60ql37/attention_be_careful_using_ethereum_tokens/</a>

<a href="http://www.jinse.com/news/ethereum/43264.html" target="_blank">http://www.jinse.com/news/ethereum/43264.html</a>

<a href="https://www.reddit.com/r/ethereum/comments/6m9rnu/erc20_vs_erc223_eli5/" target="_blank">https://www.reddit.com/r/ethereum/comments/6m9rnu/erc20_vs_erc223_eli5/</a>

繼續閱讀