/* * chat_proto.h — протокол распространения сообщений чата (gossip + catch-up) * * Все пакеты идут через MsgClient::sendTo() / received() поверх msg_transport. * Подписи — внутри пейлоада. utun — чистый транспорт. */ #ifndef CHAT_PROPAGATE_PROTO_H #define CHAT_PROPAGATE_PROTO_H #include namespace ChatProp { static constexpr uint8_t kNewMsg = 0x01; /* новое сообщение */ static constexpr uint8_t kNewAck = 0x02; /* подтверждение получения */ static constexpr uint8_t kBucketsReq = 0x03; /* запрос bucket-ов канала */ static constexpr uint8_t kBucketsRsp = 0x04; /* bucket-ы: день+час → count+hash */ static constexpr uint8_t kHashesReq = 0x05; /* запрос подписей в bucket */ static constexpr uint8_t kHashesRsp = 0x06; /* список подписей (64 байта каждая) */ static constexpr uint8_t kMsgsReq = 0x07; /* запрос сообщений по подписям */ static constexpr uint8_t kMsgsRsp = 0x08; /* сообщения + подписи */ static constexpr size_t kSignSize = 64; static constexpr size_t kHashSize = 32; /* SHA-256 */ static constexpr int kDefaultFanout = 4; static constexpr int kDefaultAckTimeoutMs = 1000; /* Форматы пакетов (byte stream) ================================================ NEW_MSG: [0x01][channel_id_len:1][channel_id][timestamp:8][content_len:2][content][sig:64] NEW_ACK: [0x02][sig_of_confirmed_msg:64] BUCKETS_REQ: [0x03][channel_id_len:1][channel_id] BUCKETS_RSP: [0x04][channel_id_len:1][channel_id][bucket_count:2][buckets...] bucket = [day_unix:4][hour:1][msg_count:4][sig_hash:32] HASHES_REQ: [0x05][channel_id_len:1][channel_id][day_unix:4][hour:1] HASHES_RSP: [0x06][sig_count:2][sig:64, sig:64, ...] MSGS_REQ: [0x07][sig_count:2][sig:64, sig:64, ...] MSGS_RSP: [0x08][channel_id_len:1][channel_id][msg_count:2][(sig:64, author:8, timestamp:8, content_len:2, content)...] =============================================================================== */ } // namespace ChatProp #endif