// RPC-related types. Request messages, response messages, and dependant types. // // Clients are expected to build RequestMessages and wrap them in KaspadMessage. (see messages.proto) // // Having received a RequestMessage, (wrapped in a KaspadMessage) the RPC server will respond with a // ResponseMessage (likewise wrapped in a KaspadMessage) respective to the original RequestMessage. // // **IMPORTANT:** This API is a work in progress and is subject to break between versions. // syntax = "proto3"; package protowire; option go_package = "github.com/kaspanet/kaspad/protowire"; import "p2p.proto"; // RPCError represents a generic non-internal error. // // Receivers of any ResponseMessage are expected to check whether its error field is not null. message RPCError{ string message = 1; } // GetCurrentNetworkRequestMessage requests the network kaspad is currently running against. // // Possible networks are: Mainnet, Testnet, Simnet, Devnet message GetCurrentNetworkRequestMessage{ } message GetCurrentNetworkResponseMessage{ string currentNetwork = 1; RPCError error = 1000; } // SubmitBlockRequestMessage requests to submit a block into the DAG. // Blocks are generally expected to have been generated using the getBlockTemplate call. // // See: GetBlockTemplateRequestMessage message SubmitBlockRequestMessage{ BlockMessage block = 1; } message SubmitBlockResponseMessage{ enum RejectReason { NONE = 0; BLOCK_INVALID = 1; IS_IN_IBD = 2; } RejectReason rejectReason = 1; RPCError error = 1000; } // GetBlockTemplateRequestMessage requests a current block template. // Callers are expected to solve the block template and submit it using the submitBlock call // // See: SubmitBlockRequestMessage message GetBlockTemplateRequestMessage{ // Which kaspa address should the coinbase block reward transaction pay into string payAddress = 1; } message GetBlockTemplateResponseMessage{ BlockMessage blockMessage = 1; // Whether kaspad thinks that it's synced. // Callers are discouraged (but not forbidden) from solving blocks when kaspad is not synced. // That is because when kaspad isn't in sync with the rest of the network there's a high // chance the block will never be accepted, thus the solving effort would have been wasted. bool isSynced = 2; RPCError error = 1000; } // NotifyBlockAddedRequestMessage registers this connection for blockAdded notifications. // // See: BlockAddedNotificationMessage message NotifyBlockAddedRequestMessage{ } message NotifyBlockAddedResponseMessage{ RPCError error = 1000; } // BlockAddedNotificationMessage is sent whenever a blocks has been added (NOT accepted) // into the DAG. // // See: NotifyBlockAddedRequestMessage message BlockAddedNotificationMessage{ BlockMessage block = 1; BlockVerboseData blockVerboseData = 2; } // GetPeerAddressesRequestMessage requests the list of known kaspad addresses in the // current network. (mainnet, testnet, etc.) message GetPeerAddressesRequestMessage{ } message GetPeerAddressesResponseMessage{ repeated GetPeerAddressesKnownAddressMessage addresses = 1; repeated GetPeerAddressesKnownAddressMessage bannedAddresses = 2; RPCError error = 1000; } message GetPeerAddressesKnownAddressMessage { string Addr = 1; } // GetSelectedTipHashRequestMessage requests the hash of the current virtual's // selected parent. message GetSelectedTipHashRequestMessage{ } message GetSelectedTipHashResponseMessage{ string selectedTipHash = 1; RPCError error = 1000; } // GetMempoolEntryRequestMessage requests information about a specific transaction // in the mempool. message GetMempoolEntryRequestMessage{ // The transaction's TransactionID. string txId = 1; } message GetMempoolEntryResponseMessage{ MempoolEntry entry = 1; RPCError error = 1000; } // GetMempoolEntriesRequestMessage requests information about all the transactions // currently in the mempool. message GetMempoolEntriesRequestMessage{ } message GetMempoolEntriesResponseMessage{ repeated MempoolEntry entries = 1; RPCError error = 1000; } message MempoolEntry{ uint64 fee = 1; TransactionVerboseData transactionVerboseData = 2; } // GetConnectedPeerInfoRequestMessage requests information about all the p2p peers // currently connected to this kaspad. message GetConnectedPeerInfoRequestMessage{ } message GetConnectedPeerInfoResponseMessage{ repeated GetConnectedPeerInfoMessage infos = 1; RPCError error = 1000; } message GetConnectedPeerInfoMessage{ string id = 1; string address = 2; // How long did the last ping/pong exchange take int64 lastPingDuration = 3; // Whether this kaspad initiated the connection bool isOutbound = 6; int64 timeOffset = 7; string userAgent = 8; // The protocol version that this peer claims to support uint32 advertisedProtocolVersion = 9; // The timestamp of when this peer connected to this kaspad int64 timeConnected = 10; // Whether this peer is the IBD peer (if IBD is running) bool isIbdPeer = 11; } // AddPeerRequestMessage adds a peer to kaspad's outgoing connection list. // This will, in most cases, result in kaspad connecting to said peer. message AddPeerRequestMessage{ string address = 1; // Whether to keep attempting to connect to this peer after disconnection bool isPermanent = 2; } message AddPeerResponseMessage{ RPCError error = 1000; } // SubmitTransactionRequestMessage submits a transaction to the mempool message SubmitTransactionRequestMessage{ RpcTransaction transaction = 1; } message SubmitTransactionResponseMessage{ // The transaction ID of the submitted transaction string transactionId = 1; RPCError error = 1000; } // NotifyVirtualSelectedParentChainChangedRequestMessage registers this connection for virtualSelectedParentChainChanged notifications. // // See: VirtualSelectedParentChainChangedNotificationMessage message NotifyVirtualSelectedParentChainChangedRequestMessage{ } message NotifyVirtualSelectedParentChainChangedResponseMessage{ RPCError error = 1000; } // VirtualSelectedParentChainChangedNotificationMessage is sent whenever the DAG's selected parent // chain had changed. // // See: NotifyVirtualSelectedParentChainChangedRequestMessage message VirtualSelectedParentChainChangedNotificationMessage{ // The chain blocks that were removed, in high-to-low order repeated string removedChainBlockHashes = 1; // The chain blocks that were added, in low-to-high order repeated ChainBlock addedChainBlocks = 2; } message ChainBlock{ string hash = 1; repeated AcceptedBlock acceptedBlocks = 2; } message AcceptedBlock{ string hash = 1; repeated string acceptedTransactionIds = 2; } // GetBlockRequestMessage requests information about a specific block message GetBlockRequestMessage{ // The hash of the requested block string hash = 1; // Whether to include transaction data in the response bool includeTransactionVerboseData = 3; } message GetBlockResponseMessage{ string blockHash = 1; BlockVerboseData blockVerboseData = 2; RPCError error = 1000; } message BlockVerboseData{ string hash = 1; uint32 version = 2; string versionHex = 3; string hashMerkleRoot = 4; string acceptedIDMerkleRoot = 5; string utxoCommitment = 6; repeated TransactionVerboseData transactionVerboseData = 7; int64 time = 8; uint64 nonce = 9; string bits = 10; double difficulty = 11; repeated string parentHashes = 12; repeated string childrenHashes = 17; string selectedParentHash = 13; repeated string transactionIDs = 14; bool isHeaderOnly = 15; uint64 blueScore = 16; } message TransactionVerboseData{ string txId = 1; string hash = 2; uint64 size = 3; uint32 version = 4; uint64 lockTime = 5; string subnetworkId = 6; uint64 gas = 7; string payload = 9; repeated TransactionVerboseInput transactionVerboseInputs = 10; repeated TransactionVerboseOutput transactionVerboseOutputs = 11; string blockHash = 12; uint64 time = 13; uint64 blockTime = 14; } message TransactionVerboseInput{ string txId = 1; uint32 outputIndex = 2; ScriptSig scriptSig = 3; uint64 sequence = 4; } message ScriptSig{ string asm = 1; string hex = 2; } message TransactionVerboseOutput{ uint64 value = 1; uint32 index = 2; ScriptPublicKeyResult scriptPublicKey = 3; } message ScriptPublicKeyResult{ string asm = 1; string hex = 2; string type = 3; string address = 4; uint32 version = 5; } // GetSubnetworkRequestMessage requests information about a specific subnetwork // // Currently unimplemented message GetSubnetworkRequestMessage{ string subnetworkId = 1; } message GetSubnetworkResponseMessage{ uint64 gasLimit = 1; RPCError error = 1000; } // GetVirtualSelectedParentChainFromBlockRequestMessage requests the virtual selected // parent chain from some startHash to this kaspad's current virtual message GetVirtualSelectedParentChainFromBlockRequestMessage{ string startHash = 1; } message GetVirtualSelectedParentChainFromBlockResponseMessage{ // The chain blocks that were removed, in high-to-low order repeated string removedChainBlockHashes = 1; // The chain blocks that were added, in low-to-high order repeated ChainBlock addedChainBlocks = 2; RPCError error = 1000; } // GetBlocksRequestMessage requests blocks between a certain block lowHash up to this // kaspad's current virtual. message GetBlocksRequestMessage{ string lowHash = 1; bool includeBlockVerboseData = 2; bool includeTransactionVerboseData = 3; } message GetBlocksResponseMessage{ repeated string blockHashes = 1; repeated BlockVerboseData blockVerboseData = 2; RPCError error = 1000; } // GetBlockCountRequestMessage requests the current number of blocks in this kaspad. // Note that this number may decrease as pruning occurs. message GetBlockCountRequestMessage{ } message GetBlockCountResponseMessage{ uint64 blockCount = 1; uint64 headerCount = 2; RPCError error = 1000; } // GetBlockDagInfoRequestMessage requests general information about the current state // of this kaspad's DAG. message GetBlockDagInfoRequestMessage{ } message GetBlockDagInfoResponseMessage{ string networkName = 1; uint64 blockCount = 2; uint64 headerCount = 3; repeated string tipHashes = 4; double difficulty = 5; int64 pastMedianTime = 6; repeated string virtualParentHashes = 7; string pruningPointHash = 8; RPCError error = 1000; } message ResolveFinalityConflictRequestMessage{ string finalityBlockHash = 1; } message ResolveFinalityConflictResponseMessage{ RPCError error = 1000; } message NotifyFinalityConflictsRequestMessage{ } message NotifyFinalityConflictsResponseMessage{ RPCError error = 1000; } message FinalityConflictNotificationMessage{ string violatingBlockHash = 1; } message FinalityConflictResolvedNotificationMessage{ string finalityBlockHash = 1; } // ShutDownRequestMessage shuts down this kaspad. message ShutDownRequestMessage{ } message ShutDownResponseMessage{ RPCError error = 1000; } // GetHeadersRequestMessage requests headers between the given startHash and the // current virtual, up to the given limit. message GetHeadersRequestMessage{ string startHash = 1; uint64 limit = 2; bool isAscending = 3; } message GetHeadersResponseMessage{ repeated string headers = 1; RPCError error = 1000; } // NotifyUtxosChangedRequestMessage registers this connection for utxoChanged notifications // for the given addresses. // // This call is only available when this kaspad was started with `--utxoindex` // // See: UtxosChangedNotificationMessage message NotifyUtxosChangedRequestMessage { repeated string addresses = 1; } message NotifyUtxosChangedResponseMessage { RPCError error = 1000; } // UtxosChangedNotificationMessage is sent whenever the UTXO index had been updated. // // See: NotifyUtxosChangedRequestMessage message UtxosChangedNotificationMessage { repeated UtxosByAddressesEntry added = 1; repeated UtxosByAddressesEntry removed = 2; } message UtxosByAddressesEntry { string address = 1; RpcOutpoint outpoint = 2; RpcUtxoEntry utxoEntry = 3; } // StopNotifyingUtxosChangedRequestMessage unregisters this connection for utxoChanged notifications // for the given addresses. // // This call is only available when this kaspad was started with `--utxoindex` // // See: UtxosChangedNotificationMessage message StopNotifyingUtxosChangedRequestMessage { repeated string addresses = 1; } message StopNotifyingUtxosChangedResponseMessage { RPCError error = 1000; } message RpcTransaction { uint32 version = 1; repeated RpcTransactionInput inputs = 2; repeated RpcTransactionOutput outputs = 3; uint64 lockTime = 4; string subnetworkId = 5; uint64 gas = 6; string payload = 8; } message RpcTransactionInput { RpcOutpoint previousOutpoint = 1; string signatureScript = 2; uint64 sequence = 3; } message RpcScriptPublicKey { uint32 version = 1; string scriptPublicKey = 2; } message RpcTransactionOutput { uint64 amount = 1; RpcScriptPublicKey scriptPublicKey = 2; } message RpcOutpoint { string transactionId = 1; uint32 index = 2; } message RpcUtxoEntry { uint64 amount = 1; RpcScriptPublicKey scriptPublicKey = 2; uint64 blockBlueScore = 3; bool isCoinbase = 4; } // GetUtxosByAddressesRequestMessage requests all current UTXOs for the given kaspad addresses // // This call is only available when this kaspad was started with `--utxoindex` message GetUtxosByAddressesRequestMessage { repeated string addresses = 1; } message GetUtxosByAddressesResponseMessage { repeated UtxosByAddressesEntry entries = 1; RPCError error = 1000; } // GetVirtualSelectedParentBlueScoreRequestMessage requests the blue score of the current selected parent // of the virtual block. message GetVirtualSelectedParentBlueScoreRequestMessage { } message GetVirtualSelectedParentBlueScoreResponseMessage { uint64 blueScore = 1; RPCError error = 1000; } // NotifyVirtualSelectedParentBlueScoreChangedRequestMessage registers this connection for // virtualSelectedParentBlueScoreChanged notifications. // // See: VirtualSelectedParentBlueScoreChangedNotificationMessage message NotifyVirtualSelectedParentBlueScoreChangedRequestMessage { } message NotifyVirtualSelectedParentBlueScoreChangedResponseMessage { RPCError error = 1000; } // VirtualSelectedParentBlueScoreChangedNotificationMessage is sent whenever the blue score // of the virtual's selected parent changes. // // See NotifyVirtualSelectedParentBlueScoreChangedRequestMessage message VirtualSelectedParentBlueScoreChangedNotificationMessage { uint64 virtualSelectedParentBlueScore = 1; } // NotifyPruningPointUTXOSetOverrideRequestMessage registers this connection for // pruning point UTXO set override notifications. // // This call is only available when this kaspad was started with `--utxoindex` // // See: NotifyPruningPointUTXOSetOverrideResponseMessage message NotifyPruningPointUTXOSetOverrideRequestMessage { } message NotifyPruningPointUTXOSetOverrideResponseMessage { RPCError error = 1000; } // PruningPointUTXOSetOverrideNotificationMessage is sent whenever the UTXO index // resets due to pruning point change via IBD. // // See NotifyPruningPointUTXOSetOverrideRequestMessage message PruningPointUTXOSetOverrideNotificationMessage { } // StopNotifyingPruningPointUTXOSetOverrideRequestMessage unregisters this connection for // pruning point UTXO set override notifications. // // This call is only available when this kaspad was started with `--utxoindex` // // See: PruningPointUTXOSetOverrideNotificationMessage message StopNotifyingPruningPointUTXOSetOverrideRequestMessage { } message StopNotifyingPruningPointUTXOSetOverrideResponseMessage { RPCError error = 1000; } // BanRequestMessage bans the given ip. message BanRequestMessage{ string ip = 1; } message BanResponseMessage{ RPCError error = 1000; } // UnbanRequestMessage unbans the given ip. message UnbanRequestMessage{ string ip = 1; } message UnbanResponseMessage{ RPCError error = 1000; } // GetInfoRequestMessage returns info about the node. message GetInfoRequestMessage{ } message GetInfoResponseMessage{ string p2pId = 1; uint64 mempoolSize = 2; RPCError error = 1000; }