読者です 読者をやめる 読者になる 読者になる

//あとで書く

です・ます調が記事によって違ったりするブログ

ブロックチェーン基盤に関するポエム

これはPDC Advent Calendar 201618日目の記事です.
前日はsiteさん(id:poketore-tech)による,HDDのファイルシステムについてでした.

はじめに
本記事では,ブロックチェーン基盤の概要について書いていきます.最近,自分の中で仮想通貨がブームになっており,有名な仮想通貨であるビットコイン(以下,BTCと書きます)の技術について調べている時間が多くありました.調べているうちにブロックチェーンやブロックチェーン基盤であるEthereum・BitcoinCoreというワードを発見したのでそれらについてのメモだと思って下さい.

ブロックチェーンとはなにか
ブロックチェーンとは「分散型台帳システム」と呼ばれていて,BTCではこの技術が大きく関係しています. ただ,BTC=ブロックチェーンという訳ではありません.BTCを構成する上で重要な技術基盤がブロックチェーンということです. 分散型台帳とは,Excelのデータシートのようなものが,P2P*1によって分散的に管理されている様子を想像してください. データシートに誰かが何かを入力すると他のノードのデータシートもネットワーク越しに更新されます. ただ,二重更新や悪意を持った更新が行われると困るので,承認のためのアルゴリズム*2が存在します.基本的にはこれだけです.

BTCとブロックチェーンの関係

BTCでは決済時に決済データ(トランザクション)をP2Pネットワークにブロードキャストします.トランザクションを受け取った各ノードは複数のトランザクションを1つのブロックという単位にまとめようとします.最も早くブロックを作成できたノードはブロックをネットワークにブロードキャストします.ブロックを受け取ったノードは電子署名によってブロックの信憑性を確かめ,正しさを確認できた場合はブロックを鎖状に連結します.この一連の働きをマイニング(採掘)といい,承認を表します.BTCにおいて,この連結されたブロック(ブロックチェーン)がデータシート(台帳)にあたるわけです.

BTCの詳細については中本哲史氏*3の論文を読んで下さい.原論文は英語ですが,有志の方により日本語化されています.
原論文
日本語版

また,書籍では「暗号技術入門 第3版 秘密の国のアリス」にBTCに関する加筆がなされているので読んでみて下さい.去年私がリクエストしたのでLiSAの図書室にあるはず.

暗号技術入門 第3版 秘密の国のアリス

暗号技術入門 第3版 秘密の国のアリス

Bitcoinの技術的側面に着目した本では,MasteringBitcoinの翻訳版である「ビットコインとブロックチェーン:暗号通貨を支える技術」が良いと聞きます.私はまだ読んでいないのでどなたか買って下さい.
ビットコインとブロックチェーン:暗号通貨を支える技術

ビットコインとブロックチェーン:暗号通貨を支える技術

BitcoinCoreを使ってみる
さて,本記事の主題はBTCについてではなく,ブロックチェーンについてでした.ブロックチェーン技術を提供する基盤(ブロックチェーン基盤)としては上記に書いた通り,BitcoinCoreやEthereumが有名です.BitcoinCoreはBTCクライアントのリファレンス実装で,Ethereumは分散アプリケーションプラットフォームです.承認方法がProof of Workであることやパプリック型ブロックチェーンであることから,(私の中の感覚では),両者は似ていると思います.今回はBitcoinCoreを使ってローカル内にテストネット*4を構築し,送金やマイニングを行います.Ethereumやスマートコントラクトについては次回以降の記事に書いていきます.

実行環境は以下の通りです.

$cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"
$uname -mr
Linux 3.13.0-100-generic x86_64

環境構築の詳細については割愛します.以下のリンクを参考に構築しました.
http://fintechjapan.jp/articles/tec_bitcoind001.html
まず,bitcoindデーモンを起動します.
$bitcoind -regtest -daemon
次にブロック生成によって報酬を貰い,送金用のコインを獲得します.今回は適当に500ブロック生成したことにします.
$bitcoin-cli -regtest generate 500
現在の残高を確認します.ブロックを生成した報酬として12462.5BTC獲得しています.この記事を書いている2016年12月17日時点では,1BTC=93708.32 JPYとなっていますので1167839938円,およそ11億円獲得しました.すごい.

$bitcoin-cli -regtest getbalance
12462.50000000

次にアカウントを作成し,そのアカウントに対してコインを送金を行います.今回は適当に100BTC送金します.

$bitcoin-cli -regtest getnewaddress epcnt19
n3XV7ngar6RqTT7niZCn1UbmuyVfukXCXo
$bitcoin-cli -regtest sendtoaddress n3XV7ngar6RqTT7niZCn1UbmuyVfukXCXo 100
d064cb4c3ed9bcfd73b5922224a4ada9f0afd6ca4822787e7910969980e35813

この時点ではまだ送金処理は完了していません.なぜなら,マイニングによる承認がなされていないからです.マイニングを行い処理を確定させます.

$bitcoin-cli -regtest generate 1
[
  "2bc00687f82dfd2ca2edb12e3b04b3d41d833901f923807415d1a314978d70e6"
]

これでブロックが生成されたので,「アカウントepcnt19に100BTC送金する」というトランザクションが承認されたはずです.

$bitcoin-cli -regtest getbalance epcnt19
100.0000000

これで私(epcnt19)は100BTC,およそ900万円手に入れました.

おわりに
ブロックチェーンについて書くはずが,いつのまにかBTCについての話になってしまいました.ブロックチェーンの発祥はBTCですが,現在は色々なところでブロックチェーンの適応実験が行われているそうです.スマートコントラクトの話は次回以降の記事に書くことにします.これらの話が入ってくると,ブロックチェーンの本質が見えてくるはずです.ちなみに偉そうに記事を書いていますが,私はBTCのアカウントを持っていません.ただ,BTCの自動売買プログラムが今非常に面白いと感じていて,近いうちに始めたいと思っています.

明後日はCanninet_onlineさん(id:Canninet)による,「戦車日記 序章」です.

参考

ビットコイン 日本円(BTC JPY) コンバータ-Investing.com
NTT DATA BLOCKCHAIN INNOVATION|NTTデータ
bitcoin-cliを使ったBitcoinAPI入門 - Qiita
Bitcoinプログラミングの入り口 – blockchain

*1:Peer to Peerの略.主な種類として,ノード探索時に管理サーバに問い合わせるハイブリッドP2P方式と,探索自体も分散的に行うピュアP2P方式がある.

*2:Proof of Work(PoW)やPBFTが有名

*3:ビットコインの発明者.名前は日本人だが偽名であるとの見方が強い.実際の正体は不明.

*4:これをRegtestモードという