丸の内で働くブロックチェーンエンジニアのブログ

丸の内でブロックチェーンエンジニアとして働いています。勉強している技術情報やニュースを紹介します。

Ethereumトークン規格のERC20,ERC223,ERC721について

Ethereum上で発行されるトークンには標準規格があります。 最も有名な規格はERC20で、Augur,OmiseGO,Qtumなど多くのトークンがEthereum上で発行されています。

ERCはEthereum Improvement Proposalで提案されて採決されます。

ERC20に続いて、現在ERC20を発展させたERC223,ERC721という規格が議論されています。

例えば、各規格が採用されているトークンは以下のようになります。

規格名 トークン名
ERC20 Augur, OmiseGO, Qtum
ERC223 eDogeCoin
ERC721 CryptoKitties, Decentraland

※ eDogeCoinはEthereum上で発行されたコインでDogecoinとは異なります。当初Dogecoinと誤って記載してしまっていたところ、コメントで指摘をいただいて修正しました。

eDogeCoin公式

http://www.edogecoin.com/

これらのトークン規格の現状についてそれぞれみていきます。

目次

ERC20とは - 現在(2017/12/31)時点で多くのシェアを占める規格

現在、Ethereum上で発行されているトークンの多くはERC20という規格に従っています。ERC とは「Ethereum RFC (Request for Comment)」の意味で、その20番目になります。

ERC20準拠のトークン同士であれば、同じ枠組みで移動することができます。

ERC20の規格

github.com

ERC20の関数・イベント

ERC20の仕様は以下になります。8つのfunctionと2つのeventを実装すれば、ERC20トークンになります。 基本的には名前やシンボルの返却、転送を行う関数を定義したシンプルなものです。

なお、Ethereumのイベントについてはこちらに書かれています。イベントによりロギングがしやすくなります。イベントが実行されると、引数がトランザクションのログに格納されます。また、JavaScriptからイベントを監視するなども実施可能です。

  • function
関数名 説明 定義
name トークンの名前を返す関数 function name() constant returns (string name)
symbol トークンのシンボルを返す関数 function symbol() constant returns (string symbol)
decimals トークンが使用する小数点以下の桁数を返す関数 function decimals() constant returns (uint8 decimals)
totalSupply トークンの総供給量を返す関数 function totalSupply() constant returns (uint256 totalSupply)
balanceOf アカウントの残高を返す関数 function balanceOf(address _owner) constant returns (uint256 balance)
transfer トークンを転送するための関数 function transfer(address to, uint256 value) returns (bool success)
transferFrom トークンを転送するための関数。転送元アドレスを指定する。 function transferFrom(address from, address to, uint256 _value) returns (bool success)
approve 引出限度額を設定する関数 function approve(address spender, uint256 value) returns (bool success)
allowance ownerのアドレスからspenderの引き出しが許可されている金額 function allowance(address owner, address spender) constant returns(uint256 remaining)


  • Events
イベント名 説明 定義
Transfer トークンが転送されたら実施しなければいけないイベント event Transfer(address indexed from, address indexed to, uint256 _value)
Approval approve関数が呼ばれたら実施しなければいけないイベント event Approval(address indexed owner, address indexed spender, uint256 _value)

ERC223とは - ユーザーのトークン転送ミスに配慮したERC20の改良版

ERC223とは、ERC20でユーザーがミスした際の問題に対応するために議論されている規格です。

ERC223で提起された問題として、着信トランザクション処理が定義されていないという問題があります。通常のアカウントであるEOA (externally owned accounts)でなく、コントラクトアドレスに誤ってトークンを送っても処理されないので、送ったトークンが凍結されてしまいます。

2017/12/27時点で少なくとも3億5千万円以上の損失が出ているようです。

ERC223のディスカッション

github.com

ERC223では解決のために、送ったトークン内容を確認して、誤っていれば持ち主の元に返却するという仕様をtokenFallback関数で定義しました。これにより送られたトークンが正しいトークンかどうか検証し、そうでなければ送り返すということが可能となります。これにより、ユーザーの

また、新しいtransfer関数が作られ、transferFrom, approve,allowanceは削除されました。新しいtransfer関数は消費gasが少なく優れていると主張されています。ERC223はERC20の上位互換と言われているようです。

ERC223の関数・イベント(2017/12/31時点)

関数、イベントは以下の通りです。★は新規追加されたものにつけています。

  • function
関数名 説明 定義
name トークンの名前を返す関数 function name() constant returns (string name)
symbol トークンのシンボルを返す関数 function symbol() constant returns (bytes32 _symbol)
decimals トークンが使用する小数点以下の桁数を返す関数 function decimals() constant returns (uint8 decimals)
totalSupply トークンの総供給量を返す関数 function totalSupply() constant returns (uint256 totalSupply)
balanceOf アカウントの残高を返す関数 function balanceOf(address _owner) constant returns (uint256 balance)
transfer トークンを取引するための関数。新規にtransfer関数は実装されているが、ERC20との互換性を持たせるために残された。 function transfer(address to, uint value) returns (bool)
transfer ★ERC223で新規に追加されたtransfer関数。トランザクションデータを持たせるための引数「data」が追加 function transfer(address to, uint value, bytes _data) returns (bool)
tokenFallback ★送ったトークン内容を確認して、誤っていれば持ち主の元に返却する function tokenFallback(address from, uint value, bytes _data)


  • Events
イベント名 説明 定義
Transfer トークンが転送されたら実施しなければいけないイベント event Transfer(address indexed from, address indexed to, uint256 _value)

ERC721とは - NFT(Non-Fungible Token)のための規格

ERC223とは別の方向性に発展させた規格です。NFT(Non-Fungible Token)という「代替不可能なトークン」というものを作る時用の規格として定義されました。

「Fungible」とは相互に代替可能であるという意味です。1BTCは別の場所でも1BTCであることが保証される。これがFungibleです。

一方、「Non-Fungible」とは、代替不可能という事です。CryptoKittiesというEthereum上で猫を育てるサービスが話題になりましたが、ERC721準拠のサービスです。

CryptoKittiesは猫を交配させて自分だけの猫(トークン)を育てるゲームです。自分の猫は他人の猫とは代替出来ない存在なので「Non-Fungible」です。この場合、猫が「NFT(Non-Fungible Token)」になります。

何か「代替不可能なもの」を作成するプラットフォームを作りたい場合、ERC721は活用される規格になるでしょう。

ERC721のディスカッション

github.com

www.cryptokitties.co

ERC721の関数・イベント(2017/12/31時点)

関数、イベントは以下の通りです。★はERC20から新規追加されたものにつけています。

tokenMetadataによって、そのトークンに紐づく情報を取得できます。また、tokenIdを指定する関数が多く存在し、tokenIdのオーナーなどを取得することができます。

CryptoKittiesの例であれば、tokenMetadataによって生年月日や体重などを取得できますし、ownerOfによって飼い主情報を取得できます。

  • function
関数名 説明 定義
name トークンの名前を返す関数 function name() constant returns (string name)
symbol トークンのシンボルを返す関数 function symbol() constant returns (string symbol)
decimals トークンが使用する小数点以下の桁数を返す関数 function decimals() constant returns (uint8 decimals)
totalSupply ★このコントラクトで発行されているNFTの総数を返す関数 function totalSupply() constant returns (uint256 totalSupply)
balanceOf ★アドレスに割り当てられたNFTの数を返します function balanceOf(address _owner) constant returns (uint256 balance)
ownerOf ★引数で指定したtokenIdを持つアカウントを取得する function ownerOf(uint256 _tokenId) constant returns (address owner)
approve ★アドレス_toが、tokenIdのNFT所有することを承認する function approve(address to, uint256 tokenId)
takeOwnership ★ _tokenIdの所有権を割り当てる function takeOwnership(uint256 _tokenId)
transfer tokenId に対応するトークンを、to で指定したアドレスに転送する function transfer(address to, uint256 value) returns (bool success)
tokenOfOwnerByIndex ★ERC721アカウントの残高を返す関数 function tokenOfOwnerByIndex(address owner, uint256 index) constant returns (uint tokenId)
tokenMetadata ★オプション関数。tokenに紐づくメタデータを取得し、URLを返却する function tokenMetadata(uint256 _tokenId) constant returns (string infoUrl)


  • Events
イベント名 説明 定義
Transfer NFTが転送された時に呼ばれなければいけないイベント event Transfer(address indexed from, address indexed to, uint256 _tokenId)
Approval NFTが承認された時に呼ばれなければいけないイベント event Approval(address indexed owner, address indexed approved, uint256 _tokenId)

まとめ

現在最も多くのトークンが従っているERC20に加えて、 ユーザーの転送ミスに配慮してERC20を改良したERC223、 NFT(Non-Fungible Token)を意識したERC721と規格が議論されています。

特にNFTは今後も大きくなるトレンドであると考えられ、動向を注目していきたい規格です。

参考

Contracts — Solidity 0.4.24 documentation

EIPs/eip-20-token-standard.md at master · ethereum/EIPs · GitHub

ERC223 token standard · Issue #223 · ethereum/EIPs · GitHub

ERC: Non-fungible Token Standard · Issue #721 · ethereum/EIPs · GitHub

まだERC20で消滅してるの? - Qiita

The New ERC223 Token Standard – Kin Foundation – Medium

CryptoKitties | Collect and breed digital cats!