Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

以太坊源码照抄 eth/handler

哈哈笑417
173 0 0
不想写了,啊啊啊
( ~2 f7 D9 f. Jeth主要的同步txs,block,header的入口都在这个文件里
7 F! h& i* \# x2 h" c6 Ptype ProtocolManager struct {
8 u1 v0 z8 f  N  \* Z( @) M        ...
' g* I- g& D9 d0 @* n& N        downloader *downloader.Downloader // 名字是downloader 其实是就是在接受到数据后插入数据库
' |7 t3 @7 q2 e& X- Z        fetcher    *fetcher.Fetcher  // 声明新的块4 z2 _" B& H* u
        peers      *peerSet
( ~# F5 H( f8 C; M9 B        SubProtocols []p2p.Protocol. F8 @5 G5 r: J# ?
        ...
  K. [: q/ ^3 M) K0 d9 M# B方法 NewProtocolManager初始化一个ProtocolManager结构
4 w) b1 V( H/ h% D) K8 K5 T: Z% [这一步有一个重要的内容就是append(SubProtocols, p2p.Protocols{})
/ s; r! c2 c0 ?  T! dmanager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{
  }* L. r' p, F! L4 y# B        Name:    ProtocolName,* s* Z) c5 m# d; j; ~" y
        Version: version,
& l1 X6 R  f3 y        Length:  ProtocolLengths,$ S: L9 I, {; @! [
        Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {
, i+ j' r0 o# G' @                peer := manager.newPeer(int(version), p, rw)- z3 y+ ~0 k/ E4 A& T
                select {8 R6 \' p: S4 E5 n2 f
                case manager.newPeerCh
6 b( b9 w  V9 p! T. Nfunc pm.handle(), v. ]1 n- g) `( J1 c
这里newPeerCh接收到peer后调用pm.handle, 与pm同步txs,同时p同步pm.whiteList中的header5 a6 x9 z( P" x4 ?& E
for number := range pm.whitelist {
. w( T: C+ b  p. `        if err := p.RequestHeadersByNumber(number, 1, 0, false); err != nil {9 w" u2 k9 u+ ^; X! g
                return err
( H% a) j3 y9 ?, \) x) D4 _        }
# V$ a, P) n2 I) t7 ?' M}
6 G( ^7 O8 S' m1 a8 v' u* S同时进入循环处理来自peer的消息
$ `9 b' k+ {& {) F0 `for {- G/ P1 g( @$ V
        if err := pm.handleMsg(p); err != nil {
: i  }4 s" ^! ]1 H0 z; ^  s" B                p.Log().Debug("Ethereum message handling failed", "err", err)
0 B* x; s8 F+ G) D4 I. N( y) }0 ^                return err
/ P8 c/ g, |7 i6 c( X        }
7 S0 d" W- T& ?6 V6 J/ y}& M/ S2 o2 p+ V+ Q4 a
func pm.handleMsg(p *peer)) O! M1 J5 O4 v& L
这个函数根据msg, err := p.rw.ReadMsg() msg的类型做出不同的处理,塞到fetcher 或者downloader中去等等  U+ R  m& H+ y4 a! t
func.pm.BroadcastTxs(tx)( c. H% c/ E9 O  w* H/ X4 J
找到pm.peers.PeersWithoutTx(tx.Hash()) 然后把tx塞给他
+ Y( b" b- u- o$ |, B& A/ m4 q这个函数在 接受到消息时就会被调用
% H" n% f5 Y2 P& |: jfunc (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool)
7 G+ ?; H' _. o3 H这个就如题吧; c; v) e9 n) G, E' p4 [! s  Y- O/ G
参数propagate为true就选出前Math.sqrt(peersLen)个节点,传播出块消息参数propagate为false 简单向所有节点声明我有这个块! H9 W! `" ^. N; |5 O8 I

: |: M. e' d* r调用:range pm.minedBlockSub.Chan() 如果管道里有消息会执行以下代码0 j+ u$ M4 O) N5 ~, f
pm.BroadcastBlock(ev.Block, true)  // First propagate block to peers6 |6 {5 N7 C! h# {/ n- J8 P! L
pm.BroadcastBlock(ev.Block, false) // Only then announce to the rest
; W0 F2 D2 D/ M1 G
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

哈哈笑417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11