Ethereumスマートコントラクトの可能性を感じろ　〜図と比較で理解する〜

Ethereumは仮想通貨としても有名ですが，アプリ開発の対象としてとても面白いものなんだよ，ということを伝えたいための記事です．

# 私は誰？（言い訳）
とある院生です．ブロックチェーンを使ったサービスを作る研究開発のお手伝いをしています．
その一環でEthereumのアプリを作る中で，Ethereumの仕組みや思想を知るうちに，本当に面白いと思うようになったので，その感動を共有したくて記事を書きました．
興味を引きつけるための記事なので，具体的な技術は省いて，ざっくりと概要とできそうなことをお伝えできればと思います．
まだまだ勉強を始めたばかりなので間違いがあれば，ご指摘いただけると幸いです．

なお，この記事はEthereumのWhite paperの内，スマートコントラクトについての記述を自分なりに解釈＆要約したものです．


# ビットコインの仕組み
Ethereumの特徴を理解するために，まずブロックチェーン利用の基本形とも言えるビットコインの仕組みを簡単におさらいしてみます．

ブロックチェーンとは一言で言えば，
「信頼のない個人間の取引において，その取引が確実に行われたことを証明するための仕組み」
です．

ビットコインでは，ビットコインという”通貨”の取引を証明するために利用されています．

ブロックチェーンでは取引（トランザクション：Transaction）の記録と承認のステップが踏まれます．
いわゆるマイニングは，AさんからBさんへの取引が発行され，記録されるとき，その取引が確実に行われたことを承認するために行われます．
そのためにハッシュ値やP2Pなどの技術が使われますが，ここでは詳細は省きます．

理解してほしいのは，以下の点です．

|プラットフォーム|取引相手|取引するもの|
|:--:|:--:|:--:|
|ビットコイン|人|お金同士|

![Bitcoin.png](https://qiita-image-store.s3.amazonaws.com/0/98053/5913412d-14ef-07c1-bb4f-63aa28611250.png)

# Ethereumの仕組み
さて本題です．
Ethereumにはスマートコントラクトという仕組みがあります．
これは，簡単に言うと，
「Ethereumのプラットフォーム上で動作する仮想マシン」
です（正確には状態遷移マシンです．この事実はEthereumにおけるマイニング時に重要になります）．

Ethereumの大きな特徴は，人に対してだけではなく，このスマートコントラクトに対して取引を行うことができることです．

具体的に説明していきます．
Ethereumでは，アカウントの種類は二種類あります．
１つは，この記事でこれまで人と呼称してきたものが相当するEOA（externally owned accounts）．
もう１つは，contract (contract account) です．

アカウントは最大で以下の４つのパラメータを持ちます．

* nonce （ナンス：アカウント名のようなもの）
* 現在のether balance （残金）
* contract code （一般的な開発言語はSolidity）
* storage （不揮発性のstorage，揮発性のstackとmemoryがある）

３つ目のcontract codeの有無によって，そのアカウントがEOAかcontractかが判断されます．

興奮してきますね．
contractアカウントは，プログラムコードとストレージを持っているのです！

contractアカウントは，EOAからのアクセスをトリガーとして，自身が保持するcontract codeを実行します．
このとき，contractアカウントに与えられている権限は３つあります．

* 自身のstorageに対して読み書き
* 他のアカウントへのmessageの送信（Transactionの発行）
* contractを新規に作成すること！

contract codeに記述されるコードに応じて，これらの権限を利用することができます．
特に３つ目は素晴らしいです．
夢が広がります．
contractアカウントは，Ethereumプラットフォーム上に存在するため，そのアカウントを知ってさえいれば，誰でもそのコードを利用することができます．
もちろんTokenと呼ばれる仕組みやアクセス制限を用いることによって，特定の人達しか利用できないサービスを作成することも可能です．
しかも，それをサーバレスに行うことができるのです．

ちなみに物理的には誰がこのcontract codeを実行するの？という疑問があるかと思います．
一般的なクライアント・サーバ型のシステムであれば，サーバが大抵の処理をしますが，EthereumプラットフォームはP2P，つまり中央サーバがないネットワークで構成されますから，誰かが実行しなければなりません．
結論から言えば，実行するのは，contract codeの実行者と，その実行者とスマートコントラクトの取引を承認するマイナーの２人です．

順番としては大まかには次の通りです．
まず実行者は，実行したいcontractアカウントに対してTransactionを発行します．
contractアカウントは処理に応じて，自身の状態を書き換えます．
この取引が正しいのかどうか，マイナーは確認のため，マイニングを行います．マイニングでは具体的にはコードの再実行を行います．
つまり，実行者の環境で行われたことが，他の環境でも正しいのか検証するわけです．
実行結果を比較した結果，正しければ承認されます．

ところでマイニングをすると，ブロックチェーンの仕組みにおいては報酬（Ethereumではether）がもらえますよね．
実はcontractアカウントの実行には，その処理の重さ（コード数などから計算される）に応じてgasと呼ばれる燃料が必要になります．
gasはetherと相互互換性があり（というかデータ上は同じ），マイナーはcontractアカウントの実行に必要となった燃料から報酬を支払われます．
つまり，contract codeの実行に必要となった計算量に応じた報酬が支払われることになります．

ビットコインと比較してみると違いは以下の通りです．

|プラットフォーム|取引相手|取引するもの|
|:--:|:--:|:--:|
|ビットコイン|人|お金同士|
|Ethereum|人 or スマートコントラクト|お金同士 or お金（燃料）と計算能力|

![Ethereum.png](https://qiita-image-store.s3.amazonaws.com/0/98053/3171482b-f7da-fb86-32c7-35a6c5cb3e4c.png)

# おわりに
いかがでしたでしょうか．
なんとなくでもEthereumってすごいなあ，すごそうだなあと思っていただけると幸いです．

ここで述べた理論はブロックチェーンにおいては本当に一握りに過ぎません．
非集権化，ハッシュ値，マイニングの報酬，Dapps，Oracle，Tokenなど用語を並べるだけでもわかるように，語っていないことは無数にあります（ちゃんと理解していないことも）．

この記事では様々な点で端折りがありますので，興味を持たれたのであれば，誤解することのないように，本家のWhite paperやちゃんとした本を読むことをおすすめいたします．
その結果，お前全然言ってること違うじゃねえか，ということがあれば，どんどん教えていただけると嬉しく思います．

# 参考
Ethereum Project: https://www.ethereum.org/