【エンジニア向け】ビットコインを学んでブロックチェーンを完全に理解する【第一回 歴史とネットワーク】

はじめまして。かちおと申します。
表題の通り、ビットコインの仕組みを学んで、最近話題のブロックチェーンを理解してみましょうっていう記事です。

# ビットコイン・ブロックチェーンについて

ビットコインは、P2Pネットワークで構成される、決済システムです。TorrentやTorのように、全てのノードが対等に接続され、「ビットコイン」と呼ばれるネットワーク上の通貨を送金できます。

# ビットコインの歴史

2008年、「Satoshi Nakamoto」と名乗る人物が、匿名でインターネットにある論文をアップロードしました。そこには、今のビットコインの原始的な仕組みが乗っていました。
そして翌年の2009年、Satoshiは、その論文の理論を実際に実装したソフトをソースコードとともに、インターネットで公開します。
そしてそれ以降今まで、ナカモトサトシがインターネットに現れることは、一切ありませんでした。
つまり、ビットコインは匿名の人物によって発表されたものとなります。

以下がそのPDFとなります。

https://bitcoin.org/bitcoin.pdf

論文の中では、ビットコインのことを「P2P 電子通貨システム」と読んでいるようです。

## ビットコインの基本的な利用方法

まずユーザーは、自分でアドレス（ビットコインでの口座番号）というものを作ります。
アドレスを指定することで、自分の保有しているビットコインを他人（そのアドレス）に送金することができます。

以上をすべて自動化してくれるGUIのソフトがあり、それを利用しビットコインを扱うのが一般的となっています。このソフトを、財布に見立てて「ウォレット」なんて呼んだりしています。

なぜコレだけで通貨の仕組みが成り立つか、それを数回に分けて説明していきたいなと思います。

## ビットコインとブロックチェーンについて

もともとビットコイン自体が、P2Pの決済システムとして考えられました。そしてそのなかで、匿名でいかに不正のできないお金の送金をするかを実現しているのですが、その部分だけが「ブロックチェーン」という技術として注目が浴びせられ、現在では決済手段以外の利用方法が考えられています。これがブロックチェーンとビットコインの違いです。
つまり、ビットコインの使用を理解すること、コレすなわちブロックチェーンを理解することにつながります。

## Bitcoin,bitcoin,BTCの名前について

これには明確な定義はありませんが、ビットコインの仕組みそのもの、つまりプロトコルを指して「Bitcoin」、ビットコインのネットワーク上の通貨が「bitcoin」、そしてbitcoinの単位が「BTC」と呼ばれることが暗黙の了解となっています。

この記事では読みやすさを考慮し、仕組みそのものを「ビットコイン」、通貨としても「ビットコイン」、単位として「BTC」を利用します。適宜読み替えてください。

## ビットコインの開発者、ユーザー、マイナーについて

ビットコインは、そもそもP2Pで動作するものなので、本質はプロトコルにあります。プロトコルが法です。
あくまでビットコインのソフトは、そのプロトコルに沿ったカタチで作られなければ行かないと決まって降り、プロトコルに違反する通信は他のノードに弾かれます。

いわゆる「ビットコインコア」という集団が居て、彼らが作るノードは世界的にも色々なところに使われます。彼らは最初にSatoshiが発表したノードのソースをベースに開発しているところであり、事実上のスタンダードとなっています。しかし、そのビットコインコアも、あくまで「プロトコルに完全にタイプするノードを作る」というのが目的です。

またビットコインコアは、ビットコインのプロトコルをとりまとめる役割もあります。こう聞くと勘違いするかもしれないですが、あくまでプロトコルを提案・投票できるのはユーザーとなります。それを文章にまとめたり発表したりをしてくれているのがビットコインコアです。

そしてビットコインの一番いいところは、プロトコルが法なところです。自分が気に食わないプロトコルが発表されて、ビットコインコアや他のソフトがそれプロトコルに移行しても、自分は移行せずに古いノードのソフトを使い続ければ良い話です。後方互換があるプロトコルなら、自分が古くてもノードに弾かれることはないでしょう。
そうやって、最終的には自分でどんなプロトコルを使うか（どんなプロトコルを搭載しているノードを使うか）選ぶ権利があります。これがビットコインの一番素晴らしいところだと思っています。

そして色々な人の意見が食い違って、プロトコルが完全に分離してしまうのがいわゆるニュースになった「分裂」です。ビットコインではフォークという呼び方をします。

マイナーは、いわゆるマイニング（採掘）を行う人です。ユーザーは、マイナーを含めたビットコインの利用者のことを指します。

# ビットコインの仕組みについて

## ネットワーク

前提として、P2Pネットワークの仕組みを見てみましょう。
各ノードはデフォルトで、TCPの8333ポートを利用し、ソケット通信を行います。
また、NAT等があった場合、UPNPで静的NATを設定し、外部と接続しようとします。そのため、学校や職場のネットワークなどだと、正常に動作しない場合があります。

各ノードは、IPアドレスリストというものを持っています。IPアドレスリストは表になっていて、ipアドレスとUnix時間が一対一で保管されています。

ビットコイン初期状態では5つのドメインが書かれています。そのドメインは開発者などが有志で構成しているドメインで、逆引きすると大量の色々なノードのAレコードが出てきます。
そのipアドレスは初期状態のIPアドレスリストに登録されます。

起動時にノードは、IPアドレスリストの中のだいたい8つのノードに接続を試みます。
そして、各ノードは一定時間ごとに、IPアドレスリストと、自分のUNIX時間を交換します。
これにより、お互いが接続しているノードと相手のUNIX時間がわかります。
これで近隣のノードからもらったIPアドレスリストを自分のIPアドレスリストにどんどん追加していきます。また近隣のノードのIPとUnix時間も保存します。

こうすることで、どんどんネットワーク中に「自分のIPアドレスと、交換した時点でのUNIX時間」が伝搬していきます。
こうして人からもらったIPアドレスリストの中で、今のUnix時間と一番近いものとどんどん接続するようにしていきます。そうすることで、必然的に自分とネットワークの伝搬が速いノードと接続することができます。

また、ビットコインのノードは、Tor(The Onion Router)のネットワーク上でも動作します。

これがビットコインのネットワークのノードの探索方法です。

## ビットコインのアカウントについて

ビットコインはいわゆる送金を行うのに、アドレスというもの（口座番号）が必要になります。
これは、ECDSAという、楕円曲線を使用する電子署名（DSA）を使って生成されています。RSA暗号などを知っている人はそれを思い浮かべてください。SSHとかで使う公開鍵暗号となんらかわりはありません。

ユーザーは、まずECDSAで鍵ペアを生成し、公開鍵をripmod160というハッシュ関数に掛けたあと、SHA256というハッシュ関数にかけます。これをBase58Check encodingというもの(Base64みたいな)に掛けて、出てきた文字列がアドレスになります。

ビットコインでは、この公開鍵のハッシュをエンコードした文字列、という奇妙なものと秘密鍵でセキュリティを保っています。

# まとめ

- ブロックチェーンはビットコインが元
- ビットコインはP2P
- IPアドレスの交換はリストを使っている
- ビットコインではECDSAという技術を使っている

今はあまり、とくにECDSAについてはさっぱり意味がわからないかもしれませんが、次回の「トランザクション編」や「マイニング編」できっと理解できるようになると思います。

次回: [ビットコインを学んでブロックチェーンを理解する【第二回 トランザクション】](https://qiita.com/onokatio/items/432356feef4d6f1aa8dd)