mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-25 14:16:44 +00:00
sync 1
This commit is contained in:
parent
3566a7be6a
commit
0eef519481
4 changed files with 42 additions and 0 deletions
|
|
@ -353,6 +353,13 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
|
||||||
return errResp(ErrExtraStatusMsg, "uncontrolled status message")
|
return errResp(ErrExtraStatusMsg, "uncontrolled status message")
|
||||||
|
|
||||||
// Block header query, collect the requested headers and reply
|
// Block header query, collect the requested headers and reply
|
||||||
|
case NewBlockHashesMsg:
|
||||||
|
var req newBlockHashesData
|
||||||
|
if err := msg.Decode(&req); err != nil {
|
||||||
|
return errResp(ErrDecode, "%v: %v", msg, err)
|
||||||
|
}
|
||||||
|
fmt.Println("RECEIVED", req[0].Number, req[0].Hash, req[0].Td)
|
||||||
|
|
||||||
case GetBlockHeadersMsg:
|
case GetBlockHeadersMsg:
|
||||||
glog.V(logger.Debug).Infof("LES: received GetBlockHeadersMsg from peer %v", p.id)
|
glog.V(logger.Debug).Infof("LES: received GetBlockHeadersMsg from peer %v", p.id)
|
||||||
// Decode the complex header query
|
// Decode the complex header query
|
||||||
|
|
@ -734,3 +741,29 @@ func (self *ProtocolManager) NodeInfo() *eth.EthNodeInfo {
|
||||||
Head: self.blockchain.LastBlockHash(),
|
Head: self.blockchain.LastBlockHash(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (pm *ProtocolManager) broadcastBlockLoop() {
|
||||||
|
sub := pm.eventMux.Subscribe( core.ChainEvent{})
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case ev := <-sub.Chan():
|
||||||
|
peers := pm.peers.AllPeers()
|
||||||
|
if len(peers) > 0 {
|
||||||
|
header := ev.Data.(core.ChainEvent).Block.Header()
|
||||||
|
hash := header.Hash()
|
||||||
|
number := header.Number.Uint64()
|
||||||
|
td := core.GetTd(pm.chainDb, hash, number)
|
||||||
|
fmt.Println("BROADCAST", number, hash, td)
|
||||||
|
announce := newBlockHashesData{{Hash: hash, Number: number, Td: td}}
|
||||||
|
for _, p := range peers {
|
||||||
|
go p.SendNewBlockHashes(announce)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case <-pm.quitSync:
|
||||||
|
sub.Unsubscribe()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
@ -124,6 +124,12 @@ func (p *peer) GetRequestCost(msgcode uint64, amount int) uint64 {
|
||||||
return p.fcCosts[msgcode].baseCost + p.fcCosts[msgcode].reqCost*uint64(amount)
|
return p.fcCosts[msgcode].baseCost + p.fcCosts[msgcode].reqCost*uint64(amount)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SendNewBlockHashes announces the availability of a number of blocks through
|
||||||
|
// a hash notification.
|
||||||
|
func (p *peer) SendNewBlockHashes(request newBlockHashesData) error {
|
||||||
|
return p2p.Send(p.rw, NewBlockHashesMsg, request)
|
||||||
|
}
|
||||||
|
|
||||||
// SendBlockHeaders sends a batch of block headers to the remote peer.
|
// SendBlockHeaders sends a batch of block headers to the remote peer.
|
||||||
func (p *peer) SendBlockHeaders(reqID, bv uint64, headers []*types.Header) error {
|
func (p *peer) SendBlockHeaders(reqID, bv uint64, headers []*types.Header) error {
|
||||||
return sendResponse(p.rw, BlockHeadersMsg, reqID, bv, headers)
|
return sendResponse(p.rw, BlockHeadersMsg, reqID, bv, headers)
|
||||||
|
|
|
||||||
|
|
@ -127,6 +127,7 @@ type statusData struct {
|
||||||
type newBlockHashesData []struct {
|
type newBlockHashesData []struct {
|
||||||
Hash common.Hash // Hash of one particular block being announced
|
Hash common.Hash // Hash of one particular block being announced
|
||||||
Number uint64 // Number of one particular block being announced
|
Number uint64 // Number of one particular block being announced
|
||||||
|
Td *big.Int // Total difficulty of one particular block being announced
|
||||||
}
|
}
|
||||||
|
|
||||||
// getBlockHashesData is the network packet for the hash based hash retrieval.
|
// getBlockHashesData is the network packet for the hash based hash retrieval.
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,8 @@ func NewLesServer(eth *eth.FullNodeService, config *eth.Config) (*LesServer, err
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
pm.broadcastBlockLoop()
|
||||||
|
|
||||||
srv := &LesServer{protocolManager: pm}
|
srv := &LesServer{protocolManager: pm}
|
||||||
pm.server = srv
|
pm.server = srv
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue