MCPcopy Create free account
hub / github.com/DNAProject/DNA / DataReqHandle

Function DataReqHandle

p2pserver/message/utils/msg_handler.go:429–506  ·  view source on GitHub ↗

DataReqHandle handles the data req(block/Transaction) from peer

(data *msgTypes.MsgPayload, p2p p2p.P2P, pid *evtActor.PID, args ...interface{})

Source from the content-addressed store, hash-verified

427
428// DataReqHandle handles the data req(block/Transaction) from peer
429func DataReqHandle(data *msgTypes.MsgPayload, p2p p2p.P2P, pid *evtActor.PID, args ...interface{}) {
430 log.Trace("[p2p]receive data req message", data.Addr, data.Id)
431
432 var dataReq = data.Payload.(*msgTypes.DataReq)
433
434 remotePeer := p2p.GetPeer(data.Id)
435 if remotePeer == nil {
436 log.Debug("[p2p]remotePeer invalid in DataReqHandle")
437 return
438 }
439 reqType := common.InventoryType(dataReq.DataType)
440 hash := dataReq.Hash
441 switch reqType {
442 case common.BLOCK:
443 reqID := fmt.Sprintf("%x%s", reqType, hash.ToHexString())
444 data := getRespCacheValue(reqID)
445 var msg msgTypes.Message
446 if data != nil {
447 switch data.(type) {
448 case *msgTypes.Block:
449 msg = data.(*msgTypes.Block)
450 }
451 }
452 if msg == nil {
453 var merkleRoot common.Uint256
454 block, err := ledger.DefLedger.GetBlockByHash(hash)
455 if err != nil || block == nil || block.Header == nil {
456 log.Debug("[p2p]can't get block by hash: ", hash,
457 " ,send not found message")
458 msg := msgpack.NewNotFound(hash)
459 err := p2p.Send(remotePeer, msg)
460 if err != nil {
461 log.Warn(err)
462 return
463 }
464 return
465 }
466 merkleRoot, err = ledger.DefLedger.GetStateMerkleRoot(block.Header.Height)
467 if err != nil {
468 log.Debugf("[p2p]failed to get state merkel root at height %v, err %v",
469 block.Header.Height, err)
470 msg := msgpack.NewNotFound(hash)
471 err := p2p.Send(remotePeer, msg)
472 if err != nil {
473 log.Warn(err)
474 return
475 }
476 return
477 }
478 msg = msgpack.NewBlock(block, merkleRoot)
479 saveRespCache(reqID, msg)
480 }
481 err := p2p.Send(remotePeer, msg)
482 if err != nil {
483 log.Warn(err)
484 return
485 }
486

Callers 1

TestDataReqHandleFunction · 0.85

Calls 13

TraceFunction · 0.92
DebugFunction · 0.92
WarnFunction · 0.92
DebugfFunction · 0.92
getRespCacheValueFunction · 0.85
saveRespCacheFunction · 0.85
InventoryTypeMethod · 0.80
GetPeerMethod · 0.65
GetBlockByHashMethod · 0.65
SendMethod · 0.65
GetStateMerkleRootMethod · 0.65
GetTransactionMethod · 0.65

Tested by 1

TestDataReqHandleFunction · 0.68