Ethereumを動かす ~Part10~

Blog Single

前回までスマートコントラクトの書き方・デプロイ方法を説明しましたが、ではそのスマートコントラクトを用いて具体的にどのようなことをするのかというのを今回ご紹介したいと思います。

トークンとICO

スマートコントラクトを利用することでEthereum環境上に”トークン“を発行することができます。
トークンとは、証拠、記念品、商品券、などの意味を持つ言葉で、Ether同様に各アカウントに紐づいて管理され、Ether同様に別アカウントに送ったり逆に受け取ったり出来るものです。

企業等が独自のトークンを発行し、様々なユーザーに購入してもらって資金調達することを”ICO“と呼びます。トークンは後々サービスに利用できたり、またトークン自体の価値も上がることもあり、ユーザーはそれらを期待して購入します。
ブロックチェーンの特性上、各取引がしっかりとデータに残り改竄される心配がなく、またトークンの発行が容易であることから、Ethereum上においてICOは盛んです。

ERC20

先程も述べたようにトークンの発行は案外容易で、しかも割りと作りたいように作れてしまいます。
しかし、だからと言ってそれぞれが勝手な仕様のトークンばかり発行していたら、そのトークンの仕様に合ったウォレットでしか受け取ったり送ったり出来なかったりして非常に不便です。

それを避けるために、Ethereumサイドでトークンの守るべき基準を何パターンか定めています。今現在最も用いられているのはERC20という基準です。
ERC20に準拠していることで、ERC20に対応しているウォレット全てで受け取ることも送ることも可能になるので何かと便利です。

具体的にERC20とはどういうルールなのかというと「8個の特定の関数と、2個の特定のイベント(処理が走ったらクライアント側に通信を送るもの)を最低限用意しなさい」というものです。
逆に言うと、それさえ守っていればある程度自由にトークンの設定を決めることができます。

ではその備えていなければならない特定の関数と特定のイベントはどういうものかを説明します。
(※参考 https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md)

【関数】

name…トークンの名前を返す
symbol…トークンのシンボル(BTC、ETHなど)を返す
decimals…トークンが小数点何桁まで使用できるかを返す
totalSupply…発行したトークン数を返す48
balanceOf…引数で渡されたアドレスのアカウントの残高を返す
transfer…第一引数で渡されたアドレスへ、第二引数で渡された数量分のトークンを渡す(もしも数量分のトークンが存在しなかった場合、例外処理としてthrowする)
transfarFrom…第一引数で渡されたアドレスから第二引数で渡されたアドレスへ、第三引数で渡された数量分だけトークンを渡す(渡す側のアドレスがこの操作を許可していない場合は例外処理としてthrowする)
approve…第一引数のアドレスが送れるトークン量を第二引数で渡された数量まで認める(再び呼ばれた際は送付可能なトークン量は更新され、ここで定めた量以上はtransfarFrom出来ない)
allowance…第一引数のアドレスを持つオーナーアカウントが第二引数のアドレスを持つアカウントからいくら引き出せるか返す

【イベント】

Transfer…トークンの受け渡しがあった場合出力する(transfer、transferFrom)
Approval…承認があった場合出力する(approve)

ERC20以外の規約

とはいえERC20を満たしたら必ずしも安全かというと決してそうでなく、トークンをユーザーのアドレスではなくコントラクトのアドレスに誤って送ってしまった場合は取り出せなくなったり、最近ではbatchTransferという独自実装によりバグが発生することが話題になったり、実装には細心の注意が必要です。
また、勿論ERC20以外にも様々な規約があります。中には上記のERC20の持つ問題を解決させたものもあるので軽くご紹介したいと思います。

ERC223…トークンを送信する前にそのアドレスがトークンを受け取れるか確認し、もし確認できなければトークンを送り返させる
ERC721…トークンそれぞれに区別があり代替が不可能
ERC827…ERC20のニュータイプとも言われ、取引データ自体も送信できる
ERC948…定期購入向け

技術書は勿論、本全般が好き。品揃えの良い本屋に行くとテンション上がりすぎて後で具合が悪くなる。

Other Posts: