Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

以太坊源码照抄 eth/handler

哈哈笑417
152 0 0
不想写了,啊啊啊; E( J* K1 y6 R; R
eth主要的同步txs,block,header的入口都在这个文件里
& _' r: J( C+ W. b; B3 W8 p& Ftype ProtocolManager struct {* W) I# n! `% i; U! A8 x, R' u
        ...
1 Z7 P8 P. @$ j        downloader *downloader.Downloader // 名字是downloader 其实是就是在接受到数据后插入数据库1 H- S" j6 T" O; b( X* x8 L2 h9 P
        fetcher    *fetcher.Fetcher  // 声明新的块* S% b8 r/ l$ f5 z9 v; v& `4 |$ k
        peers      *peerSet
( c$ i; e; B7 Z        SubProtocols []p2p.Protocol
9 J/ S5 a# u8 n3 u6 p        ...
( x% X! D* I0 T6 Q; {方法 NewProtocolManager初始化一个ProtocolManager结构
! j- s7 }( A3 s3 e3 u这一步有一个重要的内容就是append(SubProtocols, p2p.Protocols{})
4 v5 j# U1 o8 gmanager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{
8 f4 s. E6 V3 n0 |/ }/ L        Name:    ProtocolName,/ K5 i# Q0 Q  C6 q+ ]1 w# R2 Q
        Version: version,4 y$ @. q% F' h) E1 L# |: C- E
        Length:  ProtocolLengths,
0 |$ |8 D0 h$ q+ `$ T7 R        Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {/ I6 E2 A1 X% f, N  o6 l: a
                peer := manager.newPeer(int(version), p, rw)
5 y4 `5 F3 I- o  s3 D                select {
( N, Y; |" |& f! q                case manager.newPeerCh ) J, @0 m" @) I) A! j7 @7 c. B8 n
func pm.handle()/ a+ K$ i, x2 ?) C5 m
这里newPeerCh接收到peer后调用pm.handle, 与pm同步txs,同时p同步pm.whiteList中的header& u- v) a& v4 u1 J! I8 p, w
for number := range pm.whitelist {' l# g, P2 T- M/ Z2 d7 p+ a2 G  x
        if err := p.RequestHeadersByNumber(number, 1, 0, false); err != nil {$ a. P; P' w- \. ~$ J7 ?) v) H: X8 b
                return err
/ {! y( j0 C6 l0 v+ d+ X. I- m        }
7 e4 r0 h# N" f0 Q; d$ C/ a* a}: g! q/ X0 Y. r
同时进入循环处理来自peer的消息: t9 `3 R/ e# u! L1 q, a6 a8 @& C
for {
. {# b& o7 |; y        if err := pm.handleMsg(p); err != nil {
1 G+ [8 [, _$ q; W( N8 R                p.Log().Debug("Ethereum message handling failed", "err", err)
7 E) w  k2 U* a' P                return err0 b% m# v4 k# E$ t+ J0 j( k& W
        }
/ c) o& m' ^3 v: q}
* e" L1 g" a2 z! Nfunc pm.handleMsg(p *peer)
6 F5 a# R+ C. w% d: \5 O+ h' u这个函数根据msg, err := p.rw.ReadMsg() msg的类型做出不同的处理,塞到fetcher 或者downloader中去等等# g7 _8 ^8 y6 `( S2 H
func.pm.BroadcastTxs(tx)' F, m6 Q; f' r7 x9 p* U9 i0 G3 o( h
找到pm.peers.PeersWithoutTx(tx.Hash()) 然后把tx塞给他6 K% v" u) J" k! s
这个函数在 接受到消息时就会被调用$ v4 C3 X! k  X9 g4 J& h2 [
func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool): q6 o5 ?/ z. {
这个就如题吧
7 t) ]' s0 K# i( F  e! G2 c参数propagate为true就选出前Math.sqrt(peersLen)个节点,传播出块消息参数propagate为false 简单向所有节点声明我有这个块- p8 N6 M1 Q; C0 n# z4 n

- y! ]9 T" F; p调用:range pm.minedBlockSub.Chan() 如果管道里有消息会执行以下代码
9 V, T& _0 v1 u; c0 w  U  N5 @pm.BroadcastBlock(ev.Block, true)  // First propagate block to peers
6 X; k# X$ o" E- w" p9 E2 ]: ipm.BroadcastBlock(ev.Block, false) // Only then announce to the rest! \5 M& X" r6 ^5 X6 q9 f8 w. ^
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

哈哈笑417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11