Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

以太坊源码照抄 eth/handler

哈哈笑417
77 0 0
不想写了,啊啊啊
' F# c, w1 \0 I/ leth主要的同步txs,block,header的入口都在这个文件里
, h4 k) ^  r- K% V8 ]0 i! mtype ProtocolManager struct {0 H6 ~: ?2 g9 u" i9 {4 p# l5 J& o
        ...
1 v9 B* F+ G0 L        downloader *downloader.Downloader // 名字是downloader 其实是就是在接受到数据后插入数据库
; }7 V/ N" d2 w  _1 y% P& i        fetcher    *fetcher.Fetcher  // 声明新的块4 \; z. @: ~7 G  l/ k
        peers      *peerSet
5 d; R) C& r3 {* t6 k        SubProtocols []p2p.Protocol' `: _2 x* \1 f
        ...; i* N$ L; `: u9 Q* ^
方法 NewProtocolManager初始化一个ProtocolManager结构% Q' L% A& _6 P6 z2 p9 v* S
这一步有一个重要的内容就是append(SubProtocols, p2p.Protocols{})
5 T9 ?1 h1 l2 Y1 Z+ C6 l1 qmanager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{
  ~7 Z, b+ U( }% h' L0 g9 e( C        Name:    ProtocolName,6 e* F: j: {$ u7 L0 L4 X$ a
        Version: version,( k: I, z5 s2 K' z& r' r; Q
        Length:  ProtocolLengths,
: c- t" m8 ^, W$ s        Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {3 x5 w/ P/ B! A% C5 y% {1 h
                peer := manager.newPeer(int(version), p, rw)9 C* r% B, u1 _4 w
                select {( e' j; C1 F) X# f' N
                case manager.newPeerCh
* H* {4 s$ h: l2 f: U* Ifunc pm.handle()
! I5 J# u. k- L这里newPeerCh接收到peer后调用pm.handle, 与pm同步txs,同时p同步pm.whiteList中的header% n( i- K) A/ E/ |8 r
for number := range pm.whitelist {
- z; U  c6 r. I( v/ {7 e6 [7 o5 s        if err := p.RequestHeadersByNumber(number, 1, 0, false); err != nil {
  {- o' @. ?. J( D1 D$ C: J! I3 ~, j' D  f                return err
8 {. }! J+ ^$ @' E; |6 D! y        }
9 m7 n& f  {$ R4 c! s}
# z( W" B4 L, Z$ R3 _8 @) a同时进入循环处理来自peer的消息! m& E6 l  z" B" Z  z' O
for {( Z4 p/ s  T9 N5 W, G& {
        if err := pm.handleMsg(p); err != nil {0 [. _5 }. ~+ E' L; ^/ @
                p.Log().Debug("Ethereum message handling failed", "err", err)
$ C" ~) r, a! q1 E' s                return err
" o( A* P1 V% Y- p% o% j3 H        }$ m6 L2 @( q6 n5 _0 @* v
}
9 [# S6 g2 R0 Q( Zfunc pm.handleMsg(p *peer), |/ b2 I+ @& p* ^* N
这个函数根据msg, err := p.rw.ReadMsg() msg的类型做出不同的处理,塞到fetcher 或者downloader中去等等7 |3 `: v8 w. M) K# M# E/ y
func.pm.BroadcastTxs(tx)
  f( i% @$ U' U- A1 V- a找到pm.peers.PeersWithoutTx(tx.Hash()) 然后把tx塞给他7 L5 z9 L$ V* W+ p  W! y; j7 o
这个函数在 接受到消息时就会被调用
& u& w  {: _) o& w( \func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool)" o- r) `- G( n& R7 T4 a- q
这个就如题吧# {4 |0 w) V: O6 W2 A7 F  w* A) p
参数propagate为true就选出前Math.sqrt(peersLen)个节点,传播出块消息参数propagate为false 简单向所有节点声明我有这个块  [& s& z/ t) ?" S/ i" R

# Z# Y% v- V5 r$ F7 U调用:range pm.minedBlockSub.Chan() 如果管道里有消息会执行以下代码0 j4 Z& x" v1 e3 W; A1 e& [
pm.BroadcastBlock(ev.Block, true)  // First propagate block to peers' K. w3 m2 L; h( e1 B
pm.BroadcastBlock(ev.Block, false) // Only then announce to the rest. x" o' ^: S# ]
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

哈哈笑417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11