Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

以太坊源码照抄 eth/handler

哈哈笑417
140 0 0
不想写了,啊啊啊
# G# k" s# b5 ]2 X- R7 [+ leth主要的同步txs,block,header的入口都在这个文件里2 @/ X! D* p" U8 y3 s5 p$ V
type ProtocolManager struct {: D8 [, a9 M1 p7 G1 o
        ...
  |2 {7 D  @% H7 `- @        downloader *downloader.Downloader // 名字是downloader 其实是就是在接受到数据后插入数据库3 K; Y- e! X1 Y
        fetcher    *fetcher.Fetcher  // 声明新的块2 b& F0 H+ j" K  u/ e$ e
        peers      *peerSet
' E# M6 R! g1 _: B7 c        SubProtocols []p2p.Protocol
' \  R3 S. z6 V5 }- r; C; l  z        ..." X; M- v$ \6 @6 Z2 A4 Y
方法 NewProtocolManager初始化一个ProtocolManager结构: {% @3 k3 _* ?; L8 I7 X
这一步有一个重要的内容就是append(SubProtocols, p2p.Protocols{})& U; x3 \! B( U* l$ r$ B; d4 b/ B& R* I
manager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{4 m* l" r6 w+ b4 f% w4 V+ ]- f' B
        Name:    ProtocolName,
, J" p3 L. E) B( Z% L  X        Version: version,/ g! m  k/ W; [0 `8 e
        Length:  ProtocolLengths,
3 C. D% [6 P' m' v/ d        Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {: G! T+ f3 @( c3 [( o
                peer := manager.newPeer(int(version), p, rw)
. `9 Z5 e# M( [+ |  s: X+ X                select {$ I3 s2 A1 a4 e3 V$ c& t* k. x8 X& j: M
                case manager.newPeerCh
+ K2 ^5 g: w) i6 @4 A, @! bfunc pm.handle()
$ ?. {$ n- p4 c2 M: J6 T这里newPeerCh接收到peer后调用pm.handle, 与pm同步txs,同时p同步pm.whiteList中的header6 ^8 h; k) }( t. @3 X1 n
for number := range pm.whitelist {
( q4 ~, D" S1 A2 h        if err := p.RequestHeadersByNumber(number, 1, 0, false); err != nil {# B5 y8 s. J3 N5 A2 G. h9 h- Z
                return err6 }7 y; P5 F4 m) x
        }4 I/ o6 `7 M* A3 N
}
) z5 K; u; b! ?# R0 Q同时进入循环处理来自peer的消息
& h; p' C) ]! c$ z. o, u; r/ y% @  rfor {# O. E0 s6 }  @6 U% c5 o  h- f2 p$ y# p
        if err := pm.handleMsg(p); err != nil {
& A. V  C& O! x  f" A3 m                p.Log().Debug("Ethereum message handling failed", "err", err)% P, T# p' E, O2 b. D6 ]( T
                return err
  ~) d0 T( \% s" I        }* @0 Q1 b; I/ {- d  v6 W7 c
}8 g: X- Q, O$ C
func pm.handleMsg(p *peer)$ p* [4 k  {) {& [
这个函数根据msg, err := p.rw.ReadMsg() msg的类型做出不同的处理,塞到fetcher 或者downloader中去等等( W5 a' m1 c0 f1 e1 K% |2 N' B
func.pm.BroadcastTxs(tx)1 K. ]1 ?4 G: a( |, r# Z  D6 d
找到pm.peers.PeersWithoutTx(tx.Hash()) 然后把tx塞给他8 m0 t+ h6 q6 r( Z8 i/ D9 A
这个函数在 接受到消息时就会被调用4 O1 S& H8 A. U2 T! y
func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool)
0 \6 |) ~$ Y! R8 v; C这个就如题吧8 m- w6 V% L+ t7 {7 d: @. m
参数propagate为true就选出前Math.sqrt(peersLen)个节点,传播出块消息参数propagate为false 简单向所有节点声明我有这个块* K0 }/ M, {4 Y  b+ n0 z

0 S- |5 H  ]6 e8 D4 B, c! s调用:range pm.minedBlockSub.Chan() 如果管道里有消息会执行以下代码+ _" `$ [: v# h. ?/ w- [5 \3 f
pm.BroadcastBlock(ev.Block, true)  // First propagate block to peers
- T& a2 s- z" ?0 X6 J9 B# ~pm.BroadcastBlock(ev.Block, false) // Only then announce to the rest
/ ]  l$ ~  Q' _% n" j
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

哈哈笑417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11