DataReqHandle handles the data req(block/Transaction) from peer
(data *msgTypes.MsgPayload, p2p p2p.P2P, pid *evtActor.PID, args ...interface{})
| 427 | |
| 428 | // DataReqHandle handles the data req(block/Transaction) from peer |
| 429 | func 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 |