見出し画像

未来のために学んでおきたい。「Blockchain (ブロックチェーン) 」の概要8.Bitcoinネットワークデータ共有

トランザクションデータがネットワークに流れる仕組み


トランザクションデータをノードに送る、ノードとはスマホやPCなどのデバイスのこと。ノードが他のノードに送って、ネットワーク全体に送られる。
こういった個人間で、相互にネットが繋がっていることをP2Pネットワークと言う。昔はカボスやウィニーが流行ったがあれも、P2P。

なぜP2Pネットワークを使っているの?
中央期間のいない、自由な経済圏を作りたい!管理する人がいない、個人情報も渡さなくてよい。 取引を中央で管理するのではなく、P2Pで保存しようという非中央集権の考えをもっているから。

ノードを詳しく解説

ノードの機能は4種類
1.ウォレット機能 - お金の支払い、残高の管理なども
2.マイニング - マイナーがトランザクションデータをマイニングする
3.フルBCDB -すべてのトランザクションデータをすべて共有していること。
4.ルーティング - ノードが他のネットワークに接続する機能。

ノードの種類
1.フルノード
- 4機能をすべて持っている。Bitcoin coreが代表的
オープンソースなので、誰でも使える
2.SPVノード - Simplified Payment Verification ウォレット機能に特化したノードのこと。BCをもっていない。自分の取引データのみを持っている。とても容量の軽いノード
3.ソロマイナー - マイニングノードを持っている。BCを持っている。複数人でマイニングするノードをプールマイナーと呼ぶ。

新しいノードが立ち上がったときのネットワークとの接続

スマホのウォレットアプリが新しく接続した時に、ノードは立ち上がる。
ノードが立ち上がる時に、DNSサーバーに問い合わせをする。
DNSサーバーとは、ノードの管理をしているサーバー。このDNSサーバーにはいくつか種類がある。そしれ、それぞれがノードのアドレスを管理している。BCのコードにハードコーティングされている、つまりウォレットが覚えているから、どんなノードでも知ることができる。
新しいノードが立ち上がり、DNSサーバーにフルノードのIPアドレスをリクエスト、  すると値が返ってくる。これで新ノードは他のIPアドレスを知る事ができた。
IPアドレスはインターネットの住所。これがわかると、接続したり、通信ができるようになる。

フルノードのIPアドレスがわかったので、そこに接続をしにいく。
1.新はフルノードに自分のノード情報をおくる。BCでは、ノード情報を送ることをversionという信号で送信。
2.受け取った信号をフルノードは新に返すverackと言う。
3.続けて、フルノードは新に自分のIPアドレスを送信。
4.新からフルノードに受け取ったサインを返すverack

フルノードのIPがわかると、新は他のIPの情報をフルノードにもらいにく。
getaddr。するとリクエストに対して、addrという信号で返信をする。
同時にフルノードは新ノードの情報を他のノードに送信する。
他のアドレスを受け取った新ノードは、前回と同様その他のノードに最初と同じ段取りで送信(version)する。これを繰り返しつながっていく。

新ノードがフルだった場合、BCをダウンロードしにいく

新ノードがフルノードだったとき、ネットワークのBC情報のすべてをダウンロードする。
どういったやりとりをするかというと
1.新はフルにブロッグヘッダを要求。getheaders
✳︎ブロッグヘッダはマイニングしたときのブロックのすべての情報のこと。
2.フルは新に2000個のheaders情報を送り変えす。一度に沢山おくると接続が切れる可能性があるため。
3.新は次の2000個のリクエスト。BCは数珠つなぎになっているから、これが可能。
4.新はすべて受け取ると、ブロックの本体の情報をリクエストする。これは、ブロックの中のトランザクションの全データになる。getadata
5.フルは新に対して、返す。bloc

新ノードがSPVノードだった場合、どのように接続されるのか。

新しくSPVが立ち上がると、他のノードと繋がる。自分に必要なデータをダウンロードする仕組み。
1.すべてのブロックヘッダをダウンロード。このデータはブロックの中でも軽量で1/1000くらいの情報。
2.トランザクションデータの中で、自分の取引に関わるデータをダウンロード。自分の取引が正しいかを検証するために、自分に関係する物だけダウンロード。

SPVノードのissue1
・お金を受け取ったときに、そのお金は使用できるものか検証することがでない。
inputの参照元のoutputが本当に存在しているかわからない。
SPVノードは全取引のデータを持っているわけではないから、UTXOのデータプールがなく、未使用か判断できない。

しかしspvノードも使えるお金かどうか検証したい!
なにをするのかというと
1.inputの参照元になったトランザクションデータが正しいか確認。このデータをダウンロードして確認している。
2.inputの参照元になったトランザクションデータがブロックに含まれているか確認。ブルームフィルタを使用。
3.inputの参照元になったトランザクションのoutputが他に使用さてれていないかを確認。6こ以上のデータが積み上がったのかを確認。

SPVノードのissue2
・身元がバレる
SPVノードが管理しているアドレスの、トランザクションデータをフルノードがから取得したい。そのために、フルノードにリクエストをする。
ウォレットがトランザクションデータをリクエストしたさい、フルノードはアドレスは一般に公開されていて、そのアドレスはいくら交換していて、今どれくらいの金額があるか、予想がついてしまう。アドレスとウォレットが結びつく危険せいがある。

この問題をブルームフィルタが解決
特定のトランザクションデータがどのブロックに含まれているかの確認と、それらをプライバシーを守って入手できるもの。
やり方は、探しているアドレスを隠しながら、特定パターンのトランザクションデータをフルノードに確認。その中から、いるデータだけ抽出し、いらないものは捨てる。

ブルームフィルタの仕組み
データが含まれていないことを確実に判断できる特徴がる。この特徴をつかい欲しい情報をひきだしている。
1.フィルタの作成 アドレスをハッシュ関数にかける。 
2.1のデータが含まれているかチェック。

SPVノードはブルームフィルタをどう使っている? 
1.SPVはフルにブルームフィルタをセット(フィルタをセット)
2.SPVはフルにフィルタに合うデータのみリクエスト
3.フィルタにマッチしたブロックをSPVに返す。(マークルブロック)
4.関係していると思われるトランザクションデータをSPVに返す。

トランザクションがネットワークに流れているところを細かくみる
ノードAは新しいトランザクションデータがあると、他のノードBにinvで伝える。送られてきたノードBはそれに対して、データをちょうだい!ってことでgetdataを送る。AはトランザクションデータtxをBに送る。
データに問題がなければ、Bは新しいトランザクションあるよ〜とCに伝えていく。こうやってトランザクションは広がっていく。

トランザクションプールとは?
ブロックに格納されていないトランザクションはトランザクションプールに保存される。ノードはトランザクションデータをフルノードにおくり、フルノードは一つ一つがトランザクションプールという機能を持っているので、そのプールの中に受け取ったトランザクションデータをいれていく。
マイナーはトランザクションプールを参照し、その中からトランザクションをブロックに格納し、そのあとトランザクションプールからデータを削除する。
✳︎UTXOプールとは全く違うもの。
UTXOプールは検証済みアウトプットだけを含む(未使用)
トランザクションプールは未検証アウトプットだけを含む


この記事が気に入ったらサポートをしてみませんか?