diff --git a/website/design.html b/website/design.html index 5c938b7..b608721 100644 --- a/website/design.html +++ b/website/design.html @@ -1034,13 +1034,24 @@ FAILURE: C → B → A: AnchorProbeResult { reachable: false }Engagement propagation
Reactions, comments, and policy changes propagate via BlobHeaderDiff (0xD0) through the CDN tree:
PostDownstreamRegister (0xD3) to the sender, ensuring bidirectional diff flow.BlobHeaderRequest (0xD1) with the local header timestamp. Peers respond with the full header only if theirs is newer. Additive merge — store_reaction upserts, store_comment inserts with ON CONFLICT DO NOTHING.deleted_at timestamp is set on the record. Tombstones propagate via pull sync headers — when a peer receives a header with a tombstoned entry, it applies the deletion locally. This prevents deleted engagement from being re-introduced by peers that haven't yet received the deletion.BlobHeaderRequest (0xD1) with local header timestamp. Peers respond with full header only if newer. Additive merge — store_reaction upserts, store_comment inserts with ON CONFLICT DO NOTHING. Writes batched per chunk (single lock acquisition).deleted_at timestamp is set on the record. Tombstones propagate via pull sync headers. Prevents deleted engagement from being re-introduced by peers that haven't yet received the deletion.Engagement operations are cryptographically verified on receipt to prevent forgery and unauthorized modification:
+BLAKE3(reactor || post_id || emoji || timestamp_ms). Verified before storing. Unsigned reactions from older nodes accepted for backward compatibility (#[serde(default)] on signature field).verify_comment_signature() now called on receipt via BlobHeaderDiff. Forged comments rejected.reactor and payload.author.reactions and comments tables are authoritative. The blob_headers JSON is a derived snapshot rebuilt after each engagement operation. When they diverge (e.g., after a BlobHeaderResponse with a newer snapshot), the next engagement op rebuilds from tables.Each node advertises its device role in InitialExchange, which determines its bandwidth budgets for replication (pulling posts to cache) and delivery (serving requests from peers):