message BlockHeader {
    uint32 version    = 1;
    uint32 height     = 2;
    bytes parent      = 3;
    int64 timestamp   = 4;
    bytes tx_root     = 5;
    bytes producer_ID = 6;
    bytes signature   = 7;
}
message Block {
    BlockHeader header                = 1;
    repeated Transaction transactions = 2;
}
message BlockTxs {
    repeated Transaction transactions = 1;
    repeated bytes wids               = 2;
}
message XThinnerBlock {
    BlockHeader header                          = 1;
    uint32 tx_count                             = 2;
    bytes pops                                  = 3;
    bytes pushes                                = 4;
    bytes push_bytes                            = 5;
    repeated PrefilledTransaction prefilled_txs = 6;
    message PrefilledTransaction {
        Transaction transaction = 1;
        uint32 index            = 2;
    }
}
message CompressedBlock {
    uint32 height             = 1;
    repeated CompressedTx txs = 2;
    
    message CompressedTx {
        bytes txid                = 1;
        repeated bytes nullifiers = 2;
        repeated Output outputs   = 3;
    }
}