syntax = "proto3";

package proto3;


message PartSetHeader {
  int32 Total = 1;
  bytes Hash = 2;
}

message BlockID {
  bytes Hash = 1;
  PartSetHeader PartsHeader = 2;
}

message Header {
  // basic block info
  Version Version = 1;
  string ChainID = 2;
  int64 Height = 3;
  Timestamp Time = 4;
  int64 NumTxs = 5;
  int64 TotalTxs = 6;

  // prev block info
  BlockID LastBlockID = 7;

  // hashes of block data
  bytes LastCommitHash = 8; // commit from validators from the last block
  bytes DataHash = 9; // transactions

  // hashes from the app output from the prev block
  bytes ValidatorsHash = 10; // validators for the current block
  bytes NextValidatorsHash = 11; // validators for the next block
  bytes ConsensusHash = 12; // consensus params for current block
  bytes AppHash = 13; // state after txs from the previous block
  bytes LastResultsHash = 14; // root hash of all results from the txs from the previous block

  // consensus info
  bytes EvidenceHash = 15; // evidence included in the block
  bytes ProposerAddress = 16; // original proposer of the block
}

message Version {
  uint64 Block = 1;
  uint64 App = 2;
}

// Timestamp wraps how amino encodes time.
// This is the protobuf well-known type protobuf/timestamp.proto
// See:
// https://github.com/google/protobuf/blob/d2980062c859649523d5fd51d6b55ab310e47482/src/google/protobuf/timestamp.proto#L123-L135
// NOTE/XXX: nanos do not get skipped if they are zero in amino.
message Timestamp {
  int64 seconds = 1;
  int32 nanos = 2;
}
