Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

以太坊源码照抄 eth/handler

哈哈笑417
104 0 0
不想写了,啊啊啊
' r5 |1 B( X* B1 c# r. Qeth主要的同步txs,block,header的入口都在这个文件里
/ d; R1 r( l- Ctype ProtocolManager struct {. E4 |3 s" @0 G. ~+ @
        ...2 f) D% Q& q# k) Q* Q5 o0 V6 w& c
        downloader *downloader.Downloader // 名字是downloader 其实是就是在接受到数据后插入数据库  b% x7 a* ~8 F/ u: m) c
        fetcher    *fetcher.Fetcher  // 声明新的块2 Q- N; l" d. A: m4 J9 p! c
        peers      *peerSet9 |- k6 d# E' R" E" b  S
        SubProtocols []p2p.Protocol
- P7 V2 f) a+ ?& z1 w        ...4 }3 J8 u( Z' S) J
方法 NewProtocolManager初始化一个ProtocolManager结构
. O. [2 U3 x' R1 I1 n. l* a* _这一步有一个重要的内容就是append(SubProtocols, p2p.Protocols{})5 {2 W& ]! T2 M" i; D* e$ D- _
manager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{. |7 X4 k( H6 R1 S: W
        Name:    ProtocolName,1 P2 s* C; Z: g3 n! Z( L
        Version: version,
' q) r1 Y/ W  w0 u1 A        Length:  ProtocolLengths,
) q5 z3 G0 N. y" Z& J        Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {4 n, D/ K& y. q5 Y2 i0 L- r- `
                peer := manager.newPeer(int(version), p, rw)/ D* Z- Q" N  Q0 n
                select {
# Z, j& Y- ?" _. P! V9 ^, L                case manager.newPeerCh 2 `7 v6 _6 L( M2 T& l3 J' o2 J
func pm.handle()  \; @" o. V, g9 s1 z
这里newPeerCh接收到peer后调用pm.handle, 与pm同步txs,同时p同步pm.whiteList中的header
6 P+ Y  p' C1 r9 l, L/ yfor number := range pm.whitelist {
, W( P: [5 v9 W6 p7 ]4 O/ J        if err := p.RequestHeadersByNumber(number, 1, 0, false); err != nil {  H2 R9 B; i: p( k
                return err; m- a+ K5 s1 L. c2 _5 e" t
        }! j6 w5 G+ n+ J. Z, W, I
}' U5 e: `1 ^& w; M& W$ v
同时进入循环处理来自peer的消息6 k5 D2 ~1 H* j! V( l! ~# X0 C* X
for {- c  S2 @& ^7 _
        if err := pm.handleMsg(p); err != nil {, a7 m) c6 z/ G  ^- c7 b
                p.Log().Debug("Ethereum message handling failed", "err", err)
! _5 y( h. T5 R                return err
# o5 e+ K8 Y/ J        }
! e+ B  ?2 R: U; f, M}
/ _) J; G: R$ K/ O( Zfunc pm.handleMsg(p *peer)
; l0 f, r. r/ _这个函数根据msg, err := p.rw.ReadMsg() msg的类型做出不同的处理,塞到fetcher 或者downloader中去等等( ?9 X6 q7 k" u' d  A5 I( u% r3 [5 h
func.pm.BroadcastTxs(tx)
( W; P# c$ v9 ^1 X9 ]3 s找到pm.peers.PeersWithoutTx(tx.Hash()) 然后把tx塞给他
6 d# Y; V: _2 I- l3 p2 B, I* U这个函数在 接受到消息时就会被调用1 @$ B9 c  s  g& S( v+ X# Q& Y' u
func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool)
# ^5 g; n6 k% y这个就如题吧6 ^  o; R4 ]' B9 ?2 ^; Q
参数propagate为true就选出前Math.sqrt(peersLen)个节点,传播出块消息参数propagate为false 简单向所有节点声明我有这个块
% T$ B$ F9 o( U& S4 {
' T  p, A* l: s# M8 b* H- P% a7 v
调用:range pm.minedBlockSub.Chan() 如果管道里有消息会执行以下代码: d: M  F$ I) t9 ~  m4 F
pm.BroadcastBlock(ev.Block, true)  // First propagate block to peers
, G# W# I  K' O. N- Fpm.BroadcastBlock(ev.Block, false) // Only then announce to the rest
+ P" ?) m6 N+ A6 t7 ^
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

哈哈笑417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11