mirror of
https://github.com/kaspanet/kaspad.git
synced 2026-03-07 01:21:44 +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
86 lines
3.0 KiB
Go
86 lines
3.0 KiB
Go
package receiveversion
|
|
|
|
import (
|
|
"github.com/kaspanet/kaspad/blockdag"
|
|
"github.com/kaspanet/kaspad/netadapter"
|
|
"github.com/kaspanet/kaspad/netadapter/router"
|
|
peerpkg "github.com/kaspanet/kaspad/protocol/peer"
|
|
"github.com/kaspanet/kaspad/protocol/protocolerrors"
|
|
"github.com/kaspanet/kaspad/wire"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
// allowSelfConnections is only used to allow the tests to bypass the self
|
|
// connection detecting and disconnect logic since they intentionally
|
|
// do so for testing purposes.
|
|
allowSelfConnections bool
|
|
|
|
// minAcceptableProtocolVersion is the lowest protocol version that a
|
|
// connected peer may support.
|
|
minAcceptableProtocolVersion = wire.ProtocolVersion
|
|
)
|
|
|
|
const timeout = 30 * time.Second
|
|
|
|
// ReceiveVersion waits for the peer to send a version message, sends a
|
|
// verack in response, and updates its info accordingly.
|
|
func ReceiveVersion(incomingRoute *router.Route, outgoingRoute *router.Route, netAdapter *netadapter.NetAdapter,
|
|
peer *peerpkg.Peer, dag *blockdag.BlockDAG) (addr *wire.NetAddress, routeClosed bool, err error) {
|
|
|
|
message, isOpen := incomingRoute.Dequeue()
|
|
if !isOpen {
|
|
return nil, true, nil
|
|
}
|
|
|
|
msgVersion, ok := message.(*wire.MsgVersion)
|
|
if !ok {
|
|
return nil, false, protocolerrors.New(true, "a version message must precede all others")
|
|
}
|
|
|
|
if !allowSelfConnections && netAdapter.ID().IsEqual(msgVersion.ID) {
|
|
return nil, false, protocolerrors.New(true, "connected to self")
|
|
}
|
|
|
|
// Notify and disconnect clients that have a protocol version that is
|
|
// too old.
|
|
//
|
|
// NOTE: If minAcceptableProtocolVersion is raised to be higher than
|
|
// wire.RejectVersion, this should send a reject packet before
|
|
// disconnecting.
|
|
if msgVersion.ProtocolVersion < minAcceptableProtocolVersion {
|
|
//TODO(libp2p) create error type for disconnect but don't ban
|
|
return nil, false, protocolerrors.Errorf(false, "protocol version must be %d or greater",
|
|
minAcceptableProtocolVersion)
|
|
}
|
|
|
|
// Disconnect from partial nodes in networks that don't allow them
|
|
if !dag.Params.EnableNonNativeSubnetworks && msgVersion.SubnetworkID != nil {
|
|
return nil, false, protocolerrors.New(true, "partial nodes are not allowed")
|
|
}
|
|
|
|
// TODO(libp2p)
|
|
//// Disconnect if:
|
|
//// - we are a full node and the outbound connection we've initiated is a partial node
|
|
//// - the remote node is partial and our subnetwork doesn't match their subnetwork
|
|
//localSubnetworkID := config.ActiveConfig().SubnetworkID
|
|
//isLocalNodeFull := localSubnetworkID == nil
|
|
//isRemoteNodeFull := msgVersion.SubnetworkID == nil
|
|
//if (isLocalNodeFull && !isRemoteNodeFull && !connection.IsInbound()) ||
|
|
// (!isLocalNodeFull && !isRemoteNodeFull && !msgVersion.SubnetworkID.IsEqual(localSubnetworkID)) {
|
|
//
|
|
// return nil, false, errors.New("incompatible subnetworks")
|
|
//}
|
|
|
|
peer.UpdateFieldsFromMsgVersion(msgVersion)
|
|
isOpen, err = outgoingRoute.EnqueueWithTimeout(wire.NewMsgVerAck(), timeout)
|
|
if err != nil {
|
|
return nil, false, err
|
|
}
|
|
if !isOpen {
|
|
return nil, true, nil
|
|
}
|
|
// TODO(libp2p) Register peer ID
|
|
return msgVersion.Address, false, nil
|
|
}
|