Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

以太坊源码照抄 eth/handler

哈哈笑417
83 0 0
不想写了,啊啊啊2 ?/ M* `# }& U
eth主要的同步txs,block,header的入口都在这个文件里+ J+ }) J1 q# d% e
type ProtocolManager struct {) W8 f) v4 F, q$ S, A" D$ R3 m' n
        ...
: w$ ]: r1 ^, F$ P; @( A1 }        downloader *downloader.Downloader // 名字是downloader 其实是就是在接受到数据后插入数据库8 ~3 }( Q0 H. n$ W5 e
        fetcher    *fetcher.Fetcher  // 声明新的块  i6 [$ w8 [6 j: D; x* ^) L3 [+ K
        peers      *peerSet" V- L" Y7 B8 F4 H6 w. {
        SubProtocols []p2p.Protocol. _5 H) G# p+ h( h0 J9 \
        ...
5 W2 M0 S) f5 Z方法 NewProtocolManager初始化一个ProtocolManager结构
" B' B% }3 s9 }( [- f这一步有一个重要的内容就是append(SubProtocols, p2p.Protocols{})" @# w( N! o, `" [; @' L
manager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{
3 o4 s+ b( B, e$ ~7 p        Name:    ProtocolName,- A  o# y# w2 t/ }) g
        Version: version,2 D) x$ v' B6 X! c& Y( L  W1 ~
        Length:  ProtocolLengths,& b+ e! r3 C& n- L  B& y5 q  @/ u
        Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {
3 Z7 }- R9 ?7 `, d( b# x                peer := manager.newPeer(int(version), p, rw)
! D  Z3 A7 A% k+ q/ _; K2 J7 ~                select {* h3 d! `4 t1 e( ^/ o  J+ m
                case manager.newPeerCh / L2 K" g  \/ _& E: a
func pm.handle()
; v5 O& p; K7 F& a% k4 n5 O这里newPeerCh接收到peer后调用pm.handle, 与pm同步txs,同时p同步pm.whiteList中的header
  S( W+ C9 n/ O5 [) P7 Sfor number := range pm.whitelist {1 _4 x/ s9 P5 R7 r$ c8 {
        if err := p.RequestHeadersByNumber(number, 1, 0, false); err != nil {! n. y0 ~. h& G0 S
                return err4 T" Y# p, q: u; L( w8 @2 b
        }+ y8 m6 m  h5 I  ~. l& @
}3 _0 E% k# R6 z9 M. f
同时进入循环处理来自peer的消息& J. q$ c& S8 ]7 Y: x. d5 W. V4 |$ B
for {
2 }1 {4 t; j1 U. i- J        if err := pm.handleMsg(p); err != nil {
& z! U6 ]+ k% R8 |/ i$ J                p.Log().Debug("Ethereum message handling failed", "err", err)
% y' ~9 }- |% o% H; k                return err
, h8 X: ~2 Z; I( }- }        }- n/ v- ?5 H* `
}
& S3 v% _6 k# X& ifunc pm.handleMsg(p *peer). u! C/ {0 w3 }) s5 k  t
这个函数根据msg, err := p.rw.ReadMsg() msg的类型做出不同的处理,塞到fetcher 或者downloader中去等等
' n$ J1 y) y8 ]; J1 d0 h# e- O( Zfunc.pm.BroadcastTxs(tx)
7 \8 {! K! b# L7 X! V找到pm.peers.PeersWithoutTx(tx.Hash()) 然后把tx塞给他( V" Q) s9 @9 Q+ T0 Z
这个函数在 接受到消息时就会被调用7 O* d1 {; t; u9 |1 V0 H. t- ~
func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool)7 P2 n" c( r) z8 n5 W
这个就如题吧! i6 V1 \- e  b4 Q# i
参数propagate为true就选出前Math.sqrt(peersLen)个节点,传播出块消息参数propagate为false 简单向所有节点声明我有这个块
' f, E* J7 D# A$ l; p( e

; U7 n% @1 r$ \$ s' m/ K调用:range pm.minedBlockSub.Chan() 如果管道里有消息会执行以下代码$ k3 s; o3 a. T! v# N( N
pm.BroadcastBlock(ev.Block, true)  // First propagate block to peers
+ q: m5 t: j" Y1 d- v  o& C% mpm.BroadcastBlock(ev.Block, false) // Only then announce to the rest- H1 z5 \/ H! y* l. d1 |' |# k
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

哈哈笑417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11