mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-03-30 15:08:33 +00:00

* [NOD-1444] Implement getHeaders RPC command * [NOD-1444] Fix tests and comments * [NOD-1444] Fix error message * [NOD-1444] Make GetHeaders propagate header serialization errors * [NOD-1444] RLock the dag on GetHeaders * [NOD-1444] Change the error field number to 1000
196 lines
8.0 KiB
Go
196 lines
8.0 KiB
Go
// Copyright (c) 2013-2016 The btcsuite developers
|
|
// Use of this source code is governed by an ISC
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package appmessage
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// MaxMessagePayload is the maximum bytes a message can be regardless of other
|
|
// individual limits imposed by messages themselves.
|
|
const MaxMessagePayload = 1024 * 1024 * 32 // 32MB
|
|
|
|
// MessageCommand is a number in the header of a message that represents its type.
|
|
type MessageCommand uint32
|
|
|
|
func (cmd MessageCommand) String() string {
|
|
cmdString, ok := ProtocolMessageCommandToString[cmd]
|
|
if !ok {
|
|
cmdString, ok = RPCMessageCommandToString[cmd]
|
|
}
|
|
if !ok {
|
|
cmdString = "unknown command"
|
|
}
|
|
return fmt.Sprintf("%s [code %d]", cmdString, uint8(cmd))
|
|
}
|
|
|
|
// Commands used in kaspa message headers which describe the type of message.
|
|
const (
|
|
// protocol
|
|
CmdVersion MessageCommand = iota
|
|
CmdVerAck
|
|
CmdRequestAddresses
|
|
CmdAddresses
|
|
CmdRequestIBDBlocks
|
|
CmdBlock
|
|
CmdTx
|
|
CmdPing
|
|
CmdPong
|
|
CmdRequestBlockLocator
|
|
CmdBlockLocator
|
|
CmdSelectedTip
|
|
CmdRequestSelectedTip
|
|
CmdInvRelayBlock
|
|
CmdRequestRelayBlocks
|
|
CmdInvTransaction
|
|
CmdRequestTransactions
|
|
CmdIBDBlock
|
|
CmdRequestNextIBDBlocks
|
|
CmdDoneIBDBlocks
|
|
CmdTransactionNotFound
|
|
CmdReject
|
|
|
|
// rpc
|
|
CmdGetCurrentNetworkRequestMessage
|
|
CmdGetCurrentNetworkResponseMessage
|
|
CmdSubmitBlockRequestMessage
|
|
CmdSubmitBlockResponseMessage
|
|
CmdGetBlockTemplateRequestMessage
|
|
CmdGetBlockTemplateResponseMessage
|
|
CmdGetBlockTemplateTransactionMessage
|
|
CmdNotifyBlockAddedRequestMessage
|
|
CmdNotifyBlockAddedResponseMessage
|
|
CmdBlockAddedNotificationMessage
|
|
CmdGetPeerAddressesRequestMessage
|
|
CmdGetPeerAddressesResponseMessage
|
|
CmdGetSelectedTipHashRequestMessage
|
|
CmdGetSelectedTipHashResponseMessage
|
|
CmdGetMempoolEntryRequestMessage
|
|
CmdGetMempoolEntryResponseMessage
|
|
CmdGetConnectedPeerInfoRequestMessage
|
|
CmdGetConnectedPeerInfoResponseMessage
|
|
CmdAddPeerRequestMessage
|
|
CmdAddPeerResponseMessage
|
|
CmdSubmitTransactionRequestMessage
|
|
CmdSubmitTransactionResponseMessage
|
|
CmdNotifyChainChangedRequestMessage
|
|
CmdNotifyChainChangedResponseMessage
|
|
CmdChainChangedNotificationMessage
|
|
CmdGetBlockRequestMessage
|
|
CmdGetBlockResponseMessage
|
|
CmdGetSubnetworkRequestMessage
|
|
CmdGetSubnetworkResponseMessage
|
|
CmdGetChainFromBlockRequestMessage
|
|
CmdGetChainFromBlockResponseMessage
|
|
CmdGetBlocksRequestMessage
|
|
CmdGetBlocksResponseMessage
|
|
CmdGetBlockCountRequestMessage
|
|
CmdGetBlockCountResponseMessage
|
|
CmdGetBlockDAGInfoRequestMessage
|
|
CmdGetBlockDAGInfoResponseMessage
|
|
CmdResolveFinalityConflictRequestMessage
|
|
CmdResolveFinalityConflictResponseMessage
|
|
CmdNotifyFinalityConflictsRequestMessage
|
|
CmdNotifyFinalityConflictsResponseMessage
|
|
CmdFinalityConflictNotificationMessage
|
|
CmdFinalityConflictResolvedNotificationMessage
|
|
CmdGetMempoolEntriesRequestMessage
|
|
CmdGetMempoolEntriesResponseMessage
|
|
CmdShutDownRequestMessage
|
|
CmdShutDownResponseMessage
|
|
CmdGetHeadersRequestMessage
|
|
CmdGetHeadersResponseMessage
|
|
)
|
|
|
|
// ProtocolMessageCommandToString maps all MessageCommands to their string representation
|
|
var ProtocolMessageCommandToString = map[MessageCommand]string{
|
|
CmdVersion: "Version",
|
|
CmdVerAck: "VerAck",
|
|
CmdRequestAddresses: "RequestAddresses",
|
|
CmdAddresses: "Addresses",
|
|
CmdRequestIBDBlocks: "RequestBlocks",
|
|
CmdBlock: "Block",
|
|
CmdTx: "Tx",
|
|
CmdPing: "Ping",
|
|
CmdPong: "Pong",
|
|
CmdRequestBlockLocator: "RequestBlockLocator",
|
|
CmdBlockLocator: "BlockLocator",
|
|
CmdSelectedTip: "SelectedTip",
|
|
CmdRequestSelectedTip: "RequestSelectedTip",
|
|
CmdInvRelayBlock: "InvRelayBlock",
|
|
CmdRequestRelayBlocks: "RequestRelayBlocks",
|
|
CmdInvTransaction: "InvTransaction",
|
|
CmdRequestTransactions: "RequestTransactions",
|
|
CmdIBDBlock: "IBDBlock",
|
|
CmdRequestNextIBDBlocks: "RequestNextIBDBlocks",
|
|
CmdDoneIBDBlocks: "DoneIBDBlocks",
|
|
CmdTransactionNotFound: "TransactionNotFound",
|
|
CmdReject: "Reject",
|
|
}
|
|
|
|
// RPCMessageCommandToString maps all MessageCommands to their string representation
|
|
var RPCMessageCommandToString = map[MessageCommand]string{
|
|
CmdGetCurrentNetworkRequestMessage: "GetCurrentNetworkRequest",
|
|
CmdGetCurrentNetworkResponseMessage: "GetCurrentNetworkResponse",
|
|
CmdSubmitBlockRequestMessage: "SubmitBlockRequest",
|
|
CmdSubmitBlockResponseMessage: "SubmitBlockResponse",
|
|
CmdGetBlockTemplateRequestMessage: "GetBlockTemplateRequest",
|
|
CmdGetBlockTemplateResponseMessage: "GetBlockTemplateResponse",
|
|
CmdGetBlockTemplateTransactionMessage: "CmdGetBlockTemplateTransaction",
|
|
CmdNotifyBlockAddedRequestMessage: "NotifyBlockAddedRequest",
|
|
CmdNotifyBlockAddedResponseMessage: "NotifyBlockAddedResponse",
|
|
CmdBlockAddedNotificationMessage: "BlockAddedNotification",
|
|
CmdGetPeerAddressesRequestMessage: "GetPeerAddressesRequest",
|
|
CmdGetPeerAddressesResponseMessage: "GetPeerAddressesResponse",
|
|
CmdGetSelectedTipHashRequestMessage: "GetSelectedTipHashRequest",
|
|
CmdGetSelectedTipHashResponseMessage: "GetSelectedTipHashResponse",
|
|
CmdGetMempoolEntryRequestMessage: "GetMempoolEntryRequest",
|
|
CmdGetMempoolEntryResponseMessage: "GetMempoolEntryResponse",
|
|
CmdGetConnectedPeerInfoRequestMessage: "GetConnectedPeerInfoRequest",
|
|
CmdGetConnectedPeerInfoResponseMessage: "GetConnectedPeerInfoResponse",
|
|
CmdAddPeerRequestMessage: "AddPeerRequest",
|
|
CmdAddPeerResponseMessage: "AddPeerResponse",
|
|
CmdSubmitTransactionRequestMessage: "SubmitTransactionRequest",
|
|
CmdSubmitTransactionResponseMessage: "SubmitTransactionResponse",
|
|
CmdNotifyChainChangedRequestMessage: "NotifyChainChangedRequest",
|
|
CmdNotifyChainChangedResponseMessage: "NotifyChainChangedResponse",
|
|
CmdChainChangedNotificationMessage: "ChainChangedNotification",
|
|
CmdGetBlockRequestMessage: "GetBlockRequest",
|
|
CmdGetBlockResponseMessage: "GetBlockResponse",
|
|
CmdGetSubnetworkRequestMessage: "GetSubnetworkRequest",
|
|
CmdGetSubnetworkResponseMessage: "GetSubnetworkResponse",
|
|
CmdGetChainFromBlockRequestMessage: "GetChainFromBlockRequest",
|
|
CmdGetChainFromBlockResponseMessage: "GetChainFromBlockResponse",
|
|
CmdGetBlocksRequestMessage: "GetBlocksRequest",
|
|
CmdGetBlocksResponseMessage: "GetBlocksResponse",
|
|
CmdGetBlockCountRequestMessage: "GetBlockCountRequest",
|
|
CmdGetBlockCountResponseMessage: "GetBlockCountResponse",
|
|
CmdGetBlockDAGInfoRequestMessage: "GetBlockDAGInfoRequest",
|
|
CmdGetBlockDAGInfoResponseMessage: "GetBlockDAGInfoResponse",
|
|
CmdResolveFinalityConflictRequestMessage: "ResolveFinalityConflictRequest",
|
|
CmdResolveFinalityConflictResponseMessage: "ResolveFinalityConflictResponse",
|
|
CmdNotifyFinalityConflictsRequestMessage: "NotifyFinalityConflictsRequest",
|
|
CmdNotifyFinalityConflictsResponseMessage: "NotifyFinalityConflictsResponse",
|
|
CmdFinalityConflictNotificationMessage: "FinalityConflictNotification",
|
|
CmdFinalityConflictResolvedNotificationMessage: "FinalityConflictResolvedNotification",
|
|
CmdGetMempoolEntriesRequestMessage: "GetMempoolEntriesRequestMessage",
|
|
CmdGetMempoolEntriesResponseMessage: "GetMempoolEntriesResponseMessage",
|
|
CmdGetHeadersRequestMessage: "GetHeadersRequest",
|
|
CmdGetHeadersResponseMessage: "GetHeadersResponse",
|
|
}
|
|
|
|
// Message is an interface that describes a kaspa message. A type that
|
|
// implements Message has complete control over the representation of its data
|
|
// and may therefore contain additional or fewer fields than those which
|
|
// are used directly in the protocol encoded message.
|
|
type Message interface {
|
|
Command() MessageCommand
|
|
MessageNumber() uint64
|
|
SetMessageNumber(index uint64)
|
|
ReceivedAt() time.Time
|
|
SetReceivedAt(receivedAt time.Time)
|
|
}
|