Ethereumのfull/fast/snap syncの違いについてより詳しく調べいたと思い、gethのソースを読み始めた。
が、なかなかにボリュームがあるのと、同期処理についてかなり複雑だったので、頭の整理のために解析中の内容をメモとして残しておく。
full/fast syncのプロセスについて
full/fast syncのプロセスはこの辺りにまとまってるっぽい。
https://github.com/ethereum/go-ethereum/blob/v1.10.2/eth/downloader/downloader.go#L559-L574
snap syncは別のパッケージにまとまってるが、呼び出し元がどこなのかちょっとよくわからない。。。
https://github.com/ethereum/go-ethereum/tree/master/eth/protocols/snap
Block headerのrequest部分
リクエストはこの辺りで行っている。最終的にはp2pのmessageを投げている。
https://github.com/ethereum/go-ethereum/blob/v1.10.2/eth/protocols/eth/peer.go#L443-L460
response受け取り部分
各packetの受け取り部分はここで分岐している。最終的にはdownloader.goのDeliver~~~メソッドで諸々の処理を行なってるみたい。
https://github.com/ethereum/go-ethereum/blob/v1.10.2/eth/handler_eth.go#L62-L105
ちなみに、snap syncの場合のresponse packetの受け取りは下記の部分。snapの場合はそもそもp2p messageが異なるので別で実装されてるっぽい。
https://github.com/ethereum/go-ethereum/blob/v1.10.2/eth/handler_snap.go#L46-L50