ビットコインで分からなかったことを全部調べてたみた結果

## はじめに
ビットコインで分からなかったことを調べた結果をまとめました。
どこかに書いておかないと１年後にはほとんど忘れちゃうので備忘録として書いておきます。
ビットコインについて、なんとなくは分かるけど詳しいことは分からないって人は参考になるかもです。

## 参考文献
- [ビットコインの使い方としくみ](https://www.ospn.jp/osc2017-spring/pdf/OSC2017_TokyoSpring_angotsuuka.pdf)
- [誰も教えてくれないけれど、これを読めば分かるビットコインの仕組みと可能性](http://jp.techcrunch.com/2015/03/31/bitcoin-essay/)
- [Mastering Bitcoin（日本語訳 PDF）](https://bitcoinbook.info/translations/ja/book.pdf)
- [日本語で読むビットコイン原論文 [by Satoshi Nakamoto]](https://coincheck.com/blog/292)

## [Q1]ビットコインのブロックチェーンはどうやって管理している？
中央管理者がいないので、P2Pというシステムで参加者全員で管理している。
参加者間でブロックチェーンに差異が発生した場合は一番長いブロックチェーンを正とする。

## [Q2]P2Pの参加者一覧は誰がどうやって管理している？
ブロックチェーン同様に参加者が各々で管理している。

## [Q3]参加者一覧持ってない人がP2Pへ参加するにはどうすればいいの？
[Mastering Bitcoin（日本語訳 PDF）](https://bitcoinbook.info/translations/ja/book.pdf)
>一番最初に行うことは"DNSシード"にあるDNSに問い合わせることです。DNSシードはBitcoinノードのIPアドレスリストを提供するDNSサーバです。DNSシードのうちいくつかは安定的にリクエストを受け付けているBitcoinノードの静的なIPアドレスを返却しています。

なるほど。
ただ、DNSサーバはどこで誰が管理しているのでしょうか。
おそらくそれも複数あるのでしょう。

## P2Pはどのくらいの時間で同期されるの？
[Mastering Bitcoin（日本語訳 PDF）](https://bitcoinbook.info/translations/ja/book.pdf)
>全ての接続されたノードがこのトランザクションを受け取るまで波紋のようにBitcoinネットワーク内を伝わっていき数秒以内に全体に広がっていきます。

数秒は予想以上に早いですね。

## [Q3]P2P参加者って何しているの？
マイニングしたり、マイニング結果を承認したり、ウォレットを持ったりしてます。
特に全てのトランザクション履歴を持っている参加者は「フルノード」と呼ばれます。

## [Q4]マイニングって具体的になにしてるの？
マイニングはproofと呼ばれるハッシュ値を探す作業です。
「直前のブロックのproof」と「今回のブロックのnonce」を"繋ぎ合わせた文字列"をハッシュにかけて、proofを探します。
proofは事前に定義が決まっていて、例えば「最初の4桁が0000となるハッシュ値」などがあります。
これは難度やハッシュレートとも呼ばれていて、全員が同時に挑戦しておおよそ10分で見つかるように自動的に調整されています。
あるマイナー（P2P参加者の1人）がproofとなるnonceを発見するとそれをP2P参加者全員に結果とnonceを報告します。
P2P参加者たちはnonceを受け取ったら「直前のブロックのproof」と「受け取ったnonce」を"繋ぎ合わせた文字列"をハッシュにかけ、proofを満たすかどうかを確認します。
満たした場合は自身のブロックチェーンに追加して新しいブロックのマイニングを開始します。
新しいマイニングは先ほど受け取ったnonceから作成したハッシュ値(proof)と新しいブロックのnonceを繋ぎ合わせた文字列をひたすらハッシュにかける作業となります。

## [Q5]承認って何を見てどう判断しているの？
基本的にはnonceが正しいかを見ています。
※データ構造に誤りがないか、タイムスタンプが正しいかなども見ています。

## [Q6]つまり承認者は誰が誰に送金するのかは検証してないってこと？
そうです。

## [Q7]だったら攻撃者が取引を改竄していてもnonceさえ正しければ見抜けずに承認しちゃうのでは？
承認しちゃいます。
ただし、実際にはそれは現実的には起こりえません。
まず、攻撃者ができる取引の改竄は「自身の支払いをなかったことにする」ことだけです。
他のアドレスから自身のアドレスに不正に送信する、といった改竄はできません。
ビットコインを送金するためには秘密鍵が必要だからです。
秘密鍵がないと送金することはできません。
ただし攻撃者は自身の秘密鍵は当然持っているので、自身の送金履歴を不正に操作することは可能です。
しかし、取引を改竄している間にも、ブロックチェーンはどんどん伸びているのでそれを追い越すために全CPUの51%以上の性能が必要となります。
しかし、そのパワーがあれば、取引を改竄するよりもマイニング手数料でより多くを稼げるはずなので、現実的には取引の改竄は起こりえません。

## [Q8]承認者のモチベーションはなに？
- [ビットコインのフルノードとは？定義と役割・メリット](http://www.jpbitcoinblog.info/entry/20170213/1486912581)  
上記の記事によると以下となりますが、記事にある通り、これだけじゃ弱い気がしますね。
- ブロックチェーンを攻撃者から守ること
- 他のノードを信用する必要がないのでセキュリティリスクが低い
- 他のノードにbitcoinアドレス・IPアドレスを伝達しなくてよいのでプライバシーが守られる

## [Q9]フルノードってどのくらいいるの？
以下によると１万ちょっとみたいですね。(2018/1/15)
その内、日本は169個。
[フルノード一覧](https://bitnodes.earn.com/nodes/)
意外と少ないですね。

## [Q10]マイニングの51%取るのは大変そうだけど承認の51%は意外と簡単に取れちゃったりしない？
確かにそうかも。。
承認の51%取れると不正に承認できちゃうのでマイニング手数料取り放題になりますが、本当でしょうか？
誰か教えてください。

## [Q11]１ブロックの承認時間が10分になるようにどうやって調整している？
[Mastering Bitcoin（日本語訳 PDF）](https://bitcoinbook.info/translations/ja/book.pdf)
>difficultyのretargeting(targetの再設定)は自動的に全てのフルノードで行われます。2,016ブロック毎に全てのBitcoinノードはproofof-workのdifficultyをretargetします。retargetingを行う時は、最後の2,016ブロックが生成されたのにかかった時間(Actual Time of Last 2016 Blocks)を測定し、予想される時間20,160分(10分間でブロック生成が起きたとするとこれは約2週間に相当)と比較し25ます。実際にかかった時間と求められる時間との比が計算され、適した調整(difficultyを上げるまたは下げる)が行われます。もしBitcoinネットワークが10分毎よりも速くブロックを見つけていればdifficultyは上がります。もしブロックの発見が予想よりも遅ければ、difficultyは下がります。

各フルノードで調整して、P2Pで同期しているようです。


## [Q12]秘密鍵の生成方法は？
https://bitcoinbook.info/translations/ja/book.pdf
>Bitcoin秘密鍵は単なる数値で、コインや鉛筆、紙だけを使ってランダムに秘密鍵を選ぶことが
できます。例えば、コインを256回投げてBitcoinウォレットで使うランダムな秘密鍵の二進数
を作り出すことができます。
(中略)
>Bitcoinソフトウェアは、256bitのエントロピー(ランダムさ)を作り出すOSのランダム値生成器を使っています。通常OSのランダム値生成器は人間を元にしたランダムさを使って初期化されます。
(中略)
>さらに正確に言うと、秘密鍵は 1 と n - 1 の間の任意の整数で、nはBitcoinで使われている楕円曲線の位数として定義されている定数です(n = 1.158 * 1077で2256よりわずかに小さい)(楕円曲線暗号図参照)。このようなキーを作るために、256bitの数値からランダムに数値を選び、選んだ数値が n - 1より小さいかをチェックしています。プログラミング用語で言うとこれは通常、暗号学的に安定なランダムさ源から集められた任意の長さを持ったより大きい文字列を取得し、256bitの数値を作る便利なSHA256ハッシュアルゴリズムに放り込むことで達成できます。もし結果が n - 1よりも小さかった場合、それが適切な秘密鍵です。もしそうでなければ、単にもう一度別のランダムな数値を取得してうまくいくまで同じことを繰り返します。

うーん、あまり理解できないですが、なんとなくすごそうだということは分かりました。

## [Q13]秘密鍵から公開鍵の生成方法は？
https://bitcoinbook.info/translations/ja/book.pdf
>公開鍵は楕円曲線上のスカラー倍算を使って秘密鍵から計算されるもので、この処理は不可逆な処理になっています。\(K = k * G\) 但し k は秘密鍵、 G は ベースポイント と呼ばれる定点、 Kは結果として出てくる公開鍵です。逆操作は、離散対数問題 - K を知っていたときに k を導出する問題 -として知られ、この難しさは kの全ての可能な値を総当たりで調べるのと同じくらい時間がかかる問題です。

Q12と全く同じ感想ですね。

## [Q13]公開鍵とbitcoinアドレスは同じもの？
https://bitcoinbook.info/translations/ja/book.pdf
>Bitcoinアドレスは公開鍵と同じでは ありません 。
Bitcoinアドレスは公開鍵から一方向関数を使って導出されるものです。
(中略)
公開鍵からBitcoinアドレスを作るときに使うアルゴリズムは、 Secure Hash Algorithm (SHA) と RACE Integrity Primitives Evaluation Message Digest (RIPEMD) で、中でも SHA256 と RIPEMD160 が使われます。

同じだと思ってました。。
いろいろなアルゴリズムが使われているんですね。

## [Q14]高い手数料を払わないと永遠に送金は終わらないの？
[Mastering Bitcoin（日本語訳 PDF）](https://bitcoinbook.info/translations/ja/book.pdf)
>メモリプールに残ったままになっているトランザクションは古くなり優先度が上がっていきます。結局
トランザクション手数料を持たないトランザクションは十分に高い優先度になり無料でブロックに取り込まれ
ます。

だったら急がない場合は手数料無料で送金できますね！（本当？）

## おわりに
調べてみて理解は大分深まりましたが、真に理解するためには暗号方式なども勉強しないといけなくて大変ですね。
今後はPoSやライトニングネットワークについて調べてみようと思います。