syntax = "proto3";
package protowire;

option go_package = "github.com/kaspanet/kaspad/protowire";

message RequestAddressesMessage{
  bool includeAllSubnetworks = 1;
  SubnetworkId subnetworkId = 2;
}

message AddressesMessage{
  repeated NetAddress addressList = 1;
}

message NetAddress{
  int64 timestamp = 1;
  bytes ip = 3;
  uint32 port = 4;
}

message SubnetworkId{
  bytes bytes = 1;
}

message TransactionMessage{
  uint32 version = 1;
  repeated TransactionInput inputs = 2;
  repeated TransactionOutput outputs = 3;
  uint64 lockTime = 4;
  SubnetworkId subnetworkId = 5;
  uint64 gas = 6;
  bytes payload = 8;
  uint64 mass = 9;
}

message TransactionInput{
  Outpoint previousOutpoint = 1;
  bytes signatureScript = 2;
  uint64 sequence = 3;
  uint32 sigOpCount = 4;
}

message Outpoint{
  TransactionId transactionId = 1;
  uint32 index = 2;
}

message TransactionId{
  bytes bytes = 1;
}
message ScriptPublicKey {
  bytes script = 1;
  uint32 version = 2;
}

message TransactionOutput{
  uint64 value = 1;
  ScriptPublicKey scriptPublicKey = 2;
}

message BlockMessage{
  BlockHeader header = 1;
  repeated TransactionMessage transactions = 2;
}

message BlockHeader{
  uint32 version = 1;
  repeated BlockLevelParents parents = 12;
  Hash hashMerkleRoot = 3;
  Hash acceptedIdMerkleRoot = 4;
  Hash utxoCommitment = 5;
  int64 timestamp = 6;
  uint32 bits = 7;
  uint64 nonce = 8;
  uint64 daaScore = 9;
  bytes blueWork = 10;
  Hash pruningPoint = 14;
  uint64 blueScore = 13;
}

message BlockLevelParents {
  repeated Hash parentHashes = 1;
}

message Hash{
  bytes bytes = 1;
}

message RequestBlockLocatorMessage{
  Hash highHash = 1;
  uint32 limit = 2;
}

message BlockLocatorMessage{
  repeated Hash hashes = 1;
}

message RequestHeadersMessage{
  Hash lowHash = 1;
  Hash highHash = 2;
}

message RequestNextHeadersMessage{
}

message DoneHeadersMessage{
}

message RequestRelayBlocksMessage{
  repeated Hash hashes = 1;
}

message RequestTransactionsMessage {
  repeated TransactionId ids = 1;
}

message TransactionNotFoundMessage{
  TransactionId id = 1;
}

message InvRelayBlockMessage{
  Hash hash = 1;
}

message InvTransactionsMessage{
  repeated TransactionId ids = 1;
}

message PingMessage{
  uint64 nonce = 1;
}

message PongMessage{
  uint64 nonce = 1;
}

message VerackMessage{
}

message VersionMessage{
  uint32 protocolVersion = 1;
  uint64 services = 2;
  int64 timestamp = 3;
  NetAddress address = 4;
  bytes id = 5;
  string userAgent = 6;
  bool disableRelayTx = 8;
  SubnetworkId subnetworkId = 9;
  string network = 10;
}

message RejectMessage{
  string reason = 1;
}

message RequestPruningPointUTXOSetMessage{
  Hash pruningPointHash = 1;
}

message PruningPointUtxoSetChunkMessage{
  repeated OutpointAndUtxoEntryPair outpointAndUtxoEntryPairs = 1;
}

message OutpointAndUtxoEntryPair{
  Outpoint outpoint = 1;
  UtxoEntry utxoEntry = 2;
}

message UtxoEntry {
  uint64 amount = 1;
  ScriptPublicKey scriptPublicKey = 2;
  uint64 blockDaaScore = 3;
  bool isCoinbase = 4;
}

message RequestNextPruningPointUtxoSetChunkMessage {
}

message DonePruningPointUtxoSetChunksMessage {
}

message RequestIBDBlocksMessage{
  repeated Hash hashes = 1;
}

message UnexpectedPruningPointMessage{
}

message IbdBlockLocatorMessage {
  Hash targetHash = 1;
  repeated Hash blockLocatorHashes = 2;
}

message RequestIBDChainBlockLocatorMessage{
  Hash lowHash = 1;
  Hash highHash = 2;
}

message IbdChainBlockLocatorMessage {
  repeated Hash blockLocatorHashes = 1;
}

// Legacy name of this message is `RequestAnticoneMessage`
message RequestAntipastMessage{
  Hash blockHash = 1;
  Hash contextHash = 2;
}

message IbdBlockLocatorHighestHashMessage {
  Hash highestHash = 1;
}

message IbdBlockLocatorHighestHashNotFoundMessage {
}

message BlockHeadersMessage {
  repeated BlockHeader blockHeaders = 1;
}

message RequestPruningPointAndItsAnticoneMessage {
}

message RequestNextPruningPointAndItsAnticoneBlocksMessage{
}

// TODO: remove once v4 is obsolete
message BlockWithTrustedDataMessage {
  BlockMessage block = 1;
  uint64 daaScore = 2;
  repeated DaaBlock daaWindow = 3;
  repeated BlockGhostdagDataHashPair ghostdagData = 4;
}

// TODO: rename to `TrustedBlock` once v5 is obsolete
message DaaBlock {
  BlockMessage block = 3;
  GhostdagData ghostdagData = 2;
}

// TODO: rename to `TrustedHeader` once v5 is obsolete
message DaaBlockV4 {
  BlockHeader header = 1;
  GhostdagData ghostdagData = 2;
}

// TODO: remove once v5 is obsolete
message BlockGhostdagDataHashPair {
  Hash hash = 1;
  GhostdagData ghostdagData = 2;
}

message GhostdagData {
  uint64 blueScore = 1;
  bytes blueWork = 2;
  Hash selectedParent = 3;
  repeated Hash mergeSetBlues = 4;
  repeated Hash mergeSetReds = 5;
  repeated BluesAnticoneSizes bluesAnticoneSizes = 6;
}

message BluesAnticoneSizes {
  Hash blueHash = 1;
  uint32 anticoneSize = 2;
}

message DoneBlocksWithTrustedDataMessage {
}

message PruningPointsMessage {
  repeated BlockHeader headers = 1;
}

message RequestPruningPointProofMessage {
}

message PruningPointProofMessage {
  repeated PruningPointProofHeaderArray headers = 1;
}

message PruningPointProofHeaderArray {
  repeated BlockHeader headers = 1;
}

message ReadyMessage {
}

message BlockWithTrustedDataV4Message {
  BlockMessage block = 1;
  repeated uint64 daaWindowIndices = 2; // TODO: remove once v5 is obsolete
  repeated uint64 ghostdagDataIndices = 3; // TODO: remove once v5 is obsolete
}

message TrustedDataMessage {
  repeated DaaBlockV4 daaWindow = 1; // TODO: rename to `trustedSubDag` once v5 is obsolete
  repeated BlockGhostdagDataHashPair ghostdagData = 2; // TODO: remove once v5 is obsolete
}
