Blockchain Ethereum を使った、サーバ問題を考えなくていい未来の話

## はじめに
**未来の話をしましょう**
AWSやGCPに依存しない未来
DDos攻撃なんか全く怖くない未来
データが消えるなんてありえない未来

必ず来るであろう未来の話を「今」しましょう。我々技術者が作っていく未来ですから。

## 現在
未来の話をする前に現在の話をしないとですね

![001.jpeg](https://s3-ap-northeast-1.amazonaws.com/blockchain-assets/%E7%A0%94%E7%A9%B6assets/%E7%A0%94%E7%A9%B6assets.001.jpeg)
知ってます知ってます。みなさんが、できる限りサーバ問題が起きないように努力していること、、、今回は説明のため簡略化させていただきました。

攻撃者ならどこを狙いますか？
中央管理しているアプリケーションサーバを狙うはずです。
root権限が取れればやりたい放題ですし、嫌がらせ目的ならDDos攻撃すればいいですからね
サービスを運営している会社への依存も問題です。
運営している会社の社員に悪い人がいれば、データを書き換えられてしまったり、誠に恐ろしいことですが、本番データベースをremoveしてしまうということもありえます。
では、こんな感じでどうでしょう?
## 分散アプリケーション
![002.jpg](https://s3-ap-northeast-1.amazonaws.com/blockchain-assets/%E7%A0%94%E7%A9%B6assets/%E7%A0%94%E7%A9%B6assets.002.jpeg)


サーバが複数になり、端末は様々なノードにアクセスを行なっています。
いわゆる、Peer-to-Peer(以降P2P)の構造です。
単純なデータの交換なら随分と前から確立されている技術ですね。
ですが、以前のP2P技術でアプリケーションを実行するためには幾らかの問題がありました。

一つ目に、参加ノード及びそのノードの持つデータの安全性に対する保証が取れなかったという点。
二つ目に、参加ノードにアプリケーションを実行するためのプラットフォームがなかったという点。(何よりも、参加ノードがアプリケーションを実行するメリットがありません)

しかし、ここから時代は進歩しています。そう、それがサトシナカモトが生み出し、我々技術者が広める「Blockchain」技術です。
Bitcoinのイメージが強いかと思いますが、時代はさらに流れています。
**Ethereum**それが、今回紹介する**Blockchainを用いた分散アプリケーションプラットフォーム**です。

## Ethereum(Blockchainを用いた分散アプリケーションプラットフォーム)
![](https://s3-ap-northeast-1.amazonaws.com/blockchain-assets/%E7%A0%94%E7%A9%B6assets/%E7%A0%94%E7%A9%B6assets.003.jpeg)

EthereumではSmartContractと呼ばれるスクリプト群をBlockchain上に格納できるプラットフォームを提供しています。
上図のようにEthereumネットワークに参加するノードに向け、端末からAPIとしてアクセスを行い、あらかじめBlockchainに登録されたスクリプトに従い、データの格納、参照を行います。
これだけではわからないと思いますので、流れに沿ってもう少し詳しく説明します。


① まず初めに、コントラクト(スクリプト群)の作成者はあらかじめ、Ethereumネットワークに参加するノードに向けて、コントラクト格納のトランザクションを発生させます。

![](https://s3-ap-northeast-1.amazonaws.com/blockchain-assets/%E7%A0%94%E7%A9%B6assets/%E7%A0%94%E7%A9%B6assets.004.jpeg)

② トランザクションを受け取ったノードはBlockchainプロトコルに従い、他のノードへトランザクションの共有を行います
![](https://s3-ap-northeast-1.amazonaws.com/blockchain-assets/%E7%A0%94%E7%A9%B6assets/%E7%A0%94%E7%A9%B6assets.005.jpeg)

③ 各ノードでマイニングが行われ、マイニングノード(最初にマイニングを終えたノード)はBlockを他のノードに共有、各ノードでBlockchainにBlockが追加されます。
これにより、Contract(スクリプト群)は全ノードが所持することになります。
![](https://s3-ap-northeast-1.amazonaws.com/blockchain-assets/%E7%A0%94%E7%A9%B6assets/%E7%A0%94%E7%A9%B6assets.006.jpeg)

④ ユーザはJavaScriptなどから、Ethereumネットワークの目的Contractのアドレスに向け、トランザクションを発生させ、データの参照、格納を行います。

![](https://s3-ap-northeast-1.amazonaws.com/blockchain-assets/%E7%A0%94%E7%A9%B6assets/%E7%A0%94%E7%A9%B6assets.007.jpeg)

簡略化している部分はありますが、概ねこのような流れです。理解していただけたでしょうか?

攻撃者にとってはたまったものではありません。
- Blockchainの特性上、以前の値を書き換えることは実質上不可能
- DDosをしようにも、全ノードに向けて攻撃をしなければならない(実質上不可能)
- コントラクト(スクリプト群)は全ノードに分散されてあるため、書き換えることができない

攻撃者に残された方法は、作成されたコントラクトの脆弱性をつくことぐらいしかありません。(実際につかれた例がThe DAO事件と呼ばれるものです)

### Ethereumで完全な分散アプリケーションを作るときの問題点
ここまでだと、現状のEthereumで分散アプリケーションの実装が可能に見えてしまうので、タイトルに**「未来の話」**と入れた理由を説明させていただきます。
それは、現実的に今のEthereumのみでみなさんが今運営しているWebアプリケーションを完全に再現することは難しいということです。
理由は4つ

1. 分散、マイニングによる遅延  
https://etherscan.io/chart/blocktime で確認できるように、ブロックが生成されるまで、約15~30s程度かかります。リアルタイムが一般的な現代に置いて、この遅延は大きいものです
2. データのサイズ  
Blockchainに保存するデータは小さければ小さいほどいいです。
そこで、今あるEthereumを用いたプロジェクトではストレージに保存を行い、その参照するためのhash値などをBlockchainに保存する形を取っていますが、まだまだ発展途上と言えます。
3. 機能の欠如  
現在、Ethereumにはライブラリも少なく、開発環境も乏しいです。さらに、検索機能などよくある機能が備わっていません。
4. マイニングのためのGas  
EthereumではEther呼ばれる仮想通貨を用いていますが、コントラクトをデプロイするときやデータを格納するときにGasとしてEtherが必要となります。Gasは行うスクリプトを実行するため労力により変動します。よって、大きな処理をすればするほど、コストがかかります。

Ethereumを作ったヴィタリック・ブテリンも言っています。

> イーサリアムのシステムをよりよくすることを考えていきたい。ユーザビリティとスケーラビリティの両方を、バランスよく伸ばしていくということだ。そのためにはブロックチェーンの技術を、もっと速く、簡単に、そして安価に使えるものにしなければいけない。

https://wired.jp/special/2017/vitalik-buterin/ より


## 未来の話
**改ざん不可能な形かつ公平で自律的にさらに分散的に動く**
これが未来の形です
まだまだ問題はありますね
でも、関係ないですよね
我々エンジニアが分散して問題を解決していくのですから

## 最後に
さて、どうでしたでしょう？
最初にも言いましたが、未来は我々エンジニアが作るものです。ユーザが安全に、安心して、いつでもサービスを受けられるように。。エンジニアは大変ですね 笑  
そういう未来のために(大学の卒研準備で年越しプログラミングしてそうなぐらい忙しいですが)、布教活動として、記事を書きました。
指摘事項、情報共有はコメントによろしくお願いします！！
### おまけ
Ethereumやってみようかな??と思った方！ 詳しい開発方法の記事も1月ぐらいには書きたいなーと思っていますが、待ちきれない人のために、少し情報共有させていただきます。
書籍を手に取ると、Go-Ethereum(geth)をインストールし、プライベートブロックチェーンネットワークを構築しているものをよく見かけますが、学習コストが高すぎます。
手軽にかつ、現実的な開発手法として、[Truffle](http://truffleframework.com/)というフレームワークが用意されています
他にもよく使うツールとして

- [ganache-cli](https://github.com/trufflesuite/ganache-cli)  
RPC(Remote procedure call : 遠隔手続き呼出し)でContractを呼び出すためのプライベートEthereumネットワークを構築してくれるツールです
- [Ganache](https://github.com/trufflesuite/ganache)  
上に同じくなのですが、トランザクションの流れやEtherの状況などを可視化してくれるツールです。僕はよく、Truffleを入れたあと、gitのsubmoduleという形でこちらを入れておきます
- [Mocha](https://mochajs.org/)  
テストとして使います。
- [Solium](https://github.com/duaraghav8/Solium)  
Solidityのlinterです。各種IDEがSolidityの対応を進めていますが、かなり不十分です。僕は、travisCIを使って、githubにpushしたときにこちらのlinterが動いて、Solidityの構文チェックを行うようにしています。
- [zeppelin-solidity](https://github.com/OpenZeppelin/zeppelin-solidity)  
こちらは、独自のトークンを作りたいときなどなど、Solidityのライブラリですね。もっとこういったライブラリが増えてくれればありがたいのですが、、、
- [ropsten](https://github.com/ethereum/ropsten)  
こちら使ったことがないのですが、Ethereum本番環境とだいたい同じ機能を持ったリモートのテスト環境になっています。

などなどあります。