Hello Blockchain

この記事はeureka Engineering Advent Calendar 2017 22日目の記事です。
21日目は太田さんのここからはじめる!SPAパフォーマンス改善のアプローチでした。

Hello Blockchain

こんにちは。株式会社エウレカの裏仮想通貨部門で働いています、後藤です。本当のことを書くと、普段はSREエンジニアとして、アプリケーションのインフラ構築、データ分析基盤構築などをしています。昨今の勢いもあって、今日は仮想通貨のことを話します。

まずは挨拶程度に、個人的に好きな通貨と最近気になっている通貨についてご紹介していきます。

好きな通貨はZcashです。ゼロ知識証明という中二病のようなワーディングが気に入っています。Liskも好きなのですが、これ以上の話は長くなってくるので、私に個人チャットをしてください。ZcashLiskはOSSとして公開されているので、ちらっと読んでみるのも面白いかもしれません。

気になっている通貨はBitcoinCashです。この記事を書いている間に高騰してきたのでやや興奮気味にライティングしています。この高騰はCoinbaseでの通貨取り扱い開始が原因のようです。高騰も気になるところですが、通貨に対する評価ももちろん気になっています。

BitcoinCashの評価についてはBitcoin.com共同創業者へのインタビュー記事が印象的でした。残念ながらスウェーデン語は習得していないので、"Tokyo"という文字を認識した後はGoogle翻訳に少しづつ投下していく努力が必要です。翻訳した内容を要約すると、この方は「Bitcoinは通貨としては使えないと思っている。将来的に投資するのはリスクがあるから、BitcoinからBitcoinCashに乗り換えた」ということをトランザクションを理由に述べています。ちなみに"Tokyo"の部分は東京オフィスについて書かれていただけです。

もしかしたら似たような記事を読んで、なぜリスクがあるのかよく分からない…と半ば理解を諦めている人もいるかもしれません。今回はそれを理解するファーストステップとして、ブロックチェーンについてツールを使いながら簡単に楽しく学んでいきたいと思います。

ブロックチェーンを簡単に理解する

ブロックチェーンを簡単に理解するのに最適なCLI、blockchain-cliを用いて説明していきます。

まずは適当にNode.jsを入れてください。Node.jsを入れたらnpmが使えるようになっているはずです。npmが使えるようになったらターミナルで次の一文を打ちます。

$ npm install blockchain-cli -g

補足ですが、今回は以下の環境で実行しました。

$ node -v
v8.9.1
$ npm -v
5.5.1

これでblochain-cliが使えるようになったはずです。

$ blockchain
👋 Welcome to Blockchain CLI!
Commands:
help [command...]      Provides help for a given command.
exit Exits application.
blockchain See the current state of the blockchain.
mine <data> Mine a new block. Eg: mine hello!
open <port> Open port to accept incoming connections. Eg: open 2727
connect <host> <port> Connect to a new peer. Eg: connect localhost 2727
peers Get the list of connected peers.
discover Discover new peers from your connected peers.
blockchain →
blockchainコマンドを実行して、現在のブロックチェーンの状態を確認します。
blockchain → blockchain
┌─────────────────────────────────────────┐
│ 🏆 Genesis Block │
├────────────────────┬────────────────────┤
│ ⏮ Previous Hash │ 0 │
├────────────────────┼────────────────────┤
│ 📅 Timestamp │ Thu, 27 Jul 2017 │
│ │ 02:30:00 GMT │
├────────────────────┼────────────────────┤
│ 📄 Data │ Welcome to │
│ │ Blockchain CLI! │
├────────────────────┼────────────────────┤
│ 📛 Hash │ 0000018035a828da0… │
├────────────────────┼────────────────────┤
│ 🔨 Nonce │ 56551 │
└────────────────────┴────────────────────┘
blockchain →
表の用語について簡単に説明します。
Previous Hash = 前ブロックのハッシュ値

Hash = ブロックのハッシュ値

Timestamp = ブロックが追加された日付

Data = ブロックに保存されている情報

Nonce = 有効なハッシュ値を見つけるために繰り返した計算回数
ここで一番上に表示されているGenesis Blockというのは一番最初に作られるブロックのことです。ブロックチェーンの物語はここから始まります。
ちなみに、BitcoinのGenesis Blockには "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks" というメッセージが保存されています。これは、このブロックが2009年1月3日以降に作成されたことを証明するものであり、銀行の不安定さに対してBitcoinが持つ可能性を示したサトシナカモト(Bitcoin考案者)からのメッセージではないか、と推測されています。なんとなくワクワクしてきますね。
次にmineコマンドを実行して、ブロックを新たに作成してみます。
blockchain → mine hello!
⬆️ Mining new block
┌─────────────────────────────────────────┐
│ ⛓ Block #1 │
├────────────────────┬────────────────────┤
│ ⏮ Previous Hash │ 0000018035a828da0… │
├────────────────────┼────────────────────┤
│ 📅 Timestamp │ Wed, 20 Dec 2017 │
│ │ 08:04:27 GMT │
├────────────────────┼────────────────────┤
│ 📄 Data │ hello! │
├────────────────────┼────────────────────┤
│ 📛 Hash │ 000053366d25de20c… │
├────────────────────┼────────────────────┤
│ 🔨 Nonce │ 81132 │
└────────────────────┴────────────────────┘
🎉 Congratulations! A new block was mined. 💎
⬆ Sending peer latest block
blockchainコマンドを実行すると、ブロックが作成され、チェーンのようになっていることが分かります。
blockchain → blockchain
┌─────────────────────────────────────────┐
│ 🏆 Genesis Block │
├────────────────────┬────────────────────┤
│ ⏮ Previous Hash │ 0 │
├────────────────────┼────────────────────┤
│ 📅 Timestamp │ Thu, 27 Jul 2017 │
│ │ 02:30:00 GMT │
├────────────────────┼────────────────────┤
│ 📄 Data │ Welcome to │
│ │ Blockchain CLI! │
├────────────────────┼────────────────────┤
│ 📛 Hash │ 0000018035a828da0… │
├────────────────────┼────────────────────┤
│ 🔨 Nonce │ 56551 │
└────────────────────┴────────────────────┘
┌─────────────────────────────────────────┐
│ ⛓ Block #1 │
├────────────────────┬────────────────────┤
│ ⏮ Previous Hash │ 0000018035a828da0… │
├────────────────────┼────────────────────┤
│ 📅 Timestamp │ Wed, 20 Dec 2017 │
│ │ 08:04:27 GMT │
├────────────────────┼────────────────────┤
│ 📄 Data │ hello! │
├────────────────────┼────────────────────┤
│ 📛 Hash │ 000053366d25de20c… │
├────────────────────┼────────────────────┤
│ 🔨 Nonce │ 81132 │
└────────────────────┴────────────────────┘
blockchain →
ブロックチェーンの安全性
ブロックのハッシュ値は、インデックス(GenesisBlockを0として,1,2,3..と増加していきます),前ブロックのハッシュ値,タイムスタンプ,ブロックデータ,およびノンスを元に計算されており、ユニークな値になります。
CryptoJSを使って、以下のように書くことができます。
CryptoJS.SHA256(index + previousHash + timestamp + data + nonce)
ところで、先ほど生成したブロックのハッシュ値先頭4桁が0になっていることに気づいたでしょうか。ハッシュ値の何桁目までが0である必要があるかというのはdifficultyと呼ばれ、採掘難易度を表しています。
マイナーは、ノンスを変更しながらハッシュ計算を繰り返して、先頭N桁が0になる有効なハッシュ値を探しブロックを作成します。ちなみに、difficultyは、約10分でノンスが発見されるように調整されています。
このようにマイナーが数え切れない回数のハッシュ値計算を行ってブロックを作成すると、巨大なチェーンとなります。このブロック全体の膨大な計算量こそが、ブロックチェーンの安全性とも言えます。
ここで、悪意あるユーザーが特定のブロックデータを改ざんする不正行為について考えてみましょう。ブロックチェーンの性質を考えると、そのブロックから現在のブロックまでのハッシュ値計算をもう一度最初から行う必要があるので、改ざんはほぼ不可能です。
なぜ再計算が必要なのか、小さいブロックチェーンの例を使って説明します。
ここに ①-②-③ というブロックチェーンがあるとします。
例えば、ユーザーが①のデータを変更しようとします。ハッシュ値の計算式に従うと、①のハッシュ値はデータを元に計算されているので、値は変更されます。①のハッシュ値は先頭N桁が0になっていないので、無効となります。②のハッシュ値は①のハッシュ値を元に計算されているので、値は変更されます。②ハッシュ値も先頭N桁が0になっていないので、無効となります。③のハッシュ値も同様のロジックで無効となります。
この性質に加えて、新しいブロックが常にチェーンに追加され続けているため、ハッシュの再計算はほぼ不可能に近いです。このデータ改ざんの難しさが、ブロックチェーンの安全性を高めています。
これらはプルーフ・オブ・ワークと呼ばれており、Bitcoinなどの仮想通貨はこれを採用しています。
最後に
ブロックチェーンについて簡単にご説明しました。少しでも仮想通貨やブロックチェーンに興味を持っていただけたら幸いです。まだまだ日本における仮想通貨の利用目的は「投資」と言われています。しかし、仮想通貨が本当の通貨として日本に浸透していった時に、どのような部分で問題が生じ、どのようにして解決できるのか、技術的な目線と知識を持っておくのは非常に大事なことだと思います。あなたが仮想通貨を用いた購入システムを実装する日も、もしかしたら近いかもしれません。
明日は我らがSREのインフラヤクザ組長、恩田さんの登場です。最近やっている優しいインフラ改善のお話が聞けたりするはずです。お楽しみに!