Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

以太坊源码照抄 eth/handler

哈哈笑417
99 0 0
不想写了,啊啊啊
6 D! B! F; r% ?) \1 e) k* x- Reth主要的同步txs,block,header的入口都在这个文件里
5 X% r( O) o+ e  @type ProtocolManager struct {
+ v- M8 y- p: ?  J        ...( v' t& C. N2 F4 v, @+ c8 r* f
        downloader *downloader.Downloader // 名字是downloader 其实是就是在接受到数据后插入数据库
  b* H: k2 d( Z$ g  k9 }        fetcher    *fetcher.Fetcher  // 声明新的块
$ p* j2 q& S! g1 P. C' d7 L6 {0 f% H        peers      *peerSet
  z6 D, c' x) ~  G4 y6 T9 ~        SubProtocols []p2p.Protocol& W0 O) o. D  ]  K# D( Z
        ...& v2 b. L. i, Z- A. e
方法 NewProtocolManager初始化一个ProtocolManager结构
$ }: }/ ^5 B1 f/ w9 l9 w; g+ v, X这一步有一个重要的内容就是append(SubProtocols, p2p.Protocols{})
: g& e( C8 h7 ^5 A2 h( ~  T& X' emanager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{/ ~+ p! b  p2 C5 `" n9 C
        Name:    ProtocolName,
, w+ u% Y1 E$ A* T' A        Version: version,: g; n4 J* T, p  w& L; t. R. C5 z
        Length:  ProtocolLengths,4 r/ m8 E& b; ]6 k& x
        Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {8 l( F8 T/ j$ g$ W2 s. K
                peer := manager.newPeer(int(version), p, rw)
0 f5 J4 a# A+ @# R( f  \4 x# ]( j. q7 G                select {
  S: h" A* [0 Y+ |- ?2 Y                case manager.newPeerCh
* U! s9 W" L1 w8 D0 e6 w' W8 z% [6 hfunc pm.handle()
2 O) y; F6 s- D. t# ?% n这里newPeerCh接收到peer后调用pm.handle, 与pm同步txs,同时p同步pm.whiteList中的header) @* {3 Q5 D  w% o; ^( s
for number := range pm.whitelist {
) t* T' X) V5 R' E        if err := p.RequestHeadersByNumber(number, 1, 0, false); err != nil {5 Z4 b1 e3 ]$ y7 Y- `. G  M
                return err
0 s# D7 w$ l' P) E% x- S) |, Z        }
4 y( J0 q" S: D" z7 e9 H}
2 c# _1 [  F6 B. N' }( }, |# y0 C6 e同时进入循环处理来自peer的消息
% I: K) }. @" Q3 f& W5 p6 J2 Rfor {4 U. P. W8 j4 b; d
        if err := pm.handleMsg(p); err != nil {5 |0 ^8 D; L/ {/ h) t% }
                p.Log().Debug("Ethereum message handling failed", "err", err)
. x4 T- E; X2 I/ t8 j                return err( E: I, @4 t5 V0 {
        }
7 n3 s( \6 V: I; t}) f, S% ]) ?2 _/ K# ~  L
func pm.handleMsg(p *peer)) c2 g# p+ n! P8 s3 J
这个函数根据msg, err := p.rw.ReadMsg() msg的类型做出不同的处理,塞到fetcher 或者downloader中去等等
4 s" Q! f- r, b  Qfunc.pm.BroadcastTxs(tx)
5 z8 T4 B- v5 R, P找到pm.peers.PeersWithoutTx(tx.Hash()) 然后把tx塞给他4 J- V0 q. r) ~3 n1 t9 U
这个函数在 接受到消息时就会被调用
8 S$ t' d4 J- M% Mfunc (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool)
9 c% u# ^' |5 P5 [2 _, l这个就如题吧
) I1 S3 Z" c1 r# n. t参数propagate为true就选出前Math.sqrt(peersLen)个节点,传播出块消息参数propagate为false 简单向所有节点声明我有这个块
+ t: t9 q* u! ]& Q8 }" k

! ^# F7 H  }2 {调用:range pm.minedBlockSub.Chan() 如果管道里有消息会执行以下代码
; `/ t" L& I2 {7 `( M5 e  V7 R7 wpm.BroadcastBlock(ev.Block, true)  // First propagate block to peers* I1 J  W' ^: C# {8 L% n% N3 ^
pm.BroadcastBlock(ev.Block, false) // Only then announce to the rest
# r# J& P9 Y0 C
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

哈哈笑417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11