Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

以太坊源码照抄 eth/handler

哈哈笑417
87 0 0
不想写了,啊啊啊
7 i/ f, s4 g5 |) K' J6 x1 Reth主要的同步txs,block,header的入口都在这个文件里
+ u  w2 H3 M4 a( v% ]" Ntype ProtocolManager struct {
4 j( S" \* y" W3 U$ c  S, h! B        ..." ^+ [+ w4 v- k; @1 h7 T+ S8 w- ~
        downloader *downloader.Downloader // 名字是downloader 其实是就是在接受到数据后插入数据库
! f- ?& M. }% a* H- X& R        fetcher    *fetcher.Fetcher  // 声明新的块, W1 i2 Q. f7 e' @( d/ V! _, B8 _
        peers      *peerSet) P4 L1 I5 }- i8 q/ V
        SubProtocols []p2p.Protocol1 V# k9 C# q; y# h, m+ L' I
        ...# w! r9 N& i+ L! H& A$ d
方法 NewProtocolManager初始化一个ProtocolManager结构
- ^; Y0 z" p! O# o" V2 u这一步有一个重要的内容就是append(SubProtocols, p2p.Protocols{})
( T  d, P+ O7 T" `manager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{
4 F9 T" r, J: ?; `. k        Name:    ProtocolName,4 k9 I- `9 R; T3 ?
        Version: version,
. j4 P1 ]9 u6 C+ i6 b4 T) s- I        Length:  ProtocolLengths,! J% j1 R& D9 S$ p3 {" x, @, H) d
        Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {
! Y$ {+ T( Z( X% a4 U                peer := manager.newPeer(int(version), p, rw)/ ^' D0 r/ I1 G+ R
                select {
# N- H+ N# }$ }: Q                case manager.newPeerCh
; k2 E/ U2 U* c* u: Mfunc pm.handle()
4 J0 q. m( H; D" X% i$ n' a这里newPeerCh接收到peer后调用pm.handle, 与pm同步txs,同时p同步pm.whiteList中的header6 a% N+ N) C7 x! x  T2 ]( C
for number := range pm.whitelist {
. K' ^5 I: v7 K/ X; U. a        if err := p.RequestHeadersByNumber(number, 1, 0, false); err != nil {
  I* t8 O( U5 ?& Z) h                return err& D4 b- Q: H$ [) i8 U
        }! D1 u% H! E) `9 f8 [
}/ ?' e. d5 c9 l4 x
同时进入循环处理来自peer的消息5 P) S' o( H# K* x8 B( Q
for {
6 F/ K. L2 S: x; ~. |5 L2 j        if err := pm.handleMsg(p); err != nil {
6 H6 e$ ^6 j$ {, T' l- n                p.Log().Debug("Ethereum message handling failed", "err", err)$ ?" {' x5 I+ Y4 Y2 [
                return err; X; `% g8 h4 x. Q
        }
/ R8 d* w; G" p: {$ {- Q$ b) C}
- L' j/ `( ^' ]8 e: @func pm.handleMsg(p *peer)
2 \; C7 f: y5 g- [' }" _4 n" N/ u这个函数根据msg, err := p.rw.ReadMsg() msg的类型做出不同的处理,塞到fetcher 或者downloader中去等等) t% c/ w- ^9 M7 X( ^& s1 T, U
func.pm.BroadcastTxs(tx)1 J* p3 r4 F+ ^4 m% P; q% O( @) L
找到pm.peers.PeersWithoutTx(tx.Hash()) 然后把tx塞给他
0 m! |4 ~; L* d+ D1 |这个函数在 接受到消息时就会被调用2 X5 M5 w1 m1 P/ ~
func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool)
  O! t& h: c# S" ^9 E这个就如题吧
3 _5 r6 K4 }7 l7 V( |8 H参数propagate为true就选出前Math.sqrt(peersLen)个节点,传播出块消息参数propagate为false 简单向所有节点声明我有这个块5 _+ X. O* x9 P; h
' O: M. G. T+ j1 Q- ^
调用:range pm.minedBlockSub.Chan() 如果管道里有消息会执行以下代码
2 o; b; R% y6 `: J+ Spm.BroadcastBlock(ev.Block, true)  // First propagate block to peers
4 H3 b" ]0 b8 n' L# e  ?7 R  Opm.BroadcastBlock(ev.Block, false) // Only then announce to the rest
8 x# [. T: M: m) ], c& k0 m
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

哈哈笑417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11