Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

以太坊源码照抄 eth/handler

哈哈笑417
86 0 0
不想写了,啊啊啊- [$ E/ X! Q8 S. E2 D
eth主要的同步txs,block,header的入口都在这个文件里2 a5 ^# f4 m1 a: d% V) A
type ProtocolManager struct {
9 ?6 N  c- M# _8 r        ...
5 L- K' [% ]5 Y) G/ k        downloader *downloader.Downloader // 名字是downloader 其实是就是在接受到数据后插入数据库# V9 b6 b3 J8 D( S" r4 Q
        fetcher    *fetcher.Fetcher  // 声明新的块4 s) b8 Y# o: I6 J. Q
        peers      *peerSet
5 _8 J& F# v. G! l        SubProtocols []p2p.Protocol9 w4 X6 J& a  X# H" u" d/ e  w9 ^' A
        ...
6 U  P: U& P" G1 F方法 NewProtocolManager初始化一个ProtocolManager结构4 n3 `0 F1 S( Q' J7 P5 B6 T# P
这一步有一个重要的内容就是append(SubProtocols, p2p.Protocols{})1 G) w5 x6 R2 b- j4 n) {
manager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{) X+ w  h: |' R6 F9 t. U% K, m( e
        Name:    ProtocolName,
5 V! ]! H+ {6 c. Y        Version: version,
* G0 X" i  R6 F: n1 M        Length:  ProtocolLengths,$ n1 z$ S! X1 M" W. W. u' o
        Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {! x; u) Z6 s9 y
                peer := manager.newPeer(int(version), p, rw)
8 W7 A6 x  {' P/ {0 m                select {
0 l! U; ~; i6 y+ ?9 A                case manager.newPeerCh
0 o; [: _# h$ \: wfunc pm.handle()) f/ M. E' f: H0 L* A0 l
这里newPeerCh接收到peer后调用pm.handle, 与pm同步txs,同时p同步pm.whiteList中的header' {& G; S; ~% A! M& H
for number := range pm.whitelist {/ l: ^1 r: W# D4 M
        if err := p.RequestHeadersByNumber(number, 1, 0, false); err != nil {+ S& G& D* y  @3 }. X1 z  B
                return err- S, F- j# j- J7 P# I. ~$ d
        }
$ h7 C0 L# V! F5 S8 n% x% F}
4 i) J; n7 ]* K" F  J& D同时进入循环处理来自peer的消息& P8 B: U  g3 k; {
for {
- \8 m5 W1 ^+ k! Z; a9 J: v* d        if err := pm.handleMsg(p); err != nil {
. v  `% m8 a; a' f                p.Log().Debug("Ethereum message handling failed", "err", err)- j: S- o. m6 m+ Y* |7 e) X3 a
                return err4 Y" b! ^* R2 C9 J/ ?8 u* ~
        }
8 a& ]' Y! p5 X$ K}3 m# D; N) G4 F0 f1 n
func pm.handleMsg(p *peer)5 }* S1 W3 L; n/ O. H, d
这个函数根据msg, err := p.rw.ReadMsg() msg的类型做出不同的处理,塞到fetcher 或者downloader中去等等2 p. f3 N: n- {; q0 L6 y3 o& z
func.pm.BroadcastTxs(tx)
5 M0 n! U4 H% ]找到pm.peers.PeersWithoutTx(tx.Hash()) 然后把tx塞给他, F! b" k: F* q0 I$ e9 C) C$ B
这个函数在 接受到消息时就会被调用0 M9 d" C( }3 N- m
func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool)
- [) b: e5 ~9 F" r这个就如题吧
& l5 |( W4 s3 S/ }3 |! b* ~' a; p  T参数propagate为true就选出前Math.sqrt(peersLen)个节点,传播出块消息参数propagate为false 简单向所有节点声明我有这个块
  d2 u( Y( l& N/ b/ `9 L
3 |  s" g$ j, \& e4 L, H3 W. D2 e% a
调用:range pm.minedBlockSub.Chan() 如果管道里有消息会执行以下代码- |9 \$ l6 ~( D& J6 q' P' ]5 j% p
pm.BroadcastBlock(ev.Block, true)  // First propagate block to peers
& \$ j+ E8 o: g+ P3 m& V8 t5 y6 O6 cpm.BroadcastBlock(ev.Block, false) // Only then announce to the rest- ]2 r2 ]0 K4 f. c8 u+ w2 S" T3 L' I
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

哈哈笑417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11