Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

以太坊源码照抄 eth/handler

哈哈笑417
88 0 0
不想写了,啊啊啊: O% w0 H: Q: _
eth主要的同步txs,block,header的入口都在这个文件里" g6 V% l# I6 b5 j( A( H
type ProtocolManager struct {
: @# \0 d, y+ c, x! K3 W        ...9 t: m8 C4 I, U1 i) G
        downloader *downloader.Downloader // 名字是downloader 其实是就是在接受到数据后插入数据库  d, f( h. G  W$ M" @" s
        fetcher    *fetcher.Fetcher  // 声明新的块7 l* ~( \2 q# R5 z5 {1 X
        peers      *peerSet
# D, A5 e) i8 o* b7 j2 r        SubProtocols []p2p.Protocol9 Q- m/ n8 d: ]" ~' q1 ?2 A4 n8 j7 @
        ...
' P: I0 P+ m% u5 Q& U* A方法 NewProtocolManager初始化一个ProtocolManager结构8 y$ P: k9 U' a
这一步有一个重要的内容就是append(SubProtocols, p2p.Protocols{})
% G* k# m# a; x' emanager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{
! m  V  y! o+ ?* ?: o  ?: }- M2 z        Name:    ProtocolName,) p+ ~" W: G; y
        Version: version,) P2 s9 Q4 u% ~. ^4 h. _% d
        Length:  ProtocolLengths,
7 `0 [9 _4 D6 G        Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {
' ?# x/ ?2 P" G9 H4 J! _                peer := manager.newPeer(int(version), p, rw). K& }2 b$ M% A5 _9 M, Q0 t
                select {6 j7 j/ Z' ]( {6 [+ {8 W
                case manager.newPeerCh
) ^- u) i. }( A8 J  kfunc pm.handle()+ W$ r% e% k- J4 N/ F; R
这里newPeerCh接收到peer后调用pm.handle, 与pm同步txs,同时p同步pm.whiteList中的header
3 @4 E4 F$ K* h+ Q* f; efor number := range pm.whitelist {) _( H7 f9 D/ P( B- R
        if err := p.RequestHeadersByNumber(number, 1, 0, false); err != nil {7 b( F) M( r6 c1 Q4 c
                return err$ Q% c0 I) p" b. J) F% A3 R% ^
        }
! D' M1 l) g) k# A! e}$ P" O/ {' s! [% z, S: L
同时进入循环处理来自peer的消息: ?5 G) ?3 o* b5 f6 \
for {
1 s8 W  A; _; g2 g        if err := pm.handleMsg(p); err != nil {
3 I/ Z- D3 ]" N; l+ P/ E7 B; r# F                p.Log().Debug("Ethereum message handling failed", "err", err)
5 i6 J9 H5 d) @9 Y                return err
4 h. l8 ]6 X' x1 t) y        }1 q3 I$ J" ?3 i+ Q( i/ q
}5 Q# K/ ?) }# Y. V# B
func pm.handleMsg(p *peer)
1 J$ C6 m9 m5 H8 Z这个函数根据msg, err := p.rw.ReadMsg() msg的类型做出不同的处理,塞到fetcher 或者downloader中去等等
6 i$ c' Q! f$ h1 i; `8 ]func.pm.BroadcastTxs(tx)  P7 M2 c. k  j( `. E) u
找到pm.peers.PeersWithoutTx(tx.Hash()) 然后把tx塞给他
6 B; }' m; b+ W7 ^  i这个函数在 接受到消息时就会被调用6 f: w# K$ g7 E5 {2 P4 y& t
func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool)1 W! e* O- ~1 P7 X
这个就如题吧
7 q1 V( v& J9 A$ M& o6 v参数propagate为true就选出前Math.sqrt(peersLen)个节点,传播出块消息参数propagate为false 简单向所有节点声明我有这个块
$ `0 l6 @5 E& G1 U0 V' n
" T' g& J. `% d8 H6 n
调用:range pm.minedBlockSub.Chan() 如果管道里有消息会执行以下代码
. ]9 o( X* Y, W$ Qpm.BroadcastBlock(ev.Block, true)  // First propagate block to peers
1 c- Q0 ?" c$ c! kpm.BroadcastBlock(ev.Block, false) // Only then announce to the rest0 v9 k1 W0 Y! f. P; J" l# i
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

哈哈笑417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11