syntax = "proto3"; package protowire; option go_package = "github.com/kaspanet/kaspad/protowire"; message KaspadMessage { oneof payload { AddressesMessage addresses = 1; BlockMessage block = 2; TransactionMessage transaction = 3; RequestBlockLocatorMessage requestBlockLocator = 4; BlockLocatorMessage blockLocator = 5; RequestAddressesMessage requestAddresses = 6; RequestIBDBlocksMessage requestIBDBlocks = 7; RequestNextIBDBlocksMessage requestNextIBDBlocks = 8; DoneIBDBlocksMessage DoneIBDBlocks = 9; RequestRelayBlocksMessage requestRelayBlocks = 10; RequestSelectedTipMessage requestSelectedTip = 11; RequestTransactionsMessage requestTransactions = 12; BlockMessage ibdBlock = 13; InvRelayBlockMessage invRelayBlock = 14; InvTransactionsMessage invTransactions = 15; PingMessage ping = 16; PongMessage pong = 17; SelectedTipMessage selectedTip = 18; VerackMessage verack = 19; VersionMessage version = 20; TransactionNotFoundMessage transactionNotFound = 21; RejectMessage reject = 22; GetCurrentNetworkRequestMessage getCurrentNetworkRequest = 1001; GetCurrentNetworkResponseMessage getCurrentNetworkResponse = 1002; SubmitBlockRequestMessage submitBlockRequest = 1003; SubmitBlockResponseMessage submitBlockResponse = 1004; GetBlockTemplateRequestMessage getBlockTemplateRequest = 1005; GetBlockTemplateResponseMessage getBlockTemplateResponse = 1006; NotifyBlockAddedRequestMessage notifyBlockAddedRequest = 1007; NotifyBlockAddedResponseMessage notifyBlockAddedResponse = 1008; BlockAddedNotificationMessage blockAddedNotification = 1009; GetPeerAddressesRequestMessage getPeerAddressesRequest = 1010; GetPeerAddressesResponseMessage getPeerAddressesResponse = 1011; GetSelectedTipHashRequestMessage getSelectedTipHashRequest = 1012; GetSelectedTipHashResponseMessage getSelectedTipHashResponse = 1013; GetMempoolEntryRequestMessage getMempoolEntryRequest = 1014; GetMempoolEntryResponseMessage getMempoolEntryResponse = 1015; GetConnectedPeerInfoRequestMessage getConnectedPeerInfoRequest = 1016; GetConnectedPeerInfoResponseMessage getConnectedPeerInfoResponse = 1017; AddPeerRequestMessage addPeerRequest = 1018; AddPeerResponseMessage addPeerResponse = 1019; SubmitTransactionRequestMessage submitTransactionRequest = 1020; SubmitTransactionResponseMessage submitTransactionResponse = 1021; NotifyChainChangedRequestMessage notifyChainChangedRequest = 1022; NotifyChainChangedResponseMessage notifyChainChangedResponse = 1023; ChainChangedNotificationMessage chainChangedNotification = 1024; GetBlockRequestMessage getBlockRequest = 1025; GetBlockResponseMessage getBlockResponse = 1026; GetSubnetworkRequestMessage getSubnetworkRequest = 1027; GetSubnetworkResponseMessage getSubnetworkResponse = 1028; GetChainFromBlockRequestMessage getChainFromBlockRequest = 1029; GetChainFromBlockResponseMessage getChainFromBlockResponse = 1030; GetBlocksRequestMessage getBlocksRequest = 1031; GetBlocksResponseMessage getBlocksResponse = 1032; } } ///////////////////////////////////////////////////////////////////////////// // P2P // ///////////////////////////////////////////////////////////////////////////// // AddressesMessage start message AddressesMessage{ bool includeAllSubnetworks = 1; SubnetworkID subnetworkID = 2; repeated NetAddress addressList = 3; } message NetAddress{ int64 timestamp = 1; uint64 services = 2; bytes ip = 3; uint32 port = 4; } message SubnetworkID{ bytes bytes = 1; } // AddressesMessage end // GetAddressesMessage start message RequestAddressesMessage{ bool includeAllSubnetworks = 1; SubnetworkID subnetworkID = 2; } // GetAddressesMessage end // TransactionMessage start message TransactionMessage{ int32 version = 1; repeated TransactionInput inputs = 2; repeated TransactionOutput outputs = 3; uint64 lockTime = 4; SubnetworkID subnetworkID = 5; uint64 gas = 6; Hash payloadHash = 7; bytes Payload = 8; } message TransactionInput{ Outpoint PreviousOutpoint = 1; bytes SignatureScript = 2; uint64 Sequence = 3; } message Outpoint{ TransactionID transactionID = 1; uint32 index = 2; } message TransactionID{ bytes bytes = 1; } message TransactionOutput{ uint64 value = 1; bytes ScriptPubKey = 2; } // TransactionMessage end // BlockMessage start message BlockMessage{ BlockHeader header = 1; repeated TransactionMessage transactions = 2; } message BlockHeader{ int32 version = 1; repeated Hash parentHashes = 2; Hash hashMerkleRoot = 3; Hash acceptedIDMerkleRoot = 4; Hash utxoCommitment = 5; int64 timestamp = 6; uint32 bits = 7; uint64 nonce = 8; } message Hash{ bytes bytes = 1; } // BlockMessage end // GetBlockLocatorMessage start message RequestBlockLocatorMessage{ Hash lowHash = 1; Hash highHash = 2; } // GetBlockLocatorMessage end // BlockLocatorMessage start message BlockLocatorMessage{ repeated Hash hashes = 1; } // BlockLocatorMessage end // GetBlocksMessage start message RequestIBDBlocksMessage{ Hash lowHash = 1; Hash highHash = 2; } // GetBlocksMessage end // RequestNextIBDBlocksMessage start message RequestNextIBDBlocksMessage{ } // RequestNextIBDBlocksMessage end // DoneIBDBlocksMessage start message DoneIBDBlocksMessage{ } // DoneIBDBlocksMessage end // GetRelayBlocksMessage start message RequestRelayBlocksMessage{ repeated Hash hashes = 1; } // GetRelayBlocksMessage end // GetSelectedTipMessage start message RequestSelectedTipMessage{ } // GetSelectedTipMessage end // RequestTransactionsMessage start message RequestTransactionsMessage { repeated TransactionID ids = 1; } // GetTransactionsMessage end // TransactionNotFoundMessage start message TransactionNotFoundMessage{ TransactionID id = 1; } // TransactionsNotFoundMessage end // InvRelayBlockMessage start message InvRelayBlockMessage{ Hash hash = 1; } // InvRelayBlockMessage end // InvTransactionMessage start message InvTransactionsMessage{ repeated TransactionID ids = 1; } // InvTransactionMessage end // PingMessage start message PingMessage{ uint64 nonce = 1; } // PingMessage end // PongMessage start message PongMessage{ uint64 nonce = 1; } // PongMessage end // SelectedTipMessage start message SelectedTipMessage{ Hash selectedTipHash = 1; } // SelectedTipMessage end // VerackMessage start message VerackMessage{ } // VerackMessage end // VersionMessage start message VersionMessage{ uint32 protocolVersion = 1; uint64 services = 2; int64 timestamp = 3; NetAddress address = 4; bytes id = 5; string userAgent = 6; Hash selectedTipHash = 7; bool disableRelayTx = 8; SubnetworkID subnetworkID = 9; string network = 10; } // VersionMessage end // RejectMessage start message RejectMessage{ string reason = 1; } // RejectMessage end service P2P { rpc MessageStream (stream KaspadMessage) returns (stream KaspadMessage) {} } ///////////////////////////////////////////////////////////////////////////// // RPC // ///////////////////////////////////////////////////////////////////////////// message RPCError{ string message = 1; } message GetCurrentNetworkRequestMessage{ } message GetCurrentNetworkResponseMessage{ string currentNetwork = 1; RPCError error = 2; } message SubmitBlockRequestMessage{ string blockHex = 1; } message SubmitBlockResponseMessage{ RPCError error = 1; } message GetBlockTemplateRequestMessage{ string payAddress = 1; string longPollId = 2; } message GetBlockTemplateResponseMessage{ string bits = 1; int64 currentTime = 2; repeated string parentHashes = 3; int32 massLimit = 4; repeated GetBlockTemplateTransactionMessage transactions = 5; string hashMerkleRoot = 6; string acceptedIDMerkleRoot = 7; string utxoCommitment = 8; int32 version = 9; string longPollId = 10; string targetDifficulty = 11; int64 minTime = 12; int64 maxTime = 13; repeated string mutableFields = 14; string nonceRange = 15; bool isSynced = 16; bool isConnected = 17; RPCError error = 18; } message GetBlockTemplateTransactionMessage{ string data = 1; string id = 2; repeated int64 depends = 3; uint64 mass = 4; uint64 fee = 5; } message NotifyBlockAddedRequestMessage{ } message NotifyBlockAddedResponseMessage{ RPCError error = 1; } message BlockAddedNotificationMessage{ BlockMessage block = 1; } message GetPeerAddressesRequestMessage{ } message GetPeerAddressesResponseMessage{ repeated GetPeerAddressesKnownAddressMessage addresses = 1; RPCError error = 2; } message GetPeerAddressesKnownAddressMessage { string Addr = 1; } message GetSelectedTipHashRequestMessage{ } message GetSelectedTipHashResponseMessage{ string selectedTipHash = 1; RPCError error = 2; } message GetMempoolEntryRequestMessage{ string txId = 1; } message GetMempoolEntryResponseMessage{ RPCError error = 1; } message GetConnectedPeerInfoRequestMessage{ } message GetConnectedPeerInfoResponseMessage{ repeated GetConnectedPeerInfoMessage infos = 1; RPCError error = 2; } message GetConnectedPeerInfoMessage{ string id = 1; string address = 2; int64 lastPingDuration = 3; string selectedTipHash = 4; bool isSyncNode = 5; bool isOutbound = 6; int64 timeOffset = 7; string userAgent = 8; uint32 advertisedProtocolVersion = 9; int64 timeConnected = 10; } message AddPeerRequestMessage{ string address = 1; bool isPermanent = 2; } message AddPeerResponseMessage{ RPCError error = 1; } message SubmitTransactionRequestMessage{ string transactionHex = 1; } message SubmitTransactionResponseMessage{ string txId = 1; RPCError error = 2; } message NotifyChainChangedRequestMessage{ } message NotifyChainChangedResponseMessage{ RPCError error = 1; } message ChainChangedNotificationMessage{ repeated string removedChainBlockHashes = 1; repeated ChainBlock addedChainBlocks = 2; } message ChainBlock{ string hash = 1; repeated AcceptedBlock acceptedBlocks = 2; } message AcceptedBlock{ string hash = 1; repeated string acceptedTxIds = 2; } message GetBlockRequestMessage{ string hash = 1; string subnetworkId = 2; bool includeBlockHex = 3; bool includeBlockVerboseData = 4; bool includeTransactionVerboseData = 5; } message GetBlockResponseMessage{ string blockHash = 1; string blockHex = 2; BlockVerboseData blockVerboseData = 3; RPCError error = 4; } message BlockVerboseData{ string hash = 1; uint64 confirmations = 2; int32 size = 3; uint64 blueScore = 4; bool isChainBlock = 5; int32 version = 6; string versionHex = 7; string hashMerkleRoot = 8; string acceptedIDMerkleRoot = 9; string utxoCommitment = 10; repeated string transactionHex = 11; repeated TransactionVerboseData transactionVerboseData = 12; int64 time = 13; uint64 nonce = 14; string bits = 15; double difficulty = 16; repeated string parentHashes = 17; string selectedParentHash = 18; repeated string childHashes = 19; repeated string acceptedBlockHashes = 20; } message TransactionVerboseData{ string hex = 1; string txId = 2; string hash = 3; int32 size = 4; int32 version = 5; uint64 lockTime = 6; string subnetworkId = 7; uint64 gas = 8; string payloadHash = 9; string payload = 10; repeated TransactionVerboseInput transactionVerboseInputs = 11; repeated TransactionVerboseOutput transactionVerboseOutputs = 12; string blockHash = 13; string acceptedBy = 14; bool isInMempool = 15; uint64 time = 16; uint64 blockTime = 17; } 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; ScriptPubKeyResult scriptPubKey = 3; } message ScriptPubKeyResult{ string asm = 1; string hex = 2; string type = 3; string address = 4; } message GetSubnetworkRequestMessage{ string subnetworkId = 1; } message GetSubnetworkResponseMessage{ uint64 gasLimit = 1; RPCError error = 2; } message GetChainFromBlockRequestMessage{ string startHash = 1; bool includeBlockVerboseData = 2; } message GetChainFromBlockResponseMessage{ repeated string removedChainBlockHashes = 1; repeated ChainBlock addedChainBlocks = 2; repeated BlockVerboseData blockVerboseData = 3; RPCError error = 4; } message GetBlocksRequestMessage{ string lowHash = 1; bool includeBlockHexes = 2; bool includeBlockVerboseData = 3; bool includeTransactionVerboseData = 4; } message GetBlocksResponseMessage{ repeated string blockHashes = 1; repeated string blockHexes = 2; repeated BlockVerboseData blockVerboseData = 3; RPCError error = 4; } service RPC { rpc MessageStream (stream KaspadMessage) returns (stream KaspadMessage) {} }