暗号通貨のマイニングのハッシュアルゴリズムについて調べてみた

AbemaTV Advent Calendar 2017 の16日目の記事です。

AbemaTV Advent Calendar 2017 - Adventar

暗号通貨で使われるPoWの暗号化アルゴリズムについて書きたいと思います。

まず簡単にマイニングの説明。 ビットコインを通じた取引はビットコインネットワーク(P2Pに参加しているクライアント)に承認されはじめて有効になります。 取引の内容をトランザクションと呼び、インプットとアウトプットと言う形で誰のウォレットから何BTC誰に支払われれるという内容です(前のトランザクションハッシュ値や新しい所有者の公開鍵などを含む)。この未承認のトランザクションをマイナーが見つけ出し、ブロックチェーンに書き込む。

マイナーがトランザクションを見つけ、記載するまでがマイナーの仕事で、ブロックチェーンに記載されるということは、ネットワーク全体に承認されたということになるが、全体に承認するためにProof Of Workという作業がある。

CPUの計算の速さを競わせ、ブロックが有効だという一番近い解を最初に見つけたマイナーを勝者とし、そのブロックをブロックチェーンに組み込み、報酬が貰えるという仕組み。ビットコインではそのアルゴリズムにSHA256という暗号化アルゴリズムが使われていて、提案しようとするブロックのヘッダにnonceを加えてシリアライズしたバイト列をSHA256でハッシュ化し、答えが最小になるまで反復的に計算し続ける。10分以内に計算が終わるように難易度調整されている。

はやく計算を行ったマイナーが報酬を得ることができるため、どのハッシュアルゴリズムで計算を行うかも重要になってきます。電力消費量、一般人でも収益化できるのか、専用の高価な機器を用意しないとマイニングできないかなどに関わってくるので、敢えてASIC(高価な専用な採掘機)でマイニングできないような複雑なアルゴリズムを採用しているアルトコインも存在する。

ビットコインは計算が信用を作り出す仕組みで、善の心を持ったマイナーの計算能力が過半数を割らない限り、健全なネットワークでいられる。そのため51%攻撃やシビルアタックといった悪意のあるユーザーの攻撃などを防ぐ必要がある。 Sybil attack - Wikipedia

blockchain.info https://i.gyazo.com/4fbc2568a4f16453c0e31604273f7e26.png ただ、この分布を見る通り寡占状態になっていて、分散型信用ネットワークとはなんだったのか?という状態になっている。 既に個人でビットコインマイニングは難しく、マイニングプールに参加して貢献度により報酬をもらうという形が一般的。

SHA-256、RIPEND-160

2つを組み合わせることで強固なハッシュを作る。ビットコインビットコインキャッシュなどで使われている。GPUやASICでの計算に向いている。AntMinerというASIC採掘機が数10万から100万円以上で売られている。

ブロック増えていくほど、計算量が増えるため電力消費が増え続ける。ビットコインマイニングで年間28TWh消費しており、環境問題に発展しそう。実際に取引が行われているというより、投機目的が多いため、資源の無駄遣いという現状もある。 5 Best Bitcoin Mining Hardware ASICs 2017 / 2018 (Comparison)

Equihash

ZcashのPoWで使われている。(ビットコインゴールドもSHA-256からEquihashに移行?) メモリ指向型PoW。効率のいい専用のASIC機を作ることを難しくしている。

GitHub - khovratovich/equihash: Equihash: memory-hard PoW with fast verification

論文: https://eprint.iacr.org/2015/946.pdf 人生で一番やる気あるときに読む

他にもxkSNARKSというスマートコントラストの認証コストを抑える技術もあってZCash面白い。 Zcash - イーサリアム上のzkSNARKs

Ethash

イーサリアムのPoWで使われている。 こちらもマイナーの寡占を防ぐためにASICのマイニングが難しくされている。

https://ethereum-japan.net/wp-content/uploads/2017/06/bfnEB.png

Directed acyclic graph - Wikipedia

DAGというグラフの計算をメモリで行うため最適化が難しいということらしい。ビットコインブロックチェーンはブロックが一本でつながっているが、DAGは複数のブロックが同時につながっている。 なんでそうなっているかというと、Ethereumには、Ghost Protocolという技術があり、ハッシュレートが低いマイナーの無駄になってしまう(orphan block)をuncle blockと呼び、報酬を与え、そのブロックはチェーンにぶら下がる。それによって重くなるチェーンをメインチェーンとする仕組みなよう。それによって短い時間でもセキュリティの高いブロックの生成を可能にしている。

ブロック生成時間が15秒、DAGにおいて30,000ブロックごとに1Epochという単位でわけられていいて、1Epoch毎にDAGファイルが増加する問題もある。 Radeon RXにおいて長時間マイニングするとハッシュレートが低下してしまうため、コスパが悪い。

そもそもイーサリアムは、Proof Of WorkからProof of Stakeへの変更を予定(Casperと呼ばれるアルゴリズム)していて、大型アップデートと謳っている「セレニティー」で実装されるらしい。PoSはPoWの欠点を克服したもので、これはこれで説明が長くなるから割愛。

ビットコインは単純がゆえに問題もあるが、イーサリアムは複雑なため難しい。。

scrypt

litecoinなどで採用。メモリ消費が激しい。 litecoinもASIC耐性のあるコインとして開発されたが、現在scrypt用の採掘機が流通している。 AntMiner L3+ Buy The Powerful Antminer L3+ ASIC Litecoin Miner - Bitmain

yescrypt

BitZenyで採用。ASIC耐性あり。CPUのみ対応。 SHA-256が使われている様子。 bitzeny/hash.h at new-bitzeny · onokatio/bitzeny · GitHub

価格が上昇した影響でマイニングプールも賑わっていて、掘るのが難しくなってきている。。

Lyra2REv2

Monacoinで採用。litecoinからフォークされたMonacoinはASIC対策のためLyra2REに変更。 変更後のスレ

Lyra2REv2のASIC - Ask Mona 【マイナー必見】Lyra2REv2を高速化したよ - Ask Mona

CryptoNote

匿名通貨Monero(Cryptnight)で採用。消費電力が少ない。MinergateというプールはCryptnote系のコインが掘れる。

終わり

どの通貨でどのアルゴリズムが使われているか調べてみました。ブロックチェーンや、ビットコインのネットワークアーキテクチャ、暗号化などまだわからないところがたくさんあるので、また記事を書こうと思います。 個人的に来年はプログラマとして暗号通貨に投資しようと思ってます。マイニングに関しては僕は自作PC作ったり、パーツとか調べるのも好きなので、割りと向いてる方かなと思います。 Radeonのドライバーも仮想通貨向けの機能を追加していたり、しばらく自作PC界隈も盛り上がりそうで楽しいです。 ゲーム内オーバーレイ表示やスマホ連携を搭載した新ドライバ「Radeon Software Adrenalin Edition」 - PC Watch

社内で簡単にビットコインの仕組みについて説明したときのスライドです

www.slideshare.net

2016のこと

今年は環境がかなり変わったので去年の振り返りしようと思います。

引っ越し

上京してから1年以上お世話になったシェアハウスを卒業して一人暮らしをはじめた

初めて一人で手続きなどした

今年は引っ越しすることを年内の目標にしてたので出来て良かった

ニコニコ超会議に行った

こういう類のイベントに参加したのは初めてで、意外に楽しかった。ニコ生でしか見れなかった人達を生で見るのも新鮮だった。あの空間は異常だった。

ゲーム

PS4を買って色々なゲームをやった。ゲームに対するモチベーションが低すぎて心配だったけど、なんとか楽しくやれている。

プログラミング

自分の意識下でRailsエンジニアからフロントエンドエンジニアに転向した。たまたま割当たったプロジェクトがフロントエンドだったというのもあるけど、自分が現時点で価値を出せる領域だった。業務でReact.jsやReduxでWebページをSPAっぽくしたりした。それらの内容をLTで発表した。

すでに動いているRailsアプリケーションにReact.jsを投入する

http://qiita.com/khrtz/items/a43d58cad54af2425ced

仕事

自分の立ち位置や得意なことってなんだろうと考えるようになった。

この会社に入った入り口としてはあくまでRailsエンジニアだったので、求められるスキルセットが足りない気がして焦りがあったけど、自分の得意なことに集中しようと決め、サーバーサイドの開発は極力やらないようにした。

そして関心のあったReact.jsなどのフロントエンド、UIデザインなどに集中できるように。

この分野に関して社内では実力者がいなかったので、一定の裁量と信用が手に入ったと思う。それが実際に新機能開発や改善に役立てたのが良かった。

だけどベンチャーやスタートアップに属してきて思うのは、裁量ややりがいだけでは満足に生きていけなくて、スタートアップに求めるのは全能感やプロダクトの価値の核の人物になれることだと思ってて。自分の実力が伴わなければ、良いモノを作れないし、技術者の経験不足が原因でスピードを鈍化させることになるような環境で、そういうハッカーになるために色々な挑戦をしたり学んでいかなければならないというジレンマの中で、悶々としていたこともあり機会を求めていました。 

そして転職し現職に至るけど、想像してた以上に越えないといけない壁があるなと感じているので、今年はやっていきたい気持ちです。よろしくお願いします。 

引っ越した

引っ越せた。場所は文京区で、最寄りは江戸川橋駅。職場へはチャリで10分くらいの距離。
部屋は鉄筋のマンション、広さは1K

f:id:mhkohei:20160430103333j:image

前エントリ
引っ越したい

去年の11から探していた。1月くらいから引っ越しシーズンらしく物件もほとんど見つからなかった。

問題はお金だったので、敷金、礼金、不動産手数料0円に絞った。敷金礼金0自体はそんなにないけど、探せばある。

不動産手数料については、ノマド nomad-a.jp というサイトを利用した。完全無料ではないんだけど、5000円くらい課金した程度で済んだ。

一人暮らし経験あるけど、社会人として1人で契約するのはじめてだったからわからないことは結構ある。

2015年の1月に北海道から上京してきて、ずっと家賃40,000のシェアハウスに住んでいた。家賃安いことだけが取り柄で他は良いところがない。エンジニアになれて生活が担保されたので、いい加減抜けたかった。シェアハウスは、プログラマの生活を保障するものではないので、すぐに出た方がいい。

昨日IKEAで2人掛けソファとカーテンとラグ買ったくらいで冷蔵庫くらいしかない。よろしくお願い申し上げます。ゲームとか全然出来なかったし、環境作りたくてワクワクしている。
https://www.amazon.co.jp/registry/wishlist/2OMMVG78WHSEG/ref=cm_sw_r_cp_ip_wl_o_iHajxb2824G1Y

slim書くの辛い

Rubyで出力する部分で、slimを書くことがあるんだけど、100行超えた辺りから、自分がどの位置で何を書いてるのかわからない。上部にif文などを追加すると、コンパイルエラーが何度も起こる。Malformed indentationやSyntax error... 何度も何度も上下にスクロールしてネストを確かめて消耗してる。BEMで設計してたらまだマシではあるけど、erb2slimでコンパイルしたようなコードはマジで読めない。ついさっきslimのコードでバグを出してしまった。俺の頭の処理能力が足りないのかもしれない。あー目が痛い

男だけど美容院で頭皮マッサージ(ヘッドスパ)してもらってきた

別にずっとヘッドスパしてもらいたいとか思ったことなかったけど、カットしてもらったついでにヘッドスパ頼んだ。時間は30分くらい。

頭について悩みだしたのは中学生になったくらいで、頭がかゆくて悩んでいた。肩についたフケとか気になりだして、シャンプー変えてもらったり、朝シャンでするようにしたら、あんまり気にならなくなった。今も習慣的に朝シャンしてる。

で、たまたま髪切ってもらうついでにヘッドスパしたんだけど、スッキリした感じで良い。今のとこ痒いところがない。普通のひとにとって当たり前なのかもしれないが、頭がスッキリして、集中力上がった感じがある。マッサージもいつも感じない刺激を受けて気持ちよかったし、10分くらい脳みそ冷凍庫に入れられたみたいな体験できる。日常的に頭かゆい人はやってもらったらいいかも。

12インチMacBookを使い始めて変わったこと

金のMacBookがきた
昨年10月にメイン機をMacBookに替えた。開発もプライベートもこのMac一台で行っている。もちろん今記事を書いているのもMacBook
 

変わったこと

 USB-C

充電する以外にポートを使っていない。というか使えない。変換ケーブルは持っているので、いざという時にはiPhoneを充電したりしているんだけど、2回くらいしかやったことない。
 
DVDを使わなくなった(諦めた)
外付けでDVDを観ようとしたときにハマったんだけど、MacBookで外付けDVDドライブ使うの面倒くさいので、DVDを観るのやめた。結局ツタヤで借りた5枚のDVD観ないで返却した。映画はNetflixやAmazonプライムで我慢。。sine
 
タイピングで疲れにくくなった

たまにひとのMacBookAirでタイプするときあるんだけど、ストローク深いとダルく感じる。指を置くだけで入力できるので指先は疲れにくい。逆にこのキーボードでカタカタターンッ!って感じで打つと腱鞘炎になるかも。静かに音を立てないように打つのがコツ。

MacBookのタイピング音は周りから聞いても、心地いいらしい。ぺちぺち。

 

作業領域が広がった

12MacBookはRetinaなので、作業領域が広がった。もうMacBookAir13では厳しい

 

CPUが弱いので、無駄なことができなくなる。

めっちゃChrome落ちるAtom落ちるIDEは動かない 

 

Atomは開けるファイル数が限られる。もともとこいつ重いせいもある。

プログラマならEmacsとか使って脳をシングルタスク脳に切り替える必要がある。

Chromeは結構な頻度で固まる。

 

無駄なことをしなくなる端末ッて感じでした

 

 
 
 

コードを書くモチベーション

最近コードを書く事にモチベーションが湧かないというか、惰性でやってる感ある。週末やろうとしたこともいざとなると全然楽しくないし、イラついて時間を無駄にしてしまう。できるようにならないといけないという焦りがそうさせているのかなんなのか分からない。そもそも楽しいと思えることなんて無いのかもしれない。

 

仕事でできなかったことを休みの日にキャッチアップする必要はないし、その都度覚えればいいと思うようにしないとキツイ。没頭するほどの猛烈なモチベーションはないけど、退社前の20分くらいJavaScriptのサイ本読むのを続けてる。JavaScriptの勉強は楽しいなーと思ってる。大学行ってないせいか、勉強したい欲は人一倍あって、本を読むのは学んでる気がして楽しい。モノづくりがしたいというより、コンピューターサイエンスに没頭したいんだなと思う。

 

まとめ 今は土日にアプリ作るとかより、コンピューターサイエンス勉強したほうが良さそう