この記事はEIP20の日本語訳です(CC0)。誤訳や認識の齟齬があればご指摘ください。
トークンのためのインターフェイス標準規格。
トークンコントラクトに標準化されたAPIを実装するための規格を以下に記載します。
この規格にはトークンを送信するための基本的な機能を持たせており、また自分のトークンの第三者による利用を承認する機能が含まれるため、サードパーティ製のスマートコントラクトに自分のトークンを委託することができます。
このインターフェイス規格は、Ethereum上のすべてのトークンがウォレットからDEXまであらゆるアプリケーション上で共通して利用可能とすることを目的としています。
メソッド
注: コントラクト利用者は returns (bool success)にて返される false を必ずハンドリングしなければなりません。falseは返らないだろう、と想定しないでください。
name
トークンの名前を返します。(例: "MyToken")
必須ではありません。このメソッドはユーザビリティを向上するために利用できますが、コントラクト利用者はこのメソッドが必ず提供されると想定すべきではありません。
function name() view returns (string name)
symbol
トークンのシンボルを返します。(例: "HIX")
必須ではありません。このメソッドはユーザビリティを向上するために利用できますが、コントラクト利用者はこのメソッドが必ず提供されると想定すべきではありません。
function symbol() view returns (string symbol)
decimals
トークンが利用する小数点以下の桁数を返します。(例:このメソッドが 8 を返す場合、コントラクト利用者は1トークンが100000000として表現されると理解できます)
必須ではありません。このメソッドはユーザビリティを向上するために利用できますが、コントラクト利用者はこのメソッドが必ず提供されると想定すべきではありません。
function decimals() view returns (uint8 decimals)
totalSupply
トークンの総供給量を返します。
function totalSupply() view returns (uint256 totalSupply)
balanceOf
引数の _owner アカウントが保持するトークン量を返します。
function balanceOf(address _owner) view returns (uint256 balance)
transfer
引数 _value の量のトークンを _to アカウントに送信します。Transferイベントを発火しなければなりません。このメソッドは _from アカウントに充分なトークン量が存在しなかった場合に例外を throw すべきです。
注: トークン量0を送信する場合、通常通り送信を行いTransferイベントを発火しなければなりません。
function transfer(address _to, uint256 _value) returns (bool success)
transferFrom
引数 _value の量のトークンを _from アカウントから _to アカウントに送信します。Transferイベントを発火しなければなりません。
transferFromメソッドは、ユーザのアカウントからトークンを引き出す操作で利用され、コントラクトがユーザのトークンを代理で送信できるようにします。これはたとえば、コントラクトがユーザの代わりにトークンを送信したりEtherではなくトークンで手数料を徴収したりする時に利用できます。
このメソッドは _from アカウントが何らかの方法でトランザクション発行者(sender of the message)に自分のトークンの利用を承認していなかった場合に例外を throw すべきです。
注: トークン量0を送信する場合、通常通り送信を行いTransferイベントを発火しなければなりません。
function transferFrom(address _from, address _to, uint256 _value) returns (bool success)
approve
引数 _spender に対して、 _value の量に達するまで複数回のトークン引き出しを許可します。このメソッドが複数回呼ばれた場合、allowance の量が _value で上書きされます。
日本語への翻訳における補足:以下の注釈はユーザのapproveメソッド実行に気づいた_spenderが素早くトークン引き出しを行った場合、_spenderのトランザクションが先に実行されユーザは想定以上の量のトークンをapproveしてしまう可能性がある問題(ERC20 API: An Attack Vector on Approve/TransferFrom Methods)について言及しています。
注:こちらやこちらで示されたクラッカーの攻撃手法(attack vectors)を防止するために、クライアントはこのメソッドが同じ _spender に対して複数回呼ばれた場合、まず allowance に0を設定するような方法でインターフェイスを作成すべきです。とはいえ、下位互換性を保つためにコントラクト自体がそれを強制すべきではありません。
function approve(address _spender, uint256 _value) returns (bool success)
allowance
引数 _spender が、 _owner から許可されているトークン引き出し残量を返します。
function allowance(address _owner, address _spender) view returns (uint256 remaining)
イベント
Transfer
トークンが送信された時に必ず呼び出されなければなりません。送信トークン量が0の場合も同様です。
新しいトークンを生成するトークンコントラクトは、引数の _from アドレスに 0x0 を指定してTransferイベントを発火すべきです。
event Transfer(address indexed _from, address indexed _to, uint256 _value)
Approval
approve(address _spender, uint256 _value) メソッドが成功したときは必ず呼び出されなければなりません。
event Approval(address indexed _owner, address indexed _spender, uint256 _value)
すでに多くのERC20準拠トークンがEthereumネットワークにデプロイされています。また複数のチームから、異なるトレード・オフ(gas節約〜セキュリティ向上)を有するERC20の実装が公開されています。
公開されている実装の例:
https://github.com/ConsenSys/Tokens/blob/master/contracts/eip20/EIP20.sol
"approve" を複数回実行する前に必ずallowanceに0を設定する実装:
https://github.com/Giveth/minime/blob/master/contracts/MiniMeToken.sol
History
この規格に関する経緯についてのリンク。
ヴィタリク・ブテリンによる元の改善提案:
Redditディスカッション:
https://www.reddit.com/r/ethereum/comments/3n8fkn/lets_talk_about_the_coin_standard/
GitHub issue #20:
https://github.com/ethereum/EIPs/issues/20
Copyright
Copyright and related rights waived via CC0.