ブロックチェーンのマイニング模擬実験

Interface8月号のブロックチェーン特集をちょこちょこ読んでいる。

その中のマイニングの体験が面白かったのでメモしておく。

マイニング

マイニングとは、ブロックチェーン上に新規ブロックを作成するための作業。

実際何をやっているかというと暗号学的ハッシュ関数を用いてハッシュ値を計算している。
ハッシュ値の入力は、前のブロックのハッシュ値と未承認の取引履歴のハッシュ値、そしてナンスと呼ばれる32ビットの数値の3つ。
新規ブロック生成の条件は、そのブロックのハッシュ値がある値以下(例えば0が16個並ぶ)となるようなブロック。

マイニング実施者(マイナー)は、ある数以下のハッシュ値(例えば0が16個並ぶ値)を見つけるため、ナンスをランダムに変化させてひたすらハッシュ値を計算する。
条件を満たすナンスを発見できたらマイニング成功となり、マイナーはマイニング報酬を得ることができる。

Pythonによるマイニングの体験

ナンス値を変えてある値以下(先頭文字に0が複数並ぶ)のハッシュ値を見つける。
コードはInterface8月号のコードを一部改変し使用している(ほぼ引用)。

なお、python3.7.1を使用した。

まずは、先頭4文字が0になるハッシュ値を見つけてみる。

import random
import hashlib
import re

transaction_1 = "A -> B 1BTC"

def text2hash(mynonce):
    hash_object = hashlib.sha256(transaction1.encode() + str(mynonce).encode())
    chk = re.match('0000', hash_object.hexdigest())
    if chk != None:
        print("Nonce: " + str(nonce))
        print("HASH: " + hash_object.hexdigest())
        print("=================================")

max_nonce = 10**7
extract_nonce_num = 10**6 

nonce_list = random.sample(list(range(0, max_nonce)), k=extract_nonce_num)
for nonce in nonce_list:
    text2hash(nonce)

実行すると以下のような結果になった。すぐ計算結果がでた(1秒もまってない)。

結果を見るとたしかにハッシュ値の先頭4文字が0になっている。
ハッシュ値全体からすると、先頭4文字が0になる確率は16^60/16^64 = 1/16^4 = 1/65536だから大体0.0015%くらい。
今回、100万個のナンスから12個の条件を満たすナンスを見つけたから確率は12/10^6で、大体0.0012%くらいなので整合的かな。

Nonce: 6487403
HASH: 00006660c4c89abf1cc9654dff2a5ffac1ed65e7f0d9d43d008924a5d775f6f5
=================================
Nonce: 8845617
HASH: 00005943b43aa3f90987d07d6d6755af11ed20e4096ad5ed30ba466653f8aff1
=================================
Nonce: 8949731
HASH: 000015497ca43abb7e07322361be25955e83dac3f60014a0d253800513ae7092
=================================
Nonce: 7875493
HASH: 0000109c55bb3ae22deba78eccc3fe7ae5e259f2f3f47f407d35ae00a530ef79
=================================
Nonce: 6319689
HASH: 000023b6c8e4f9925c28bb749b7e2b07850471f852e1dfa76615abe0c57a763c
=================================
Nonce: 1908741
HASH: 00002634d326f64212aaf6f15b2ea60fd69a0d6c1ef4c8f8c2f3b596f5b83bd5
=================================
Nonce: 1739868
HASH: 0000bd16e990309b203ad6b620e2f59c75747d2fc91a7a6e8d52e958ae02c275
=================================
Nonce: 1579836
HASH: 00009958c87100b48c79e8be3602a5ba94150c5454ad3a9a1b43ce75081fa581
=================================
Nonce: 3768602
HASH: 00005cddc0bac1e2d6c3825bef4a4edc2c0901531d4039822857583bf3cbbbe7
=================================
Nonce: 7397948
HASH: 0000cc416e9872b5af5b45bbf94ba1dbaec984b5f80b7ee86c1268d7ab77dcf3
=================================
Nonce: 2561779
HASH: 0000c4137ca7636f9475069585f170271a899de1c55f20c56507f8d597403b0f
=================================
Nonce: 8532683
HASH: 000076388f9767d973ce8090bb3de94759c73f93743d880adbe096573bb3375a
=================================

次に、先頭5文字が0になるナンスを見つけてみる。

コード内のtext2hash関数内のパラメータchkの値を変えて実行する。

何回か実行すると、条件を満たすナンスが下記のように1件発見できたり、できなかったりする。大体0~2個くらいの発見数。

先頭文字の0を一つ増やすと条件を満たすナンスを見つける確率は16分の1に減るので、先程の結果(発見したナンスの個数:12)と比べるとまあ整合的かと思われる。

Nonce: 4196833
HASH: 000002e0c4d4158f51626be52ea8a53da9bc55cba1a272cfc9509b2548b1889e
=================================

ビットコインでのマイング

ビットコインでは先頭文字が16個(難易度によって増減するが)の0になるハッシュ値を見つけなければならない。
条件を満たすナンスを見つける確率はめちゃくちゃ低い。確率は、1/16^16。約0.00000000000000001% (10^-17 %)

マイニングは大変ってことがよく分かった。勉強になりました。

Surface Laptop 2 買ったが、キーボードの革のにおいが気になる

ヨドバシでsurface laptop 2見てたらかっけーなあと思いそのまま買ってしまった。

Surface Laptop 2 ブラック Core i5 8GBメモリ 256GB SSD で16万弱。

f:id:hhgingisland:20181024172411j:plain

黒かっこいい。

f:id:hhgingisland:20181024172427j:plain

f:id:hhgingisland:20181024172440j:plain

 めちゃかっこよくて画面もきれいでキーボードも打ちやすくて良いんだけど、キーボード周り(パームレスト)がアルカンターラとかいう革みたいな素材で覆われていて、そのにおいがキツくて結構気になる。

いわゆる新車のにおい。

今の所使ってから二日経っているがまだくさくて気になる。やばい。

新車の革のにおいが苦手でにおいに敏感な人は注意した方がいいと思う。
店でよく嗅いでから購入することをおすすめする。

それ以外は良いんだけどなあ。

 

Anacondaでpythonの仮想環境作成

Anacondaを使いpythonの仮想環境を作成する際に使用したコマンドをメモしておく。 今まで仮想環境について何もわかっていなかったが、便利なものということを理解した。

仮想環境を作るメリット

バージョンの異なるpythonやライブラリの組み合わせ環境を複数作成できること。 プロジェクトごとに仮想環境を作ることで、バージョンの違いによるエラーなどを避けることができる。

conda コマンド

基本的にAnaconda prompt上でcondaコマンドを打って作成する。windows付属のコマンドプロンプトを用いて作成する際は環境変数PATHにAnacondaのパスを通す必要がある。

なお、Anaconda Navigatorを使えばGUIで仮想環境を作成できる。

仮想環境の作成

conda create -n py36 python=3.6

-nの後に環境名を入れる(py36)。その後にソフトやライブラリのバージョンを記載する(python=3.6)。

仮想環境の確認

conda info -e

作成した仮想環境の一覧が表示。現在アクティブになっている環境に「*」がつく。

仮想環境のActivate

conda activate py36

仮想環境名(py36)を指定する。

現在の仮想環境のDeactivate

conda deactivate

root(base)環境に戻る。

仮想環境の削除

conda remove -n py36 -all

英作文の勉強を始める -参考書(洋書)購入-

半年後くらいに英語で文章を書く機会があるかもしれないということで、英作文の勉強を始めようと思った。学生時代から全く英作文の勉強をしていなかったので基礎からしっかりやる必要がある。

昔何かの記事で海外大学に留学するノンネイティブの学生は、まずアカデミック・ライティングをみっちりと教えられる、というようなことが書いてあったことを思い出し、アカデミック・ライティングを習得できれば良いという結論に至った。

とりあえずそこで使われている教科書を読んで勉強してみるかと思い、良さそうな参考書がないか調べてみた。

良さそうな参考書

アカデミック・ライティングでググっていると、おすすめ参考書が紹介している大変参考になるサイトを発見した。

若き経済学者のアメリカ

英語論文の書き方:英文ライティングここから始める必読テキスト4選

こちらのサイトに詳しく書かれているが、英語で文章を書く際にはまず重要なのが、

「英語ライティングのルールを守る」 

ことであり、そのルールを解説していて、ネイティブ含め読むべき本として推薦されているのが以下の2冊の本。 

① The Elements of Style, Fourth Edition

② On Writing Well: The Classic Guide to Writing Nonfiction

ということで、これら2冊を買った。

『The Elements of Style』はページ数も少なくサイズも小さく持ち運びに便利な本。
まずはこれから読んでライティングのルールをしっかり覚えていきたいと思う。

加えて、アカデミック・ライティングの基礎編として紹介されていた下記の本を購入した。

③ They Say / I Say: The Moves That Matter in Academic Writing

この本はどういった構成で説得力のある文章を書けばよいかをテンプレートを交えながら解説しているとのこと。
①、②を読んだ後にこちらの本を読んで勉強していきたいと思う。

 

The Elements of Style, Fourth Edition

The Elements of Style, Fourth Edition

 
On Writing Well: The Classic Guide to Writing Nonfiction

On Writing Well: The Classic Guide to Writing Nonfiction

 
They Say / I Say: The Moves That Matter in Academic Writing

They Say / I Say: The Moves That Matter in Academic Writing

 

 

書かないと忘れる。記憶力をあてにしてはいけない。

文章を書くのは面倒くさいんだけど、簡単なメモでもいいから何か書いておかないとやったこと忘れるよね。

以前インストールしたソフトを別環境でインストールする時、どうやってやるんだっけとか、どういう設定したんだっけとか、なんでこういうプログラムを書いたのか、とかここ最近何回かあった。なんでメモっとかなかったのかとその度に嘆く。
作業している時はまあ覚えてるっしょと自分の記憶力を信じるだが、まあ忘れるよね。
そして同じようなこと調べて時間を無駄する。

書いておけば、それを読めば思い出すし、
書くことによってどこまで理解できているかってのも分かるし、
書いたことによって記憶にも残りやすい、とメリットは多い。

ということでこれからは面倒だけど、なにかしらメモを残そう。


 

 

【読書】ソクラテスの弁明

 『ソクラテスの弁明』を読んだ。岩波文庫を読むのは久々だった。

 

ソクラテスの弁明・クリトン (岩波文庫)

ソクラテスの弁明・クリトン (岩波文庫)

 

 

読んだ動機

1日1ページ、読むだけで身につく世界の教養365という本を毎日読んでいて、その中にソクラテス、その弟子プラトンに関する説明があり興味を覚えた。

本屋に行った際にこの本を手にとると、

プラトン初期の作であるが、芸術的にも完璧に近い筆致をもって師ソクラテスの偉大な姿を我々に伝えている。

と書いてあった。芸術的に完璧ってどんな文章なんだ?と気になり、購入して読んでみることにした。

 

感想

ソクラテスの思考そして生き様を50ページくらいの短さで無駄なく強烈に印象づける点は確かに芸術的だなと思った。表紙の言葉に納得。ソクラテスの哲学はプラトンの文章力があったからこそこの時代まで残ってたのかなとも思った。ソクラテスの弁明内容にいくつか興味深いものがあったので記していきたいと思う。

 

あらすじ

まず簡単にあらすじを述べる。ソクラテスはとある人物から訴訟を起こされ、その嫌疑を払拭するため法廷で弁明を行うという話。

ソクラテスに対する訴状は、

ソクラテスは不正を行い、また無益なことに従事する、彼は地下ならびに天上の事象を探求し、悪事をまげて善事となし、かつ他人にもこれらの事を教授するが故に。

とあり、自身が使命とする人々との議論を通じて、人々の反感を食らい、それが元で訴訟を起こされたのである。ネタバレをすると結果的に死刑判決を受けることになった。

 

無知の知」&死に対する考え

そもそも、なぜソクラテスは議論すると反感を食らうかというと、人々(特に賢者と思われている人)が実は何も知っていないのに知っていると思っている、すなわち知ったかぶっていることを、ソクラテスが暴露してしまうからである。

これによりプライドを傷つけられた賢者達はソクラテスに憎悪し、誹謗中傷が巻き起こり結果的に裁判へと発展してしまった。

有名な「無知の知」は、この本に出てきていた。

 

その無知の知を、死に対して適用していたのが新たな気づきであった。

「思うに、使徒は人間にとって福の最上なるものではないかどうか、何人もしっているものはない、しかるに人はそれが悪の最大なるものであることを確知しているかのようにこれを恐れるのである。しかもこれこそまことにかの悪評高き無知、すなわち自ら知らざることを知れりと信ずることではないのか。」

確かにそうだなと。そしてソクラテスは、上記のように死を前にして自身の正義を曲げてまで死を回避しようとする人々をよく見ることを引き合いに出し、ソクラテス自身はそういった態度こそが悪で恥ずべき行為だと主張する。このようなソクラテスの自分の信じることを貫き通す心の強さが魅力的に映った。かっこいい。

 

そして終盤で死が夢も見ないほどの熟睡と同じようなものだったら最高じゃないかと話かけるところがあり、そういう考えもあるのねと印象に残った。

 

ソクラテスの弁論術

作中に一部、告発者との議論のやり取りがある。これを読むとソクラテスの頭の良さが分かる。皆が納得するような事実を除々に認めさせ、最終的に相手の矛盾点を証明させるところは見事だなと思った。

そして確かにソクラテスに議論をふっかけられたらいやだなと思う。確実に何かしらを指摘されて、特に地位が高い人にとっては都合の悪い邪魔な相手だと思われても仕方ないなと感じた。

 

人々のネガティブの感情は強い

「私を滅ぼすべきものはこれである。それはメレトスでもなくアニュトスでもなく、むしろ多衆の誹謗と猜疑とである。それはすでに多くの善人を滅ぼして来た、思うにまた滅ぼして行くであろう。」

これは現代でも通じるように、自尊心を傷つけられた際の嫉妬心・憎悪は強い。生きていく上で、他人のこういったネガティブな感情をいかに刺激しないように、そして自分がそういった感情に陥ってしまったときに、いかに冷静になり落ち着けられるかが重要だなと思う。本書を読んで感情にも気づきが得られたのは収穫であった。

【読書】ブロックチェーン入門

ブロックチェーン入門』という本を読んだ。

仮想通貨で有名なビットコインに実装されているブロックチェーン。その仕組みと応用例について解説した本である。

ブロックチェーン入門 (ベスト新書)

ブロックチェーン入門 (ベスト新書)

 

読んだ動機

仮想通貨が流行るとともにそれに使用されているブロックチェーンは画期的だ、みたいな記事をよく見かける。

仮に今後ブロックチェーンを用いた製品やサービスが当たり前のように使われるとすると、今のうちに概要くらいは知っといたほうがいいだろうし、ブロックチェーン界隈の未来がどうなるか自分で予測できたらいいなあと思いこの本を手にとってみた。

なぜこの本にしたかというと、グノシーのブロックチェーンブログで勧められていたからだ。ブログにはどのようにブロックチェーン周りの技術をキャッチアップしていくか丁寧に書かれており、興味がある限りこの順番で勉強してみようかなと思っている。

 

感想

ブロックチェーンにより実現する管理者不在の分散型取引については何となく理解した。

結局のところ中央集権型でなく分散型にするメリットはカウンターパーティーリスクの排除。仲介業者を介すことで発生するコストがなくなり取引にかかるコストが減るのは確かに嬉しい。

 

ブロックチェーンの仕組みについては、ぼんやりとしかわからなかったが、取引データの改ざんが非常に困難で、ユーザーが不正を働くインセンティブがなく(改ざんしようすると損をする)、ユーザーが自発的に取引データを更新するよう設計された非常によく出来たシステム、ということがわかった。

51%攻撃をしてデータ改善を行うと通貨の信用が失い、価値が暴落しマイニングコストに見合わないので、不正は行われないというのは面白い。

 

ブロックチェーンを構成するコンセンサスアルゴリズムや暗号化技術についてはちゃんと勉強しないとわからないなあと感じた。

ハッシュ値とナンス値の関係とか公開鍵暗号方式でどうやって取引の正確性が担保されるか私の頭では理解できなかった。

 

ブロックチェーンの応用例として産業別に多くの事例を紹介されていた。個人的には、ダイヤモンドのサプライチェーンに応用するのが面白かった。

ダイヤモンド産出国ではブラッド・ダイヤモンドという産出国の反政府組織が軍資金を稼ぐために輸出するダイヤが問題になっている。このダイヤモンドのため紛争が激化していってしまうのだ。

このような背景からブラッド・ダイヤモンドが市場に出回るのを制限するため、売り物であるダイヤモンドがブラッド・ダイヤモンドではないことをブロックチェーンに採掘から販売までの取引記録を格納することで証明しようというものである。

本書によるとロンドンにあるEverledgerという会社がやっているらしく、ブロックチェーンのメリット(データの改ざんが困難で情報がオープンなところ)を活かしていてなるほどと思った。

 

本書を読んでブロックチェーンの概要を知れたのは良かったが、ブロックチェーンを人に説明できるくらい理解するには、結構な時間勉強が必要だなと実感した。どこまでやれるかは不明だが色々本読んだり実装して理解を深めていけたらと思う。