Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

以太坊源码照抄 eth/handler

哈哈笑417
84 0 0
不想写了,啊啊啊! k, t8 z  O, `4 j6 o. t
eth主要的同步txs,block,header的入口都在这个文件里8 u" [8 r0 M5 s/ ], k6 F, R
type ProtocolManager struct {
4 Z' a5 n* |4 D0 N5 A& ^: V, L        ...
2 _" H7 I& N% v% w( L        downloader *downloader.Downloader // 名字是downloader 其实是就是在接受到数据后插入数据库
; F8 G7 c8 p3 s; ~" F        fetcher    *fetcher.Fetcher  // 声明新的块! h2 s7 w$ J/ H4 z* j
        peers      *peerSet5 ^% w- m/ K. p/ e
        SubProtocols []p2p.Protocol
$ Q0 H) S( D! L        ...  A* O5 h/ x0 L! h; H1 S5 d* G
方法 NewProtocolManager初始化一个ProtocolManager结构. H5 c; D3 J/ u: s% M( [
这一步有一个重要的内容就是append(SubProtocols, p2p.Protocols{})
3 M3 y" s) |% Emanager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{
4 w# x# H1 o( Z2 a/ `, G        Name:    ProtocolName,9 I. Y, D' e; F/ z+ y
        Version: version,9 C( n. v7 U1 V9 R6 B
        Length:  ProtocolLengths,
. k6 \, W/ J2 Q. g% U        Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {2 j! _1 L9 ]8 m* L. c0 d5 M
                peer := manager.newPeer(int(version), p, rw)9 ^1 u& `2 D' m9 X5 ~4 b  \4 g
                select {
* `: q7 K4 w" b2 J+ D" a3 Z4 l6 W' n                case manager.newPeerCh
- u' R- S- A/ q  @/ \! Zfunc pm.handle()
5 C' M& l' H& Y; w2 r- V这里newPeerCh接收到peer后调用pm.handle, 与pm同步txs,同时p同步pm.whiteList中的header
/ V* m/ U% s' ~- pfor number := range pm.whitelist {
2 k, v6 P; Z" l: ?$ S6 p( @( Z* L, t7 d        if err := p.RequestHeadersByNumber(number, 1, 0, false); err != nil {
' W) b/ ]7 z$ z; S% s6 V) Q/ ]0 l                return err0 Y  I7 `0 E3 m8 R# }$ ^# L
        }
3 q. [/ j7 @$ L}
6 H$ W& J) I! p( Y% L6 ~  P1 L同时进入循环处理来自peer的消息( t! i. i  c6 z0 ~; x+ h8 C
for {
" b  g3 F4 j( V  B9 \! n        if err := pm.handleMsg(p); err != nil {! Y3 J' A1 p2 v' n& [" \7 ?
                p.Log().Debug("Ethereum message handling failed", "err", err)" |. V# e# P" @& W: T  h
                return err
. N: ?) S0 G1 S4 f6 ~% i! J4 l        }$ h& V; _2 a: Y+ W. F5 W, b
}
  `" q6 h# r* P0 jfunc pm.handleMsg(p *peer)
" [* ~( d9 k* P$ W! v/ o) v这个函数根据msg, err := p.rw.ReadMsg() msg的类型做出不同的处理,塞到fetcher 或者downloader中去等等/ k1 y) [7 j. ~% \$ ?
func.pm.BroadcastTxs(tx)
7 l" M2 Q) E, @3 t' i  M找到pm.peers.PeersWithoutTx(tx.Hash()) 然后把tx塞给他* Q4 }$ J- [$ w. A
这个函数在 接受到消息时就会被调用
  K4 `/ Z) n  I& ufunc (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool)) x5 f' A7 ], k% T/ a
这个就如题吧+ v& B8 h' E- U6 @3 v, e. o
参数propagate为true就选出前Math.sqrt(peersLen)个节点,传播出块消息参数propagate为false 简单向所有节点声明我有这个块
3 Z; B) r6 M% ~; _0 U2 U+ ?/ T
0 y8 X3 h$ N, j% }
调用:range pm.minedBlockSub.Chan() 如果管道里有消息会执行以下代码
% r- [% [  D6 O5 k2 Cpm.BroadcastBlock(ev.Block, true)  // First propagate block to peers
5 V! O2 }( D( |; Gpm.BroadcastBlock(ev.Block, false) // Only then announce to the rest
' ?: t: Z9 }: Z+ c( z8 T% J4 ]
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

哈哈笑417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11