mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-06-22 05:56:43 +00:00

* [NOD-1126] Implement block relay flow * [NOD-1126] Implement block relay flow * [NOD-1126] Add StartGetRelayBlocksListener * [NOD-1126] Integrate with new interface * [NOD-1126] Fix comments * [NOD-1126] Refactor protocol.go * [NOD-1126] Split long lines * [NOD-1126] Fix comment * [NOD-1126] move sharedRequestedBlocks to a separate file * [NOD-1126] Fix error message * [NOD-1126] Move handleInv to StartBlockRelay * [NOD-1126] Create hashesQueueSet type * [NOD-1126] Make deleteFromRequestedBlocks a method * [NOD-1126] Fix comment * [NOD-1126] Add block logger * [NOD-1126] Rename advertisedProtoVer->advertisedProtocolVer * [NOD-1126] Fix comment and an error message * [NOD-1126] Remove redundant loop * [NOD-1126] Move requestBlocks upper * [NOD-1126] Remove exiting blocks in requestedBlocks from hashesToRequest * [NOD-1126] Change comment * [NOD-1126] Rename stallResponseTimeout->timeout * [NOD-1126] Use switch inside readMsgBlock * [NOD-1126] Fix error message and remove redundant log * [NOD-1126] Rename pacakge names * [NOD-1126] Fix comment * [NOD-1126] Change file names * [NOD-1126] Convert block to partial if needed * [NOD-1126] Remove function redeclaration * [NOD-1126] continue instead of return * [NOD-1126] Rename LogBlockBlueScore->LogBlock * [NOD-1126] Add minimum functions to utils * [NOD-1126] Flip condition on readInv * [NOD-1126] Rename utilMath->mathUtil * [NOD-1126] Fix comment * [NOD-1137] Implement handshake * [NOD-1137] Replace version's nonce with ID * [NOD-1137] Remove redundant function * [NOD-1137] Move handshake to a separate file * [NOD-1137] Add todo * [NOD-1137] Replace peer internal id with global peer ID * [NOD-1137] Add serializer/deserializer to ID * [NOD-1137] Remove validation from AddUserAgent * [NOD-1137] Add missing id package * [NOD-1137] Rename variables * [NOD-1137] Add comment * [NOD-1137] Implement GetBestLocalAddress * [NOD-1137] Implement TODOs * [NOD-1137] Rename variables * [NOD-1137] Move errors.Is inside err!=nil branch * [NOD-1137] Fix erroneous condition on Dequeue * [NOD-1137] Fix bug in GetReadyPeerIDs * [NOD-1137] Handle external IP on GetBestLocalAddress * [NOD-1137] Remove version and verack message types when handshake is over * [NOD-1137] Add FromBytes to id package * [NOD-1137] Add protocol error * [NOD-1137] Add ErrTimeout * [NOD-1137] Log error only if exists * [NOD-1137] Replace idFromBytes->id.FromBytes * [NOD-1137] Add comments * [NOD-1137] Remove ErrTimeout * [NOD-1137] Unremove ErrTimeout * [NOD-1137] Change comment * [NOD-1137] Use EnqueueWithTimeout everywhere in protocol
74 lines
1.8 KiB
Go
74 lines
1.8 KiB
Go
package ping
|
|
|
|
import (
|
|
"github.com/kaspanet/kaspad/netadapter/router"
|
|
peerpkg "github.com/kaspanet/kaspad/protocol/peer"
|
|
"github.com/kaspanet/kaspad/protocol/protocolerrors"
|
|
"github.com/kaspanet/kaspad/util/random"
|
|
"github.com/kaspanet/kaspad/wire"
|
|
"time"
|
|
)
|
|
|
|
const pingTimeout = 30 * time.Second
|
|
|
|
// ReceivePings handles all ping messages coming through incomingRoute.
|
|
// This function assumes that incomingRoute will only return MsgPing.
|
|
func ReceivePings(incomingRoute *router.Route, outgoingRoute *router.Route) error {
|
|
for {
|
|
message, isOpen := incomingRoute.Dequeue()
|
|
if !isOpen {
|
|
return nil
|
|
}
|
|
pingMessage := message.(*wire.MsgPing)
|
|
|
|
pongMessage := wire.NewMsgPong(pingMessage.Nonce)
|
|
isOpen, err := outgoingRoute.EnqueueWithTimeout(pongMessage, pingTimeout)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !isOpen {
|
|
return nil
|
|
}
|
|
}
|
|
}
|
|
|
|
// SendPings starts sending MsgPings every pingInterval seconds to the
|
|
// given peer.
|
|
// This function assumes that incomingRoute will only return MsgPong.
|
|
func SendPings(incomingRoute *router.Route, outgoingRoute *router.Route, peer *peerpkg.Peer) error {
|
|
const pingInterval = 2 * time.Minute
|
|
ticker := time.NewTicker(pingInterval)
|
|
defer ticker.Stop()
|
|
|
|
for range ticker.C {
|
|
nonce, err := random.Uint64()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
peer.SetPingPending(nonce)
|
|
|
|
pingMessage := wire.NewMsgPing(nonce)
|
|
isOpen, err := outgoingRoute.EnqueueWithTimeout(pingMessage, pingTimeout)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !isOpen {
|
|
return nil
|
|
}
|
|
|
|
message, isOpen, err := incomingRoute.DequeueWithTimeout(pingTimeout)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !isOpen {
|
|
return nil
|
|
}
|
|
pongMessage := message.(*wire.MsgPing)
|
|
if pongMessage.Nonce != pingMessage.Nonce {
|
|
return protocolerrors.New(true, "nonce mismatch between ping and pong")
|
|
}
|
|
peer.SetPingIdle()
|
|
}
|
|
return nil
|
|
}
|