Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

以太坊源码照抄 eth/handler

哈哈笑417
163 0 0
不想写了,啊啊啊
, G; g2 K. N/ veth主要的同步txs,block,header的入口都在这个文件里
; d0 R$ g) F+ R: x7 ?type ProtocolManager struct {
) L0 u: X" z( M/ L! \/ _        ...
, S: ?4 B2 x; }0 b1 k8 V( h        downloader *downloader.Downloader // 名字是downloader 其实是就是在接受到数据后插入数据库
: P: U& I7 v0 S6 P8 B7 B$ j7 p        fetcher    *fetcher.Fetcher  // 声明新的块
' x4 y4 @+ K/ s3 E' h$ y        peers      *peerSet
' L5 q! Q* }& X        SubProtocols []p2p.Protocol. r/ w+ k% l, z5 `
        ...
9 h. {& V% |: N2 j方法 NewProtocolManager初始化一个ProtocolManager结构& b' b3 }9 ?( G% b# j# [* t
这一步有一个重要的内容就是append(SubProtocols, p2p.Protocols{})' r2 A! ~1 c% k. P  r
manager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{
7 {' w* p5 G/ U  t5 J$ Y        Name:    ProtocolName,) S# ^; v7 t9 g/ ]
        Version: version,
. c0 b3 y2 F" Y) Z( X4 [% p        Length:  ProtocolLengths,/ ?. G7 F! x& \3 @  u& E
        Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {
) f8 I2 I. B* i& f                peer := manager.newPeer(int(version), p, rw)
$ S" r, ~7 P% {- S( e- p" J7 q                select {
9 D! D; c4 A' F; ~' x+ ^                case manager.newPeerCh $ f7 A% x$ ^9 M& m
func pm.handle()
2 X& p3 S% @3 j+ s这里newPeerCh接收到peer后调用pm.handle, 与pm同步txs,同时p同步pm.whiteList中的header! N) v. z1 |  f9 C" v
for number := range pm.whitelist {, j2 x. Q. C8 }: j
        if err := p.RequestHeadersByNumber(number, 1, 0, false); err != nil {
% E% ?: d! H+ u2 S1 I- S                return err
% L( m" y$ O# f: R( ?# X8 [. J" |        }
3 D$ T2 A, {( R! a) w, b7 i7 l& O8 a}& R: N- i  D( v6 J% x9 e$ Y
同时进入循环处理来自peer的消息8 t% f: C* J# C
for {
1 E5 f9 e8 a! u  b( d$ z" {" L        if err := pm.handleMsg(p); err != nil {5 ~, r# s9 J1 ^1 q1 A; E
                p.Log().Debug("Ethereum message handling failed", "err", err)1 y9 ^+ _5 Y- u- k" D- C/ p! P
                return err
# U6 a' t) o& i1 _' u        }
4 P: Z) @0 d- Q* z$ t* J( }! h0 m}
+ O( S$ }& p; ^8 T$ g. yfunc pm.handleMsg(p *peer)
- w6 h" ^1 z! \) w: M4 E, [  y这个函数根据msg, err := p.rw.ReadMsg() msg的类型做出不同的处理,塞到fetcher 或者downloader中去等等
! S0 x' ]! v5 Z1 nfunc.pm.BroadcastTxs(tx)
$ G  ~: c+ ~% @, Q找到pm.peers.PeersWithoutTx(tx.Hash()) 然后把tx塞给他" v$ ~6 ]1 t$ `: Z. u) {4 a) y
这个函数在 接受到消息时就会被调用
6 h, i/ d3 j( F" U9 Pfunc (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool)/ R3 \3 c/ V6 a4 D9 n
这个就如题吧1 C. T* R. ^9 Z+ h
参数propagate为true就选出前Math.sqrt(peersLen)个节点,传播出块消息参数propagate为false 简单向所有节点声明我有这个块7 d- O) {3 }1 w! v, ^

2 p2 {7 L& |* L8 |) v$ i调用:range pm.minedBlockSub.Chan() 如果管道里有消息会执行以下代码: r! e7 }* C- |1 I
pm.BroadcastBlock(ev.Block, true)  // First propagate block to peers
& R5 @" `! P, bpm.BroadcastBlock(ev.Block, false) // Only then announce to the rest4 z4 k# i: k+ T* {4 \( C
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

哈哈笑417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11