Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

以太坊源码照抄 eth/handler

哈哈笑417
170 0 0
不想写了,啊啊啊/ ^4 y3 l0 L# w8 o9 n" n
eth主要的同步txs,block,header的入口都在这个文件里
- r7 k/ C9 B5 V+ O* G8 z5 Ztype ProtocolManager struct {
! e, N! s: l& l2 }8 Z        ..., n$ J" ]6 \2 f( K/ `0 i5 S2 X
        downloader *downloader.Downloader // 名字是downloader 其实是就是在接受到数据后插入数据库
/ U8 }2 I8 P" q2 W8 s( |! X0 K        fetcher    *fetcher.Fetcher  // 声明新的块; I' S* Z: P% W
        peers      *peerSet3 I- @7 b- {  M1 w
        SubProtocols []p2p.Protocol
7 a' Y: e  V; v) {4 X+ w        ...
" `7 H: F2 R: x. F* A方法 NewProtocolManager初始化一个ProtocolManager结构
' h1 z" }: X1 r" `. J. z- D5 b+ z. e1 {0 o这一步有一个重要的内容就是append(SubProtocols, p2p.Protocols{})
! E% M# ]/ X7 W9 l2 Z% a( l7 R4 @manager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{
; U7 d0 R" A. o; X2 |3 _: {        Name:    ProtocolName,
  m# D& x/ q" \$ M2 l        Version: version,/ R" J0 T9 g. p0 ?
        Length:  ProtocolLengths,
3 ?, w' O' y1 ]9 ]' i        Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {7 A' t. B) y3 O/ f% w. t5 k4 p
                peer := manager.newPeer(int(version), p, rw)6 U6 {# _8 D! |* K5 o9 Y6 c5 ?4 z
                select {2 u. m+ |5 P+ K
                case manager.newPeerCh " u8 U4 r/ h  a6 y; W) p
func pm.handle(). Z( R: ~' K% x0 s" v) k
这里newPeerCh接收到peer后调用pm.handle, 与pm同步txs,同时p同步pm.whiteList中的header
9 C, _" O( \: e& Tfor number := range pm.whitelist {
  I  W4 u1 {9 N" H        if err := p.RequestHeadersByNumber(number, 1, 0, false); err != nil {
5 K+ i4 `4 n' u5 l/ U                return err) h) a- A* O0 }
        }
9 ~# M, c) j5 ]7 K1 H9 w0 r( q}5 a4 T1 O' ~, m  [. d# ~# h. J
同时进入循环处理来自peer的消息
; Z7 g' t* U4 |3 d  g, |5 Vfor {
6 H4 m: E4 Z! h( F( h4 J# \        if err := pm.handleMsg(p); err != nil {+ u8 `3 a  O" S0 s3 o7 P
                p.Log().Debug("Ethereum message handling failed", "err", err)
2 @% W! q2 v: z7 `                return err
; O. G, W: d% T5 |7 x' r1 ~        }
- s7 G; k/ T  Y, E}
! m* _' ]! H7 n0 y# ufunc pm.handleMsg(p *peer). m# C' |2 R3 p
这个函数根据msg, err := p.rw.ReadMsg() msg的类型做出不同的处理,塞到fetcher 或者downloader中去等等
) w; q* }/ W1 }func.pm.BroadcastTxs(tx)5 S/ z2 m( l8 i2 c5 t0 m
找到pm.peers.PeersWithoutTx(tx.Hash()) 然后把tx塞给他& ?8 w  V4 C- V
这个函数在 接受到消息时就会被调用
/ b4 v- @# C, Hfunc (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool)
4 b6 b4 p# G' R! v3 S7 l" c这个就如题吧1 L# }' o: L3 k
参数propagate为true就选出前Math.sqrt(peersLen)个节点,传播出块消息参数propagate为false 简单向所有节点声明我有这个块
, ]" n* `; x- p  Z
7 a( m+ s" {) z1 D
调用:range pm.minedBlockSub.Chan() 如果管道里有消息会执行以下代码$ y0 @+ W- V: q. ^* J
pm.BroadcastBlock(ev.Block, true)  // First propagate block to peers
3 I& M8 l7 {) e, g+ ypm.BroadcastBlock(ev.Block, false) // Only then announce to the rest
$ Q4 Y* {& G" d( n) q% ]) v
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

哈哈笑417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11