卒論から始まるBlockchain

卒論から始まるBlockchain

俺の屍を越えて行け

新品Macにbitcoindを入れて、testnetに繋いでみよう

ひっっっさしぶりの投稿です。まあ寛容に見てください。

最近パソコンをMacに変更しました。(実際は会社から支給されたため。本っっっ当にありがとうございます)長年windowsを触っていた弊害で、悪戦苦闘する場面もありますがなんとかやっております。

さて、Macに変更したので新たにbitcoindを入れ直すのですが、せっかくなのでその手順をここに記しておきます。ほぼ新品状態(このブログ前に必要最低限のプログラムは入れたので)からbitcoindを入れていきたいと思います。

windowsの時もかーーーーなり苦労して入れたのですが、今回もそれなりに労力を費やしました。これからBitcoinを触ってみよう!!という方のお力になれれば幸いです( ´∀`)

ちなみに今回参考にしたのは以下のブログです。途中経過とかどうでもいいので、さっさとやり方教えてください、みたいな人はこれを見た方が早いです(´・_・`)

block-chain.jp

 

今回のPC情報

PC:Macbook Pro

メモリ:16G

OS:macOS 10.14.1

 

事前準備

以下が必要みたいです。事前にインストールしましょう。

インストール、の前に

インストールの前に、以下のコマンドをターミナルに入力(先頭の$は必要ないよ)

$ brew install autoconf automake libtool berkeley-db4 boost miniupnpc openssl pkg-config protobuf qt 

 すると、

$ brew install autoconf automake libtool berkeley-db4 boost miniupnpc openssl pkg-config protobuf qt

touch: /usr/local/Homebrew/.git/FETCH_HEAD: Permission denied

touch: /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/FETCH_HEAD: Permission denied

fatal: Unable to create '/usr/local/Homebrew/.git/index.lock': Permission denied

error: could not lock config file .git/config: Permission denied

Cannot rebase: You have unstaged changes.

Please commit or stash them.

Warning: berkeley-db@4 4.8.30 is already installed and up-to-date

To reinstall 4.8.30, run `brew reinstall berkeley-db@4`

Warning: boost 1.67.0_1 is already installed and up-to-date

To reinstall 1.67.0_1, run `brew reinstall boost`

Warning: miniupnpc 2.1 is already installed and up-to-date

To reinstall 2.1, run `brew reinstall miniupnpc`

Warning: openssl 1.0.2p is already installed and up-to-date

To reinstall 1.0.2p, run `brew reinstall openssl`

Error: Permission denied @ dir_s_mkdir - /usr/local/Cellar/openssl/1.0.2p/.d20181102-4907-1dbez7v

はい、エラー。幸先いいですね( *`ω´)

とりあえずググってみるとこんなのが出てきました。(Can not install/upgrade formulae cause openssl is outdated · Issue #3431 · Homebrew/brew · GitHub

よくわからないけど、

$ sudo chown -R $(whoami) /usr/local/*

これやったら解決するよ!みたいな感じで終わってるのでとりあえずやってみましょう。終わったらbrew doctorで確認してみます。

$ brew doctor

Your system is ready to brew.

が出てきたので大丈夫っぽいです。(もしこれでYour system is ready to brew.以外の文面が出てきたら、エラーということです。ググりまくって解決しましょう!)ということでもう一度やってみましょう。

$ brew install autoconf automake libtool berkeley-db4 boost miniupnpc openssl pkg-config protobuf qt

Updating Homebrew... 以下長いので省略

できた!!でも最後に

See: https://docs.brew.sh/Homebrew-and-Python

==> protobuf

Editor support and examples have been installed to:

  /usr/local/opt/protobuf/share/doc/protobuf

==> qt

We agreed to the Qt open source license for you.

If this is unacceptable you should uninstall.

 

qt is keg-only, which means it was not symlinked into /usr/local,

because Qt 5 has CMake issues when linked.

 

If you need to have qt first in your PATH run:

  echo 'export PATH="/usr/local/opt/qt/bin:$PATH"' >> ~/.bash_profile

 

For compilers to find qt you may need to set:

  export LDFLAGS="-L/usr/local/opt/qt/lib"

  export CPPFLAGS="-I/usr/local/opt/qt/include"

 

For pkg-config to find qt you may need to set:

  export PKG_CONFIG_PATH="/usr/local/opt/qt/lib/pkgconfig"

とか出てきました。まあエラーじゃないし、使い方によってはPATH通せよ?みたいな感じ(多分)なので無視。

続いて一旦opensslのバージョンを見てみます。

$ openssl version

OpenSSL 1.0.1f 6 Jan 2014

見たいのが正常らしいけど、出てきたのはこちら

$ openssl version
LibreSSL 2.2.7

!!??何これ?なんか違う!

ただダメな場合は以下を打つらしいのでやってみます。

brew link openssl --force

そしたらこのブログに書かれているようなエラーが出現。macOS High Sierra(OSX)のOpenSSLをデフォルトのLibreSSLからOpenSSLに変更する - Qiita

でも、出てきたエラー文にも書いてあるように

echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile

とやるだけらしいので

$ echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile

を入力。一回ターミナルを閉じて、もう一度開きopenssl version を入力すると

$ openssl version

OpenSSL 1.0.2p  14 Aug 2018

ふむ。まあ正常と言われているやつと微妙に違う気がするけど、気にせず進みます。

 

インストール

$ git clone https://github.com/bitcoin/bitcoin.git

$ cd bitcoin

$ ./autogen.sh
$./configure
$ make

$ make check
$ make install

途中の./autogen.shでエラーが出る場合は必要なものが入っていないなどだと思うので、エラーに従って入れてください。またmakeも足りないものがあると途中で止まってエラーを吐き出します。それも同様にエラーに従って必要なものをインストールしてからmakeをすれば、途中から自動でビルドしてくれます。makeは20分ぐらいかかるので気長に待ちましょう。(自分は15分ぐらいだった気がする)

※追記:2018/11/07

こんな裏技あるみたいです。

f:id:mochi-mochi-0397:20181107125700p:plain

一連の流れが終わったら、ちゃんとダウンロードされているか見てみましょう。

$ which bitcoind

/usr/local/bin/bitcoind

$ which bitcoin-cli

/usr/local/bin/bitcoin-cli

と表示されたら大丈夫です。

 

Bitcoindを起動してみよう

$ bitcoind

を入力して起動してみます。

すると猛烈に動き始めます。これはメインチェーンのブロックをダウンロードしているからで、このままだと450GBほどメモリを食います。まあ、フルノードで俺は行くぜ!!という方は止めませんが、今回はテストネットでいきますので、止めます。

一旦新しいターミナルを開き、$bitcoin-cli stopで終了します。

$ bitcoin-cli stop

Bitcoin server stopping

 

testnetに繋いでみよう

Bitcoinには、3つのネットワークが用意されています。

  • メインネット …… 本番用ネットワーク(パブリック)
  • テストネット …… 開発用ネットワーク(パブリック)
  • regtest …… 開発用ネットワーク(プライベート)。マイニングなどの機能が試せる

また、ここからは以下のものを参考に進めました。

coin-wave.com

テストネットに繋ぐにはbitcoin.confというファイルをいじればいいのですが、これはLibrary/Application\ Support/Bitcoin/ にあるようです。なので以下のコマンドで移動し、中身を書き換えます。

$ cd Library/Application\ Support/Bitcoin/

$ ls    #bitcoin.confがあるか確認

$ vim bitcoin.conf

最後のコマンドを入力するとvim(ヴィム)というテキストエディターが開きます。開いたら、iを押して編集可能にし、以下を書き込みます。

testnet=3

txindex=1

server=1

rest=1

rpcuser=<ユーザー名>

rpcpassword=<パスワード>

rpcport=18332

 

書き終えたらexitを押し:wqを押してvimを終了します。

 

Bitcoin Coreを起動してみよう

早速アプリケーションにあるBitcoin Coreを起動してみましょう!

f:id:mochi-mochi-0397:20181103005239p:plain

f:id:mochi-mochi-0397:20181103005340p:plain

ビットコインマークが緑色で、上のバーがBitcoin Core [testnet]となっていれば成功です!

 

まとめ

長い・ややこしい・分かりづらいの三拍子が見事に揃っており、何度ベットに逃げ込み、Youtubeを見始めたか分かりません。(言い訳)

また、学校のパソコンでやるとBitcoin のポート番号が禁止されているのか、ダウンロードできてもピアと接続できませんでした。学生の方はポートを開けてもらうか、学外ネットワークでやるしかないと思います。

改めてGoogle Playからダウンロードするぐらいの軽いノリで出来るようになるのを願うばかりです(´・ω・) 

 

//Macbook Proになったおかげで今まででは考えられないスピードでAndroid Studioが動きます。こういうのはケチってはいけないと身にしみました(´・∀・`)

 

参考資料

Gitの使い方】GitをMacにインストールする方法! | オリジナルゲーム.com

Xcode をインストールする、 iOSアプリ作成準備

Can not install/upgrade formulae cause openssl is outdated · Issue #3431 · Homebrew/brew · GitHub

Mac OS X で bitcoind をコンパイル、インストールする方法 | block-chain.jp

macOS High Sierra(OSX)のOpenSSLをデフォルトのLibreSSLからOpenSSLに変更する - Qiita

Bitcoin Coreをテスト環境で導入しよう

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

ブロックチェーン・プログラミング 仮想通貨入門 (KS情報科学専門書)

 

Hyperledger プロジェクトについて調べてみた

はじめに

ごめんなさい。

ということで久しぶりの投稿は謝罪からです。なんでこんなに間が空いたかって?? 

サボってたからです!!(開き直り)

 

 前回まではひたすらブロックチェーンの基礎を説明していました。ただいつまでもそこばっかりやっても面白くないので、今回はブロックチェーンプロジェクトの実例を一つ紹介していきたいと思います。それは

「Hyperledger プロジェクト」

です。読み方は「ハイパーレジャー 」です。最近子供たちの間で大人気の戦隊シリーズの名前・・・ではありません。ちゃんとしたブロックチェーンプロジェクトの名前です。

ではくだらない前置きはこのぐらいにして、早速進みましょう!

 

※なぜこれを取り上げるかというと、最近大学でHyperledger Fabricの講演をしていただいたからです。本当はHyperledger Fabricの話を書こうと思ったんですが、Hyperledgerだけでも記事が書けそうだと思ったので書くことにしましたHyperledger Fabricの話はまた今度書きます。

 

Heyperledgerとは

 2015年12月17日、米国のThe Linux Foundation(LF)が発表した「Hyperledgerプロジェクト」により作成されたものになります。これはブロックチェーン技術の普及に向けた、共同研究プロジェクトになります。

 開発は一応オープンソースで開発されていますが、目指しているのは特定の業界や企業間でのブロックチェーンネットワークの構築になります。そのため、BitcoinやEthereumのようなパブリック型ではなく、コンソーシアム型のブロックチェーンプロジェクトがほとんどになります。(これからパブリック型のプロジェクトが出てくるという可能性の意味を込めて)よって流通や貿易、金融などの幅広い産業で「現実的に」使えることが予想されます。

 さらに特徴の一つとして、Bitcoinのビットコインや、Ethereumのイーサのような内部通貨がない点が挙げられます。(もちろん作ろうと思えば作れる。また、テスト用通貨が用意されているものもある)これはコンソーシアム型ブロックチェーンのため、パブリック型のようなインセンティブ、もしくは不正をするコストを考慮していないためだと思われます。

 参加企業としてはIBMIntelアクセンチュア、日立、富士通などの大企業が参加しています。全体では150以上の企業がこのプロジェクトに参加しています。

f:id:mochi-mochi-0397:20180813182250p:plain

出典:https://www.hyperledger.org/members

 

 ご覧の通り名だたる企業が参加していますね。全体的には米・中の企業が多めな感じがします。

メンバーにはプレミアム会員(Premier Member)・一般会員(General Member)・準会員(Associate Menber)の3つの会員があるようです。

もちろん各メンバーごとにそれぞれ特権?のようなものがありますが、開発自体はオープンソースであるため、メンバーにならなくても意見などは自由に発言できます。

 

 ちなみにメンバーになるには以下のような会費が必要です。一番上のプレミアム会員になるためには$250,000(USD)。つまり日本円にして最低約2800万!!(2018/08/14)ヤバすぎ...。

f:id:mochi-mochi-0397:20180814182524p:plain

出典:https://www.hyperledger.org/members/join

 

 

派生プロジェクト・ツール

 ここまで概要を見てきましたが、実際に走っているプロジェクト・ツールそれぞれ5個です。中でもHyperledger FabricはIBMが発起したプロジェクトでコンソーシアム型ブロックチェーンとしては一番有名?ではないでしょうか。またHyperledger Irohaは、ソラミツ株式会社という日本の会社が発起したプロジェクトになります。最近だとカンボジア政府と共同開発するということで話題にもなりました。数少ない日本初のブロックチェーンプロジェクトですので、是非頑張ってほしいですね(*´▽`*)

 

プロジェクト

ツール

 

まとめ

 個人的にBitcoinやEtereum、Nemなどのブロックチェーンに触れる、もしくは情報を目にする機会が多いので、案外Hypereledgerも開発が進んでるんだと知りビックリしました(笑)

後は個人もコミュニティに入れるとか・オープンソースで開発が進んでいるなども今回初めて知ったので面白かったです。(企業の人しか入れない&そうなると必然的にクローズドに開発が行われるているんだろうな、と勝手に思っていた)

気になる方は各プロジェクトのリンクを張っていますので、そちらから詳しい情報を得るといいと思います。

 

では今回はここまでです!ここまでお読みいただきありがとうございました!!

何か不備、ご意見ありましたらコメントいただけると幸いですm(_ _)m

 

//Hypereledger?パブリックじゃねえんだろ?そんなもんブロックチェーンじゃねえ!!とか少し思っていた部分もあったので頭を冷やすいい機会になりました(笑)ビジネス利用するならやっぱりコンソーシアム型なのかなぁ、と考え始めた今日この頃です(-ω-)

 

参考資料

日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう⑦最終回 ~ データ同一性&まとめ編 ~

前回までのおさらい

2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」

出典:「ブロックチェーンの定義」を公開しました | JBA

 前回は太字の部分のみを解説しました。まずは可用性について触れ、高可用性を説明しました。可用性とは「システムが壊れていない状態がどれだけ維持されているか」を示す指標の事(≒稼働率)でした。なので高可用性とは、高確率でシステムが壊れていない状態がどれだけ維持されているかの指標でした。

じゃあどのくらいが高いかの指標は以下の表のようになっていることになります。

Availabilityレベル   Availabilityクラス  年間ダウンタイム 
100% 連続処理 0分
99.999%  フォールトトレラント 5分
99.99%   フォールトレジリエント   53分
99.9%   ハイアベイラビリティ 8.8時間
99-99.5% 一般の商用 44~87時間

HAシステム(1) - 高可用性システムとクラスタリング

 

そのうえでまた一つ読み進めていきたいと思います。

2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」

出典:「ブロックチェーンの定義」を公開しました | JBA

 ついに最後になります。いやー、長かった。本当に。

 

データ同一性

  そのデータは間違いない?改竄されていない?みんな同じデータになってる?ってことです。じゃあどうやってそれをするか。特別なプロトコル電子署名ハッシュポインタデータ構造などなどさまざまな技術を用いて実現しています。そして、それらを用いて高可用性・データ同一性を実現する技術を「ブロックチェーン」と読んでいるんですね。

 

f:id:mochi-mochi-0397:20180718151039p:plain

 

いやー、終わった終わった。今日はうまい酒が飲めそうだぜ!!って思うのは早いです。実はこの定義の下には以下のような文章が書いてあります。 

定義策定のアプローチ

まず、Satoshi Nakamoto論文およびその実装である、ビットコインブロックチェーンをオリジナルのブロックチェーン(以下「オリジナル」)として強く意識しています。

狭義のブロックチェーン(定義1)は、オリジナルを意識し、それが備える本質的で不可分な特徴を捉え、言語化しました。

広義のブロックチェーン(定義2)は、昨今〜今後の技術の展開を鑑み、オリジナルが備える特徴であっても、別の実装方式や別の目的への展開などにおいて、置換や変化が行われていく広がりを許容しながらも、特徴を捉えられるよう、言語化しました。

今後について

今回公開する定義は、現在時点の見解であると考えており、今後もアップデートが必要であると考えています。また、引き続き、ブロックチェーンに関する用語解説を策定していく予定です。

出典:「ブロックチェーンの定義」を公開しました | JBA

 

広義・狭義のブロックチェーン

 何となくお忘れかもしれませんが、この定義は1)、2)がありました。ブロックチェーンで色々調べてみると、本当に様々な見解や説明が書かれています。そうなると自分も思いますし、周りからもあることを言われます。

ブロックチェーンってなに??」

 この素朴な疑問への一つの解として1)をオリジナル=ビットコインとして「狭義ブロックチェーン」、2)を「広義ブロックチェーン」として定義されたということになります。

じゃあ広義のブロックチェーンって何になるかというと以下の表が非常にわかりやすくまとまっていました。ビットコインも入っているので、狭義も含んでますね)

 

f:id:mochi-mochi-0397:20180718143135p:plain出典:ビットコイン研究所ブログ(http://doublehash.me/blockchain-difinition/

 ここでは細かい説明はしません。何となくこれだけ多くの分類が出来るんだな、と思っていただければ十分です。

 

まとめ

1)「ビザンチン障害を含む不特定多数のノードを用い、時間の経過とともにその時点の合意が覆る確率が0へ収束するプロトコル、またはその実装をブロックチェーンと呼ぶ。」

2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」

定義策定のアプローチ

まず、Satoshi Nakamoto論文およびその実装である、ビットコインブロックチェーンをオリジナルのブロックチェーン(以下「オリジナル」)として強く意識しています。

狭義のブロックチェーン(定義1)は、オリジナルを意識し、それが備える本質的で不可分な特徴を捉え、言語化しました。

広義のブロックチェーン(定義2)は、昨今〜今後の技術の展開を鑑み、オリジナルが備える特徴であっても、別の実装方式や別の目的への展開などにおいて、置換や変化が行われていく広がりを許容しながらも、特徴を捉えられるよう、言語化しました。

今後について

今回公開する定義は、現在時点の見解であると考えており、今後もアップデートが必要であると考えています。また、引き続き、ブロックチェーンに関する用語解説を策定していく予定です。

出典:「ブロックチェーンの定義」を公開しました | JBA

 全7回に渡って説明することになった「日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう」ですがいかがだったでしょうか。以上の文を見て、ふむふむなるほどねと1mmでも思ってくれたのならこれほどうれしいことはありません。

 また、今後についてと書かれているように、この定義はアップデートされていくはずですし、するべきだと思います。その時はまたこのブログで書いていけたらとも思います。

では今日はここまでです。ここまで読んで頂きありがとうございました!

何か不備等ありましたらご指摘いただけると幸いです。

 

参考資料

「ブロックチェーンの定義」を公開しました | JBA

なんでもかんでもブロックチェーン?何をもってブロックチェーン?ブロックチェーンの用語の混乱を整理してみる(議論たたき台) | ビットコイン研究所

日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう⑥ ~ 高可用性編 ~

前回までのおさらい

2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」

出典:「ブロックチェーンの定義」を公開しました | JBA

 前回は太字の部分のみを解説しました。電子署名とハッシュポインタを使うことで、「改竄検出が容易なデータ構造」を実現しています。またそれをみんながみんなのデータを持っている(=当該データをネットワーク上に分散する多数のノードに保持させる)ことで改竄を防ぎ、もし起きてもそれが容易に検出できるように設計されていると説明しました。

f:id:mochi-mochi-0397:20180703123304p:plain

 

そのうえでまた一つ読み進めていきたいと思います。

2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」

出典:「ブロックチェーンの定義」を公開しました | JBA

ということで今回は太字の部分ですね。今回は前回のようにちゃっちゃっと進みます!とはなりません。だって見てください。コウ・・・カヨウセイ?

思わずカタカナになってしまうぐらい難しそうな言葉。もう・・・いや。

 

可用性Availability

 本題に入る前に、まずは最初の一文字を消した「可用性」ついて理解していきましょう。簡単に言えば「システムが壊れていない状態がどれだけ維持されているか」を示す指標の事です。そのため可用性=稼働率、として説明されることもあります。

 

f:id:mochi-mochi-0397:20180710131939p:plain

 

 

システムは銀行のATMでも、インターネットでも何でもいいです。ちなみにJISでは以下のように定義されています。

許可されたエンティティが要求したときに,アクセス及び仕様が可能である特性。

JIS Q 27000:2014 情報技術−セキュリティ技術−情報セキュリティマネジメントシステム−用語

  さらに、稼働率は以下の式で表されます。

稼働率 = 総稼働時間/総時間

 この稼働率が1に近くなるほど可用性が高く、0に近いほど可用性が低いということになります。正し、あらかじめ設定されたメンテナンスなどは故障には含みません。あくまで災害やサイバー攻撃、バグなどの想定外の故障になります。

 

f:id:mochi-mochi-0397:20180710135548p:plain

 

高可用性(High Availability

 まあここまでくれば「高可用性」の意味も何となく察しがつくのではないでしょうか。可用性が高いこと。つまり高確率で、システムが壊れていない状態がどれだけ維持されているか、もしくは稼働率が1に近いことになります。

じゃあその高い確率とはどのくらいでしょうか? 80%? 90%? 人によってそれぞれだよ!となりそうではありますが、一応指針目安として以下のようになっているようです。以下の表は任意のシステムを1年間休まず動かした場合になります。 

Availabilityレベル   Availabilityクラス  年間ダウンタイム 
100% 連続処理 0分
99.999%  フォールトトレラント 5分
99.99%   フォールトレジリエント   53分
99.9%   ハイアベイラビリティ 8.8時間
99-99.5% 一般の商用 44~87時間

HAシステム(1) - 高可用性システムとクラスタリング

...99.9%!たっっっか!!!っていうのが個人的な感想ではあります(笑)まあATMとかSNSとかを想像したとき、年間で約8.8時間(一回でというわけではない)も止まったら困りますよね。それでも99.9%なんですから、システム作るってのは大変なんですね・・・・。 

 

まとめ

2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」

出典:「ブロックチェーンの定義」を公開しました | JBA

  高可用性とは、とにかく止まらない!ずっと稼働している!ということです。で、ブロックチェーンはそれを満たすような仕組みであるこということですね。

 

参考資料

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

ビジネスITと継続について考える

HA(高可用性)とは - IT用語辞典

JIS X 0014:1999 情報処理用語—信頼性,保守性及び可用性

わかりやすい組込みシステム構築技法 ハードウェア編

日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう⑤ ~ 改竄検出編 ~

前回までのおさらい

2)「電子署名ハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」

出典:「ブロックチェーンの定義」を公開しました | JBA

前回は太字の部分のみを説明しました。ハッシュポインタとは、ハッシュ関数から得られるハッシュ値を隣のブロックのポインタとして使うことで、ブロック(データ)ごとの繋がりを作っています。そのために以下のような要件を満たす、暗号学的ハッシュ関数も含めて説明しました。

  • どんな入力にも固定長の値を出力
  • 同じ入力には同じ出力
  • 一方向性(原像計算困難性)
  • 第2原像計算困難性
  • 衝突困難性

これにより、ハッシュ値は少しでも入力が違うと出力結果が全く違うものになる&どんな入力を入れても固定長の出力が得られことになります。

 そして、このような特性を持つハッシュ関数を用いることで隣のブロックを指し示す(=ポインタ)ことをしていますと説明しました。

f:id:mochi-mochi-0397:20180703123324p:plain

 

そのうえでまた一つ読み進めていきたいと思います。

2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」

出典:「ブロックチェーンの定義」を公開しました | JBA

ということで今回は太字の部分ですね。今日は前回、前々回と違い、ちゃっちゃっと進みます!...たぶん

 

みんながみんなのデータを持っている

 このブログで口うるさいほど言っているセリフがあります。それが「みんながみんなのデータを持っている」というものです。これを小難し言葉で表現しているのが「当該データをネットワーク上に分散する多数のノードに保持させる」というものです。

 当該データはブロックチェーンに保存している何等かのデータになります。仮想通貨のような金銭データかもしれないし、公文章や生体データかもしれません。データの種類はここでは説いていません。また、ノードは連載一回目の記事で軽く説明しましたが、ネットワークに参加しているコンピューターやプログラムをさします。ここではネットワーク=ブロックチェーンになりますね。

 

改竄検出

 以上のものが成り立つ理由も説明してきたのでここではあえて触れません。前回、前々回は少し技術的な話だったのでどうしても小難しい感じになりましたが、それは「改竄検出」を説明するためにしました。

 電子署名は、署名者が間違いなく署名したことを証明する技術でした。ハッシュポインタは、隣のブロックを繋げる役割として働いていました。署名者しか知らない秘密鍵を用いることでデータの正当性を証明し、少しでも入力が違うと出力結果が全く違うものになる&どんな入力を入れても固定長の出力が得られるというハッシュ関数の特性を活かしたものでした。

 これにより、みんなが好き勝手にみんなのデータを持っていたり、好き勝手に改竄することを防いでいます。もちろんそんな無法状態だったら、そもそも一つに合意できません。ただこれがもし改竄された時、分かりづらくては困ります。なぜなら改竄検出を何度も何度もチェックするのは大変ですよね。刻一刻とブロックが積みあがっていく中で、チェックにそう時間をかけられません。

 

f:id:mochi-mochi-0397:20180702181153p:plain

なので出来るだけ簡単にチェックできなければなりません。それを実現するために外せない技術が電子署名とハッシュポインタ(もちろんこれだけではない)になるということです。

 

f:id:mochi-mochi-0397:20180703123304p:plain

 ただブロックに取り組む前に正当なデータであるかをチェックしてブロックに取り込んでいます。ですので、ブロックに取り込む(=データの合意)後ではなく、前に行われる場合の方が多いかもしれません。ただし、現在はブロックに取り組まれた後に改竄 or 不正なデータが発覚した場合にも対処できるようにしようという動きもあります。

 

まとめ

2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」

出典:「ブロックチェーンの定義」を公開しました | JBA

  電子署名もハッシュポインタも、数学的に逆算が非常に大変という特性を持つことで改竄を防ぎ、もし起きても検出が用意になるように設計されています。さらに、多くのノードで成り立つ(具体的な数値は不明)ネットワーク状態だということですね。

 

今回もここまでお読みいただきありがとうございます!何かご意見ご指摘等ありましたらコメントいただけると幸いです。

 

参考資料

日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう④ ~ ハッシュポインタ編 ~

前回までのおさらい

2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」

出典:「ブロックチェーンの定義」を公開しました | JBA

前回(日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう③ ~ 電子署名編 ~ - 卒論から始まるBlockchain)はこの太字の部分だけを解説しました。例として以下のものを考えながら説明しました。

 アリスがボブに10BTC送る状況を考るとき、超大まかなステップは以下のようになります。

  1. 「アリスからボブに10BTC送る」という取引内容をアリスがネットワークに知らせる。
  2. 取引内容に問題がないかみんなで検証する。
  3. 正しければ約束事(コンセンサスアルゴリズム)に沿って合意し、ブロックを繋げる。

 この時の取引内容は本当にアリスがネットワークに知らせた(発行した)のかを証明する技術になると説明しました。

  1. アリスしか知らない秘密鍵で署名を作る
  2. ネットワーク上に公開鍵とともに公開
  3. 各ノードが公開された署名と公開鍵を使って、それぞれが同じものかを検証する。同じであればアリスの正当な取引とする。

 

f:id:mochi-mochi-0397:20180625004101p:plain

 

 このようにアリスが秘密鍵と公開鍵を用いることで、その取引内容が間違いなくアリスが発行し、途中で改ざんされていないとい事を証明しているのでした。

 

そのうえでまた一つ読み進めていきたいと思います。

2)「電子署名ハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」

出典:「ブロックチェーンの定義」を公開しました | JBA

...ハッシュポインタ?もういい加減スラーっと進ませていただきたい。そう願うばかりですね(´・ω・)

 

ハッシュ関数

 ハッシュポインタを説明する前にいくつか前提知識が必要そうです。それが、ハッシュポインタのハッシュの部分。こいつです。おそらくハッシュ値のことを指していると考えられる(間違ってたらごめんなさい)ので、そこから説明します。

 皆さん、関数って覚えていますか?y=2x とか y=x+2 とかのあいつです。xに何かを入れるとyの値がわかります。つまり変数に任意の値を入力すると、それに対応して結果を出力します。 二次関数、指数関数、三角関数、etc...そんな中、本日ご紹介するのが「ハッシュ関数」でございます。そして、この関数から得られる値を「ハッシュ値」といいます。

この関数、とっても面白い性質を持っているんです。特に今回ご紹介するのは以下の2つです!!

  • どんな入力にも固定長の値を出力
  • 同じ入力には同じ出力

さらにブロックチェーンで求められるものはただのハッシュ関数ではありません。「暗号学的ハッシュ関数」です。以下のような安全性を満たすハッシュ関数がそう呼ばれることがあります。

  • 一方向性(原像計算困難性)
  • 第2原像計算困難性
  • 衝突困難性

...頑張ろう。

 

どんな入力にも固定長の値を出力

少し変な質問をします。

Q:y=x+2に適当な整数を入力すると、それに伴って出力の桁数はどうなりますか?

A:入力の値によって変化する。

何を当然なことを言っているんだと思われたかもしれません。でもハッシュ関数だとそうはいかないからこんな質問をしました。実際にビットコインで使われているSHA-256(シャ-ニゴロと呼びます)を例に見てみましょう。

入力:1

出力:6B86B273FF34FCE19D6B804EFF5A3F5747ADA4EAA22F1D49C01E52DDB7875B4B

 

入力:1234567890

出力:C775E7B757EDE630CD0AA1113BD102661AB38829CA52A6422AB782862F268646

出力は数字以外の文字も含まれていますが、そこは気にしないでください。今回大事なのは出力の長さです。1桁でも10桁でも全く同じ長さですね。もちろん嘘ではありません。試しにこちらで色々試してみてください。なんでそうなるかは置いといて(単に説明できないだけ)、必ず任意の固定長の出力をするように設計されています。

 

同じ入力には同じ出力

 当たり前だろ!って思った方が多いかもしれません。かくいう私もそう思いました。でも大事なので挙げました。これは言葉の通りです。特に説明はしません。

※先ほど挙げたサイトで例の入力をいれてみてください。同じものが出てくるはずです。ちなみに半角ですよ。

 

一方向性(原像計算困難性)

 ここからは暗号学的ハッシュ関数を満たすための3要素の説明になります。見るからにやばそうな名前がついていますが大丈夫です。案外見かけだけです。

まず一つ目の「一方向性(原像計算困難性)」という性質。簡単に言えば出力から入力を求めることは困難(やろうと思えばできなくはないが、現実的に無理)ということです。

例えば

4A44DC15364204A80FE80E9039455CC1608281820FE2B24F1E5233ADE6AF1DD5

という出力が得られた時、どんな値が入力されたかわかりますか?わからないですね。ではこれならどうでしょう。F5CA38F748A1D6EAF726B8A42FB575C3C71F1864A8143301782DE13DA2D9202B

やはりわかりませんね。(ちなみに答えは10と20です。わかったぜ!という方、おそらく人知を超えたと思われます。こんなブログ見てないで全人類のために何かしてください。お願いします。)

 正確に言うのであれば、出力されたh(m)から入力したmを求めることは非常に困難であるという性質です。

 

f:id:mochi-mochi-0397:20180621203905p:plain

 

第2原像計算困難性

 ある入力 mと、そのハッシュ値h(m)が与えられた時、同一のハッシュ値になる別の入力を計算することは困難であるという性質です。例えば先ほど10を入力したときのハッシュ値で考えた時、これと全く同じハッシュ値になる入力を見つけるのは非常に困難であることを指します。

 

f:id:mochi-mochi-0397:20180622001840p:plain

衝突困難性

同じハッシュ値h(m) をとるようなメッセージ(m,m') の組を一つでも見つけることは非常に困難という性質。先ほどの第2原像計算困難性と似ていますが別物です。

f:id:mochi-mochi-0397:20180622002017p:plain

 

とりあえずここまでだらだらと性質やら特徴やらを述べてきたわけですが、一番抑えておいていただきたいのは「少しでも入力が違うと出力結果が全く違うものになる&どんな入力を入れても固定長の出力が得られる」ということです。(じゃあ最初からそう言えというツッコミをしてはいけません)

 

ポインタ

 ここまでさんざんハッシュ関数ハッシュ値について説明してきましたが、ハッシュポインタの「ポインタ」部分の説明をしていきたいと思います。でもそう深堀はしません。

ここではデータ構造としてのポインタを指します。代表的なものはC言語になるかと思いますが、ここでは「何かを指し示してしている」という説明にとどめたいと思います。ですのでポインタとはデータの「何かを指し示している」ということだけを頭に入れてください。

 

ブロックチェーンでのポインタ

 先ほどポインタとは「何かを指し示している」と説明しました。ではブロックチェーンでは「何を」指し示しているのでしょうか。

それは「隣のブロック」です。ブロックチェーンはデータをつなぎ合わせています。でもこれは物理的につながっているのではありません。あくまでデータで繋がっているのです。

そしてデータを繋ぐ役割を担っているのがハッシュ値になります。(もちろんハッシュ値は他にも役割があります) ビットコインを例にしましょう。

ビットコインでは10分置きに新たなブロック(データ)ができます。この時、全取引内容をハッシュ関数に入力し、その出力をh(m)とします。そしてまた10分経ち、新たなブロックを作るとき先ほどのようにハッシュ値h(m')'を出力します。しかし、ここで一工夫。先ほど作ったh(m)を入力にいれてh(m')'を出力します。つまりh(h(m),m')'になります。つぎの10分が経ち新たなハッシュ値を出力します。その時も同じように今までできたハッシュ値を入力に入れて新たなハッシュ値を出力します。

 このようにブロック(データ)ごとにハッシュ値を作り、それが次のブロック(データ)とを繋げています。つまり次のブロックを指し示す役割になっています。(表現としては無理やりすぎるかな(;´・ω・))

 

f:id:mochi-mochi-0397:20180625005703p:plain

 

こうすることでそれぞれのブロックに対して繋がりができます。つまりハッシュ値を用いることで隣のブロックの場所を指し示す(ポインタ)ことができるのです。

 さらに先ほどのハッシュ値の特性から、各々のハッシュ値はほぼ雄一無二の値です。それぞれ偽装・改変することもほぼ不可能です。これがブロックごとの繋がりをより強固にしています。

 

まとめ

 ハッシュ値を隣のブロックのポインタとして使うことで、ブロック(データ)ごとの繋がりを作っています。これが「ハッシュポインタ」になります。

調べているとハッシュチェーンと紹介されていることが多いような気がしましたが、あくまでハッシュ値が各ブロックのアドレスを指し示すような役割であるということを強調したくてこの言葉を使ったのかなと解釈しています。(まちがっていたらごめんなさい)

 

というこで今回はここまでです!ここまでお読みただきありがとうございました!!

何かご意見ご指摘等ありましたらコメントいただけると幸いです。

 

参考資料

日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう③ ~ 電子署名編 ~

前回までのおさらい

1)「ビザンチン障害を含む不特定多数のノードを用い、時間の経過とともにその時点の合意が覆る確率が0へ収束するプロトコル、またはその実装をブロックチェーンと呼ぶ。」

出典:「ブロックチェーンの定義」を公開しましたJBA

 前回は太字部分を「ファイナリティーを確保する」という言葉に置き換えて説明しました。じゃあファイナリティーってなに?というのは以下のようなものを指しますとお話しました。

(1)受け取ったおかねが後になって紙くずになったり消えてしまったりしない、また決済方法について(2)行われた決済が後から絶対に取り消されない――そういう決済が「ファイナリティーのある決済」と呼ばれます。 

出典:第7章 決済の実行 : 日本銀行 Bank of Japan

ではなぜこれが定義の太字部分に関係あるかはブロックチェーンのある特徴に由来しますよ。それは「一定時間ごとにデータを繋げていく」、「より長くつながったデータを正しい合意とする」という二点によります(前回は説明を簡略化するためあえてこの二点に絞った)、と説明しました。

Q:ブロックチェーンは「どんな」データを合意しているのか?

A:ある計算を一番早く、正しくした者のデータをみんなで合意する(ビットコインの場合&データの中身についての話は省略)。そして、合意したブロックを一定時間ごとに繋げていく。

注意点

1:ある瞬間に、正しいデータが複数提案される(これをフォークといいます)ことがある。

2:その場合、より長くなった方を正しいデータとして合意し、繋げていく。短い方(その他のブロック)は無効になる。

f:id:mochi-mochi-0397:20180604165151p:plain

これによりブロックチェーンでは、一時期は正当な取引であると合意されていたものが時間が経つと無効になる、覆される可能性があります。だからブロックチェーンでは「一定時間」ごとにネットワークで合意されたデータを繋いでいき、それらが後で「無効・覆る可能性」が限りなく0に近くなっていく(0%にはならない)ことでデータの正当性を担保しています。と説明し、最後に(1)のまとめをして終わりました。

ブロックチェーンとは:応答を返さない、誤った応答を返す可能性がある不特定多数の参加者を含むネットワークにおいて、時間が経つにつれてその合意内容が覆される確率が限りなく0に近くなっていくプロトコル、実装のこと

 

 

ということで、今回から(2)の説明をしていきたいと思います。では改めて定義を見て見ましょう。

2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」

出典:「ブロックチェーンの定義」を公開しました | JBA

 

・・・まあ、なぞだよね。画面たたき割りたくなるよね。だって最初の一語「電子署名」がわからんもん。

定義だからしょうがない?うるせぇ!もっとわかりやすく言えねえのかよ!

そんな方々のために、私頑張りたいと思います。

 

署名とは

 そもそも署名とは何でしょうか。Google先生に聞くと、以下のような文が見つかりました。

行為者の同一性を示し、行為者の責任を明らかにするために行為者が自己の氏名を手書き(自署)すること。

出典:日本大百科事典(全書)、署名とは - コトバンク

 これは間違いなく私(署名者)が行った・確認したものですよ。ということを証明するものなどで使われるものです。ここでは手書き(自書)と書かれていますが、ネットの世界にも証明しなくてはならない事があります。そして、ブロックチェーンにも必然的にあるわけです。

では一体どんな場面でそれは必要になってくるのでしょうか。ここではビットコインを例に説明していきます。

 

ブロックチェーンで必要な署名とは

 アリスがボブに10BTC送る状況を考るとき、超大まかなステップは以下のようになります。

  1. 「アリスからボブに10BTC送る」という取引内容をアリスがネットワークに知らせる。
  2. 取引内容に問題がないかみんなで検証する。
  3. 正しければ約束事(コンセンサスアルゴリズム)に沿って合意し、ブロックを繋げる。

※今回は電子署名の話だけしたいので、色々省略してます。ごめんなさい。

※アリスとボブは暗号学などでよく出てくるので使っています。特に意味はないです

※BTC:ビットコインの略

 ここで問題です。1.「アリスからボブに10BTC送る」という取引内容をアリスがネットワークに知らせる、と書きました。では、この取引内容は本当にアリスがネットワークに知らせた(発行した)のでしょうか?

もしかしたらボブが勝手に発行したのかもしれません。もしくはネットワーク全体に知らせる途中で、誰かが取引内容を改ざんしているかもしれません(本当は10BTCではなく1BTCだったなど)。でもそんなことはありません!確実にアリスが発信したものです!取引内容にも間違いありません!!という確証を得るにはどうすればいいのでしょうか。

 これこそがブロックチェーンで必要な署名です。そして、こんな時に使われるものが「電子署名(デジタル署名)」です。

※他にも確認しなければならないことは多くあります。しかし、今回は説明簡略化のために絞っています。ご理解ください。

※赤文字は修正した部分です。大事な部分を赤にしているわけではありません。

 

電子署名とは

 この電子署名をするために、アリスやその他のノードはどのような動きをするのか、超簡単にまとめてみます。

<アリス>

  1. 秘密鍵・公開鍵という二つのカギを用意します。
  2. 証明したい取引内容を、秘密鍵署名(暗号化)します。
  3. 公開鍵と、暗号化していない元の情報(取引内容)に署名を添付したものをネットワークに公開する。

暗号化していない元の情報=平文。暗号化した情報=暗号文といいます。以下それぞれを、平文・暗号文と表記。

 

f:id:mochi-mochi-0397:20180613004157p:plain

 

<その他のノード>

  1. アリスが公開した公開鍵を使って、(暗号化した取引内容を元に戻す(以下、復号と表記)。)署名検証する。
  2. (復号したものと、平文を比べる。同じであれば、)署名検証が正しければアリスが本当に署名したものと判断。違っていれば正しい署名がなされていないと判断し、その取引は無視。

 

f:id:mochi-mochi-0397:20180613004420p:plain

 

では要点を絞って説明していきます。

 

秘密鍵・公開鍵

最初にアリス(署名者)は以下の二つの鍵を用意します。

秘密鍵:アリス(署名者)だけが知る鍵。誰にも知らせてはいけない。

公開鍵:(今回は)署名検証(平文を復号化)するための鍵。ネットワーク上に公開するため誰でも知っている。

 

 おそらく理解しがたいのは公開鍵ではないでしょうか。特にネットワーク上に公開するという点。鍵なのに公開していいの!?と思うかもしれませんが、大丈夫です。

何故なら公開鍵から秘密鍵を知ることは実質不可能だからです。ここで「実質」とつけているのには訳があります。というのも、現在の暗号技術は数学的計算量によって担保されたものを使用しています。つまり、計算すればいつかは暗号が解読できるかもしれないが、それは何万年、何十万年かければ解けるよ、ということです。一つの暗号解読にそれだけの年月がかかるならば、それは実質解読不可能と考えられます。この先に出てくる「実質」も同じ意味です。

※次回のハッシュの話をするので、その時に詳しく説明するかも?

f:id:mochi-mochi-0397:20180612002240p:plain

 次いで重要なポイントは秘密鍵は文字通り「秘密」にしなければなりません。これを知られたら、ほかの人々はいつでもアリスに成り代わることが出来てしまいます。しかもそれはネットワーク上では本物のアリスとして完全に認められてしまいます。その為、秘密鍵は絶対に知られてはいけません。絶対にですよ!!

 また、電子署名では秘密鍵を用いて署名(平文を暗号化)します。この署名(この暗号文)はもちろんアリス(署名者)以外は実質解読することができません。

そして、この署名(暗号文)はアリスの秘密鍵からしか作れません。大事なのでもう一度いいます。この署名(暗号文)はアリスの秘密鍵からし作れません。

これが後々、署名として活きてきます。

 

 署名検証

 その他のノードは、アリスの公開鍵を用いて署名検証暗号文を解読)します。そして同じくアリスが公開した署名平文)とを比べます。そこで、両者が一致していればアリスが署名したもの、つまりは正当な発起人が出した情報だと確認できます。

 でもなぜそんなことが言えるのでしょうか。先ほどの一文を覚えていますか?「この署名暗号文)はアリスの秘密鍵からしか作れません。」といいました。

 つまり、公開された署名暗号文)を作れるのは全世界で秘密鍵を持っている者のみ。今回でいうアリス本人でしかありえないということになります。

 これでアリスが本当に署名をしたと確認することができます。

 

f:id:mochi-mochi-0397:20180613004451p:plain

 

まとめ

 秘密鍵・公開鍵の二種類の鍵を用いることで。電子署名という技術が成り立っているとお話しました。

これは署名者しか知りえない情報(秘密鍵)でしか作れない署名を作る暗号文を用いる)ことで、その情報の正当性を得る技術になります。

本当はハッシュ関数を用いての説明の方がよかったかもしれませんが、それはまた次回ということにしました。

ということで今回はここまでです!お疲れ様でした。ここまでお読みいただきありがとうございました!!

何か不備等ありましたらご指摘下さると幸いですm(_ _)m

 

修正:2018/06/13

公開鍵暗号秘密鍵・公開鍵の役割と、電子署名秘密鍵・公開鍵の役割を勘違いしていたため一部修正を入れました。少々読みづらくなってはいますが、どこで勘違いしていたかがわかるように()に打消し線を引き、赤文字で修正しました。重要な部分という意味で勘違いされるかもしれない(あながち間違っていない?)ので、ある程度時間が経ったら黒文字にします。

ちなみに同じような勘違いをしている方は以下のブログがおすすめです!

「電子署名=『秘密鍵で暗号化』」という良くある誤解の話

 

あときっかけは以下のツイート。上のブログもその流れの紹介です。ありがたや(*´ω`)

 

参考資料