本記事ではEthereumベースで唯一無二なトークンを作れる、トークン標準「ERC721」について解説します。
ERC20、ERC223、ERC721
現在もっとも利用されているEthereumベースのトークンの標準としてERC20があります。ERC20のほかには、ERC20の誤送金の課題を解決するERC223も提案されています。
ここで「標準」とはトークンの動作をきめるスマートコントラクトの共通の仕様を定めたもので、個々のトークン発行者がこの仕様に基づいてトークンを実装します。標準に基づくトークンであれば、トークンを扱うウォレットや取引所といったアプリケーションではトークンごとに個別の処理を書くことなく、インターフェイスに従う共通の処理でトークンを扱うことができます。
ERC20やERC223は通貨として使うためのトークンの標準ですが、これらに続いて異なる方向性の代替不可能なトークン(NFT: Non-fungible token、ノン ファンジブル トークン。以下NFTとします)の標準「ERC721」が2018年1月に提案されました。Ethereumのシステム改善提案の仕組みEIPでEIP721として議論され採択が決まりました。EthereumのウェブサイトとGitHubで仕様が公開されています。
- ERC-721 Non-Fungible Token Standard | Ethereum Improvement Proposals
- EIPs/eip-721.md at master · ethereum/EIPs (GitHub)
ERC721が対象とするNFTとその用途
NFTについて説明する前に通貨の「代替可能性」(Fungibility、ファンジビリティー)という性質について説明します。
通貨では一般的に代替可能性が重視されます。代替可能性とは、どのコインも同様に受け入れられる価値を持つという性質です。どの1ETHも同じの価値を持ち交換できることが期待されます。当たり前のように聞こえますが、仮想通貨のように電子的な履歴を持つ通貨の場合、過去に犯罪に利用された通貨、盗まれた通貨など通貨に色がつき、受け取り手に拒否される可能性があります。より厳密に代替可能性を保証することを掲げてトランザクションを秘匿するZcashのような仮想通貨もあります。
※関連記事: ゼロ知識証明でプライベートな取引を実現するZcash
それでは代替不可能であるNFTとはどのようなトークンなのでしょうか。トークンというと何らかの仮想通貨を思い浮かべがちですが、2017年末に仮想通貨ブームと共に流行したEthereumベースの分散型ゲームCryptoKittiesの子猫のようなコレクタブル(collectable、収集品)をイメージするとわかりやすいでしょう。実際、CryptoKittiesは早期からERC721を採用した事例として有名です。CryptoKittiesの子猫の所有権はERC721のインターフェイスを継承して実装されています。CryptoKittiesは、Ethereumネットワーク上で猫の見た目をしたトークンを集め、交配、交換するのを楽しむゲームと見ることができます。
画像: CryptoKittiesウェブサイトより
このほかEIP721のページでは、ERC721の対象として、物理的な資産である家やアート作品、デジタルコレクタブルとしてユニークなカード、マイナスの価値を持つローンなどを挙げています。
どのようなERC721トークンが存在するのかについては、Ethereumネットワークに関する情報を提供するEtherscanのリストで見ることができます。ゲームに関するものが多いようですが、トークン名にlandとつくものもあり、土地に関するトークンも存在します。これは、Decentralandという仮想世界の土地取引に使われるERC721トークンです。(※10/24初出時より更新しました。)
Etherscan ERC-721 Token Tracker Page
ERC721の特徴
ERC721トークンは代替不可能であることを念頭において、ERC721のインターフェイスを見てみましょう。ERC20同様、ERC721にもトークンを転送するtransferFrom関数がありますが、定義は少し異なります。
<ERC20>
function transferFrom(address from, address to, uint tokens) public returns (bool success);
<ERC721>
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
ERC721では個々のトークンはユニークで代替不可能すなわち唯一無二あることから、トークンの量(_value)ではなく、トークンのID(_tokenId)を引数で指定し転送します。その他のtransfer系の関数、approve関数でも同様にトークンの量を指定するかわりにトークンのIDを指定します。
ERC721特有の関数やデータを保持する仕組みも存在します。ownerOf関数はトークンのIDから所有者のアドレス返します。
function ownerOf(uint256 _tokenId) external view returns (address);
利用は任意ですが、ERC721Metadataでトークンのメタデータを扱うことができます。CryptoKittiesの子猫を例にとると、名前、詳細、見た目の画像URLなどがメタデータにあたります。メタデータは外部サーバーに保存することが想定され、ERC721Metadataの中ではERC721 Metadata JSON形式のメタデータを返すURIを保持します。
interface ERC721Metadata { function name() external view returns (string _name); function symbol() external view returns (string _symbol); function tokenURI(uint256 _tokenId) external view returns (string); }
このメタデータを外部に保持する仕様には問題もあります。分散型アプリの「アプリは運営を必要とせず永遠に動き続ける」という性質を担保しなくなり、たとえば外部に保存されているコレクタブルの見た目となる画像データが失われてしまうと、価値が失われてしまう可能性があるからです。
ERC721ではトークンを取り扱うウォレットなどのアプリケーション側で実装するERC721TokenReceiverインターフェイスも定義されています。
interface ERC721TokenReceiver { function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) external returns(bytes4); }
Safe transferと呼ばれる安全なトークンの転送を受けつけるアプリケーションの場合、アプリケーション側ではERC721トークンが転送された際に呼び出すonERC721Received関数を実装しなければなりません。これはERC223で、ERC20の送金失敗の問題を解決するために受け取り側のスマートコントラクトにtokenFallback関数の実装を求めている点と類似しています。
ERC721トークンやそれを扱うスマートコントラクトを開発する場合、ERC20同様、OpenZeppelinというSolidityで書かれたスマートコントラクトのオープンフレームワークを使うとよいでしょう。実装の手間を省けるだけでなく、独自のコードに起因する事故を防ぐという点でも有用です。
- OpenZeppelin
- openzeppelin-solidity/contracts/token/ERC721 at master · OpenZeppelin/openzeppelin-solidity (GitHub)
ERC721の今後
仮想通貨が広まり利用が進む中、標準の必要性が認識され、ERC20にはじまり、ERC223、ERC721と新たな標準が出て来ています。これはコンピューターやインターネットの普及期にさまざまなソフトウェア、ハードウェア、ネットワークのプロトコルや規格が提案され、標準化されてきた流れを思い起こさせます。
NFTの標準として提案されたERC721は、草案の段階からCryptoKittiesをはじめとするコレクタブルを扱うゲームがアプリケーションとしてリリースされてきました。ERC721は部分的にERC20の仕様を取り入れ、トークンの誤送付に対応する点ではERC223との共通点もあります。
今後、関連するトークンの標準とともに、ゲーム以外の分野も含めどのようにERC721の利用が進むのか注目したいところです。