ブロックチェーンbtcdを実行した際のプログラムの流れを最初から確認してみます。server.Start()btcdを実行すると、設定読み込んだり、データベースの準備したりしたあとに、サーバを作成し、起動します。サーバの起動は、server.goのStart()です。そこで、s.peerHandler()とs.rebroadcastHandler()と、s.rpcServer.Start()を実行してます。s.peerHandler()は、サーバーへのピアの追加と削除、ピアの禁止、ピアへのメッセージのブロードキャストなどのピア操作を処理するために使用されます。s.rebroadcastHandler()は、RPCサーバーが受信したユーザーtxがブロックに含まれるまで再ブロードキャストします。s.rpcServer.Start()は、RPCリスナーをスタートします。今回は、peerと接続し、ブロックをもらうまでの流れを確認したいと思います。peerHandler()を確認します。peerHandler()peerHandler()は、s.addrManager.Start()と、s.blockManager.Start()を実行してます。Managerという意味で、peerのアドレスを管理しているようです。addrManager.Start()は、まずloadPeers()を実行し、peers.jsonから既知のアドレスを読み込んでいます。その後、addressHandler()を実行しています。addressHandler()は、定期的に新しいアドレスを保存するっぽいです。P2Pなのでアドレスは常に複数の新鮮なやつをゲットしておく必要があります。savePeers()が実際にアドレスの保存をしているようです。addressHandler()は、savePeers()をdumpAddressIntervalに規定されている間隔(デフォルトで10分)で実行しつづけています。structのaddrNewを読み込んでるだけぽいので、別のところで、peerが送ってきたアドレスをこれに入れているのかもしれない。blockManager()blockManager.Start()は、blockHandler()を実行してます。blockHandlerはブロックマネージャのメインハンドラです。それはgoroutineとして実行する必要があります。それは、ブロック(MsgBlock)メッセージがメモリデータ構造をロックする必要なく単一のスレッドによって処理されるように、ピアハンドラとは別のゴルーチンでブロックメッセージとinvメッセージを処理します。これは、ブロックマネージャがどのブロックが必要か、またどのようにフェッチを進めるべきかを制御するので重要です。ブロックマネージャが、ブロックについて俺ここまで持ってんだけどお前は?みたいなやつのメッセージを作成したり、関連するメッセージを受信した場合のその解析等を行っているぽいです。connManager()peerHandler()は、addrManagerとblockManager以外に、connManagerもStart()してます。接続管理みたいな名前です。connManager.Start()の後は、チャネルの受信待ち状態になっています。connManager.Start()は、btcd/connmgr/connmanager.goにあります。managerを起動し、ネットワーク接続を開始します。connManager.Start()は、とりあえず、connHandler()を実行してます。connHandlerはすべての接続関連の要求を処理します。それはgoroutineとして実行する必要があります。handlerは、アクティブなアウトバウンド接続のプールを維持して、ネットワークに接続したままにします。接続要求は、割り当てられたIDによって処理され、マッピングされます。connHandler()実行後に、cm.cfg.ListenersのListener毎にcm.listenHandler(Listener)を実行します。その後、cm.NewConnReq()を実行しています。listenHandler()cm.listenHandler()のコードは下記です。managerのConfigは、下記があります。error)Listenersは、接続マネージャーが接続の所有権を受け取り、接続を受け入れるリスナーのスライスを定義します。接続が受け入れられると、接続と共にOnAcceptハンドラが呼び出されます。接続マネージャーはこれらのリスナーのネーションをとるため、接続マネージャーが停止すると閉じられます。OnAcceptフィールドも指定されていない場合、このフィールドは効果がありません。呼び出し元が着信接続を待機したくない場合は、nilになることがあります。OnAcceptは、インバウンド接続が受け入れられたときに起動されるコールバックです。接続を閉じるのは発信者の責任です。接続を閉じないと、接続マネージャが終了します。接続が依然としてアクティブであると信じており、したがって最大接続限界にまだカウントしているような望ましくない副作用を有する。このフィールドには、リスナーフィールドも指定されていないと効果がありません。その場合、受け入れ可能な接続が存在しない可能性があるからです。OnConnectionは、新しいアウトバウンド接続が確立されたときに起動されるコールバックです。GetNewAddressは、ネットワーク接続を確立するためのアドレスを取得する方法です。nilの場合、新しい接続は自動的に行われません。NewConnReq()cm.NewConnReq()のコードは下記です。}}新しいアドレスに接続してその結果を、cm.requestsチャネルに入れてます。requestsチャネルの受信を待ち受けているのが、connHandler()です。msg.conn)を実行してます。newServer()一番最初の、btcd/btcd.goでのserver.Start()の前にserverを、newServer()で作成していますが、このnewServer()内で、上記のonConnection()やOnAccept()やGetNewAddress()は設定されています。newAddressFunc,})newAddressFunc()newAddressFunc()のコードは下記です。address")}outboundPeerConnected()s.outboundPeerConnected()のコードは下記です。s.addrManager.Attempt(sp.NA())}inboundPeerConnected()s.inboundPeerConnected()のコードは下記です。s.peerDoneHandler(sp)}やっと、peerパッケージが登場しました。接続できたらNewOutBoundPeer()でアウトバウンド用peerを作成しています。peerパッケージは、peerを作って接続すると勝手に握手とかしだすらしいので、次はpeer同士の握手が確認できると思います。ソケット通信P2P通信をつくりたいので、ソケット通信やってみます。2引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。