Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

以太坊源码照抄 eth/handler

哈哈笑417
162 0 0
不想写了,啊啊啊
! U4 [7 S7 o5 _eth主要的同步txs,block,header的入口都在这个文件里& f' V( q$ L7 e5 H6 Y
type ProtocolManager struct {
6 L$ i* u3 a( U0 L0 \        ...
& g) f7 ^* @% g8 \; @7 J        downloader *downloader.Downloader // 名字是downloader 其实是就是在接受到数据后插入数据库9 o: }5 Y% Q* X3 g; q/ I
        fetcher    *fetcher.Fetcher  // 声明新的块
! u% w5 r; g6 |9 j2 f3 X        peers      *peerSet
. u9 c3 n4 ]3 {% B        SubProtocols []p2p.Protocol
' f% g' r' `. `        .../ Z! p. T% D7 L. ?8 U' m
方法 NewProtocolManager初始化一个ProtocolManager结构
1 k: \; ^# i7 y这一步有一个重要的内容就是append(SubProtocols, p2p.Protocols{})' W/ u1 q) g2 N4 E3 t
manager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{
! }% S5 H% O+ g: r        Name:    ProtocolName,
( K: |* e) k7 P; P; F7 ~! T" x( y# t        Version: version,
: w0 J: C% C" g5 X/ S" o' W1 s" t* z        Length:  ProtocolLengths,
5 Q0 ~- n5 i3 o0 G2 T6 @7 x        Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {
5 @2 J0 X9 j. [% i+ g! W6 p                peer := manager.newPeer(int(version), p, rw)2 C3 _, B. n9 c4 F' {
                select {& W! q2 ]0 W% ~/ \1 ^
                case manager.newPeerCh
% }9 V: s+ i6 L/ N+ Wfunc pm.handle(); H- @" p4 |6 }7 o
这里newPeerCh接收到peer后调用pm.handle, 与pm同步txs,同时p同步pm.whiteList中的header& L9 _3 K2 |* C9 p
for number := range pm.whitelist {: ?3 c* ?; V0 \+ C
        if err := p.RequestHeadersByNumber(number, 1, 0, false); err != nil {/ ]4 \/ e  z9 d
                return err
; g! l& P, m, h; I# i        }' s0 o+ l0 P" `
}
) C5 Q* ?" h+ \$ r$ S; I1 N同时进入循环处理来自peer的消息
& B5 D( ^. r+ rfor {: \# P2 B; M! L8 T0 ^4 j+ U* c
        if err := pm.handleMsg(p); err != nil {0 E1 L- J8 n" H  B5 H/ J3 l
                p.Log().Debug("Ethereum message handling failed", "err", err)
9 ~- g- K( T- c% [                return err$ ~1 d$ p8 `% l$ g& ^
        }
' x3 y3 S) z$ o5 U) j}
+ t+ c0 r4 f6 z1 tfunc pm.handleMsg(p *peer); N* k& [+ B( P$ u. X% s! |, K
这个函数根据msg, err := p.rw.ReadMsg() msg的类型做出不同的处理,塞到fetcher 或者downloader中去等等- t& |0 c" [2 k: C6 w' ?
func.pm.BroadcastTxs(tx), D/ k# [; w' s, C# J6 O( i
找到pm.peers.PeersWithoutTx(tx.Hash()) 然后把tx塞给他) b8 h6 i! `; L  t& x" b
这个函数在 接受到消息时就会被调用
3 L: U; ?- l% L$ ]/ j$ }func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool)# z( h4 D6 c& I# T' v
这个就如题吧( _$ r# H' ?7 P5 [& G8 a; k5 o
参数propagate为true就选出前Math.sqrt(peersLen)个节点,传播出块消息参数propagate为false 简单向所有节点声明我有这个块
* K+ ^  {- i3 O9 k% E4 k$ \' y
3 O" W  V: |6 _5 B& |6 w5 u
调用:range pm.minedBlockSub.Chan() 如果管道里有消息会执行以下代码
4 R' C6 r( z! R: c  E. Npm.BroadcastBlock(ev.Block, true)  // First propagate block to peers
. V8 V' d: r. f' U; apm.BroadcastBlock(ev.Block, false) // Only then announce to the rest. r1 c2 Q7 M  O
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

哈哈笑417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11