読者です 読者をやめる 読者になる 読者になる

Tech と Culture

テクノロジーとカルチャー

翻訳: Network

続けてこっちも。

同じく適当なので自己責任で。

 

Network - Bitcoin Wiki

Network
 
Bitcoinトランザクションとブロックを伝達するために単純なブロードキャストネットワークを使用します。全てのコミュニケーションはTCP上で行われます。Bitcoinはポートパラメーターによって、8333以外の全てのポートを使用可能です。IpV6は Bitcoind/Bitcoin-Qt v0.7からサポートされています。
 
1 メッセージ
2 コネクション
3 標準リレー
4 最初のブロックダウンロード
5 SPVクライアント
6 ブートストラッピング
    6.1 Addr
    6.2 DNS
    6.3 IRC
7 ハートビート
8 他の参照
 
1 メッセージ
・version - プログラムのバージョンとブロック数の情報。最初に接続するときに交換される
・verack  - バージョンメッセージの応答として送られ、接続しようとしていることを知らせる
・addr     -  一つ以上のIPアドレスとポートのリスト
・inv        -  “私はこれらのブロック/トランザクションを持っています:…...” 通常は、新しいブロックもしくはトランザクションがリレーされる時のみ送られ雨r。これはリストのみであり、実データは含まれない
・getdata - 一つのブロックもしくはトランザクションのハッシュによるリクエスト
・getblocks - 一定範囲内の全てのブロックのinvのリクエスト
・getheaders - 一定範囲内の全てのブロックヘッダを含むheadersメッセージのリクエスト
・tx        - トランザクションの送信。getdataリクエストに対する応答としてのみ送られる
・headers   -  2000ブロックヘッダーまでの送信。Non-generators ブロック全体の代わりにブロックのヘッダーをダウンロードできる
・getaddr   -  (ブートストラッピングのための)アクティブピアのかたまりを含むaddrメッセージのリクエスト
・submitorder, checkorder, reply IP transactionで使用  ※現在は使用されていない
・aleart  - network alertを送る
ping - 何もしない。コネクションがまだ生きているかのチェックに使われる。コネクションが死んでいる場合、TCPエラーが発生する。
もっと詳細な技術情報はプロトコル仕様を参照のこと。
 
2 コネクション
ピアに接続するためには、自分のバージョン番号とブロック数、現在時刻を含むversionメッセージを送る。リモートのピアは、もしあなたのバージョンをによる接続を受け付ける場合は、verackメッセージを返答し、そしてリモートピア自身のversionメッセージを送ってくる。もしあなたが彼のバージョンからの接続を受け付ける場合は自分のverackメッセージを返す。
あなたの全てのピアからの時刻データは集められ、median値が(versionメッセージ以外の)Bitcoin内で時刻を使用する際に使われます。
その後、”getaddr”と”addr”メッセージを交換し、全ての知らないアドレスをストアします。 “addr”メッセージはしばしば一つのアドレスのみを含みますが、時々1000個以内のアドレスを含みます。これは交換の初期では普通のことです。
 
3 標準リレー
 誰かがトランザクションを送る時、それを含むinvメッセージを全てのピアに送ります。それらのピアはgetdataで完全なtransactionデータを要求します。それを受け取った後、もしtransactionが有効であると考えれば、彼らは彼らの全てのピアにinvメッセージでtransactionをブロードキャストします。それが続いていきます。ピアはtransactionの要求やリレーは、すでにそのtransactionを持っていない場合のみ行います。transactionはしばらくしてブロックに含まれていくとともに忘れられていくのですが、ピアは決してすでに知っているtransacctionを再ブロードキャストしません。ただしtransactionの送付者と受信者は再ブロードキャストを行います。
generatingしている(?)ものは誰でも、受信した正当なtransactinを収集し、それをブロックに含めようと働きます。誰かがブロックを発見した時、上記と同じようにそれを含むinvを全てのピアに送付します。transactionsの時と同じように働きます。
全ての人は24時間毎に、自分のIPアドレスを含む”addr”メッセージをブロードキャストします。ノードはこれらのメッセージを2つのピアにリレーし、もしそれが新しいものであるあるならばストアされます。このシステムを通して、全ての人が、ある瞬間にどのIPアドレスが接続しているかクリアな概要を持つことんいなります。ネットワークに接続したのち、あなたの最初の”addr”メッセージで全ての人のアドレスデータベースにほとんど瞬時に加えられます。
ネットワークalertは”alert”メッセージによってブロードキャストされます。”inv”のようなシステムは使われていません;これらは全てのalertを含んでいます。もし、受信したalertが有効な場合(誰かのprivate keyで署名されています)、全てのピアにリレーされます。alertが有効であるかぎり、全ての新しいコネクションに対して再ブロードキャストされます。
 
4 最初のブロックダウンロード
コネクションの最初に、あなたが知っている最新のブロックのハッシュを含む”getblocks”メッセージを送付します。もしピアがそれが最新ブロックではないと考えた場合、あなたがリストした先の500個のブロックを含む”inv”メッセージを送付します。そこで、あなたはこれら全てのブロックを”getdata”でリクエストします、ピアは”block”メッセージでそれらをあなたに送付します。あなたが、これらのブロック全てをダウンロードして処理したのち、全てのブロックを得るまで、あなたは次の”getblocks”メッセージを送付します。
 
5 SPVクライアント
BIP0037はSimple Payment Verificationによる軽量クライアントを紹介しています。SPVクライアントは残金の存在を検証するのに、完全なブロックの内容をダウンロードする必要がなく、そのかわりにブロックヘッダのチェインをリレーし、他のノードから必要なデータを得るためにbloom filterを設定します。これらのクライアントの方法は、フルノードと非常にセキュリティの高いtrustlessなコミュニケーションを可能にしますが、SPVクライアントが探している情報はどのアドレスなのかをピアが推論することに対して少し高価なプライバシーを必要とします。
MultibitやBitcoin Walletは基礎にbitcoinjライブラリを使用した、このような方法で動くwalletです。
 
6 ブートストラッピング
あなたはどのピアに接続するかを、あなたのアドレスデータベースを最後にアドレスを見た時刻によってソートし、すこしだけランダマイズして選びます。
Bitcoinはピアを見つけるのに3つの方法があります。
 6.1 Addr
上で説明されている“addr”メッセージは、IRCブートストラッピング方法とにたような効果を作り出します。ピアが参加したら必ず、早い時間に知ることができます。ただし、ピアが離脱した時はしばらくの間知ることができません。
Bitcoinは”seed nodes”として知られているアドレスリストからも立ち上げられます。もしあなたが、IRCに接続できず、一度もネットワークにつなげていない場合、クライアントはアドレスデータベースをこのリストのノードの一つにつなぐことによって更新します。
-addnodeコマンドラインオプションをマニュアルでノードを追加することに使用できる。 -connectオプションはbitcoinを特定のノードに接続することを強制する。
6.2 DNS
Bitcoinは幾つかのホスト名のIPアドレスDNSに問い合わせ、これらをアドレスのリストに追加する。これはv0.6x以降のデフォルトのseedingメカニズムである。
6.3 IRC
v0.6xのBitcoinクライアントはIRCブートストラッピングはもはやデフォルトでは有効になっていない。以下の情報は古いバージョンのために記す。
Bitcoinirc.Ifnet.orgの#bitcoin00から#bitcoin99の間のチャンネルにランダムに参加する。あなたのニックネームはあなたのIPアドレスからエンコードされている。チャンネルにいる全てのユーザのニックネームをデコードすることによって現在Bitcoinに接続しているIPアドレスのリストを得ることができる。
ポート6667で外部に接続できないサーバーのため、Ifnetサーバはポート7777でもリッスンしている。
 
7 HeartBeat
クライアントがなんらかのメッセージを発してから、もし30分以上過ぎていれば、ピアノードへのコネクションをキープするためメッセージを送信する。
もし、ピアノードと何らかのメッセージでコミュニケートしてから90分以上過ぎていれば、クライアントはコネクションが閉じたと判断する。