ERC20についてsolidityの実装と一緒にどんなものなのかをまとめます。
ERCというのは"Ethereum Request for Comments"の略です。多くのプロトコルがRFC (Request For Comments)というアイデアと実装コードを付けたものを提案してそれをみんなで評価し、評価が良ければ実装という形で新しい機能を追加していきます。ERCはそれのイーサリアム版ですね。ちなみに現在ではEIP (Ethereum Improvement Proposal)と名前を変えています。番号は提案された順なのでたまたま20ですね。
ERC20はトークン基準の提案でした、つまりこういう機能を持ったトークン基準を作ればEthereumでいい感じに運用できるやろ!みたいなことです。提案者の片方はEthereumの開発主導でもあるVitalik Buterinですね。そもそもトークンって何?な人はこちら。
要するに、ここにある関数を実装してるトークンならイーサリアムのWalletや取引所で扱える、逆に言えばこのインターフェースさえ実装してくれたらどんな名前の誰が発行したトークンでもいろんな場所で取引できるようになる、という最低限?の基準です。
以下はsolidityの実装ガイドラインです(ALISさんのコード埋め込みSolidity未対応なんや😭😭)。
name : (オプショナル)トークンの名前です、なくてもいいんや
function name() public view returns (string)
symbol:(オプショナル)トークンのシンボルですね、ETHとか、なくてもいいんや
function symbol() public view returns (string)
decimals:(オプショナル)トークンの桁数ですね、ここにある桁数分割ってユーザには表示します
function decimals() public view returns (uint8)
totalSupply:トークンの総供給量を返します
function totalSupply() public view returns (uint256)
balanceOf:引数にアドレス_ownerを取り、_ownerアドレスにある子のトークンの残高を返します
function balanceOf(address _owner) public view returns (uint256 balance)
transfer:引数にアドレス_toと数値_valueを取り、_to のアドレスに_value分だけトークンを送ります。Transferというイベントを発火する必要があります、もし送信主のアカウントが_value以下の残高しかなければ何かのメッセージをTHROWする必要があります。成功したかどうかの真偽値を返します。
function transfer(address _to, uint256 _value) public returns (bool success)
transfarFrom:引数にアドレス_toとアドレス_fromと数値_valueを取り、_fromアドレスから_toアドレスに_value分のトークンを送ります。送信するアドレスを自分以外のアドレスにできます。引き下ろしに使えます。成功したかどうかの真偽値を返します。
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
approve:引数にアドレス_spenderと数値_valueを取ります。アドレス_spenderが自分のアドレスから_value分のトークンをほかの場所に移すことを許可します。_valueより小さい値なら複数回のトランザクションも可能です。
function approve(address _spender, uint26 _value) public returns (bool success)
allowance:引数にアドレス_spenderとアドレス_ownerを取ります。_spenderが_ownerから引き下ろせるこのトークンの量を返します
function allowance(address _spender, address _owner) returns (uint256 remaining)
Transfer:トークンが送信されたときに発火する必要があります、送信されるトークンの量がゼロでも発火される必要があります。変数としてアドレス_fromとアドレス_toと数値_valueがあります。新しいトークンを発行(mint)するときにもこのイベントが発火する必要があり、その場合には_fromに0x0(ゼロアドレス)が入ります。
event Transfer(address indexed _from, address indexed _to, uint256 _value)
Approval:approve関数がsuccessしたときに発火します。変数としてアドレス_ownerとアドレス_spenderと数値_valueがあります。
event Approval(address indexed _owner, address indexed _spender, uint256 _value)
これらの関数とイベントのうちオプショナルなもの以外はすべて実装してやっとERC20トークン基準を満たしたトークンといえるわけですね。
こう見ると実際価値の交換に必要な処理(Method)と記録に残しておくべきデータ(Event)がわかりやすく、綺麗に抽出されててすごいですね。
実際ERC20トークンを実装したトークンのスマートコントラクトの例はオープンツェッペリンさんやコンセンシスさんが出していたりします。