diff options
Diffstat (limited to 'src/transport')
| -rw-r--r-- | src/transport/mod.rs | 31 | ||||
| -rw-r--r-- | src/transport/wire.rs | 6 |
2 files changed, 31 insertions, 6 deletions
diff --git a/src/transport/mod.rs b/src/transport/mod.rs index fcdf56e..2778ed7 100644 --- a/src/transport/mod.rs +++ b/src/transport/mod.rs @@ -734,9 +734,10 @@ pub(crate) struct SyncEnvelope { /// to come (`swarm::hop`). pub(crate) sent: crate::clock::UnixMillis, /// Signatures of changes (`document::signatures`): of the changes the message - /// carries, each writer's latest among them past a few hundred; of a delta, each - /// writer's latest with changes in it (`Signatures::for_changes`, `for_delta`), - /// `signatures::MAX_PER_MESSAGE` at most, as `signatures::pack` packs them. + /// carries, each writer's latest among them past a few hundred + /// (`Signatures::for_changes`), `signatures::MAX_PER_MESSAGE` at most, as + /// `signatures::pack` packs them. A delta's are a blob of their own + /// (`DeltaSpec::signatures`). pub(crate) signatures: serde_bytes::ByteBuf, } @@ -815,6 +816,21 @@ pub(crate) struct DeltaSpec { /// Sorted. #[serde(with = "crate::transport::wire::codec::change_hashes")] pub(crate) to: Vec<ChangeHash>, + /// The signatures vouching for its changes, where any do: a blob of their own + /// (`BlobId::Content`), from the node that offered it. Each node holding `to` serves + /// the same changes, but its own signatures. + pub(crate) signatures: Option<DeltaSignatures>, +} + +/// A delta's signatures as a blob (`DeltaSpec::signatures`): each writer's latest with +/// changes in it (`Signatures::for_delta`), as `signatures::pack` packs them, +/// `signatures::MAX_PER_MESSAGE` at most. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub(crate) struct DeltaSignatures { + /// BLAKE3, as `BlobId::Content` names them. + #[serde(with = "crate::transport::wire::codec::bytes32")] + pub(crate) hash: [u8; 32], + pub(crate) size: u64, } impl DeltaSpec { @@ -823,10 +839,15 @@ impl DeltaSpec { from.dedup(); to.sort_unstable(); to.dedup(); - Self { from, to } + Self { + from, + to, + signatures: None, + } } - /// Names the spec as a blob: SHA-256 over both lists. + /// Names the spec as a blob: SHA-256 over both lists (its changes, the same from + /// every node holding them). pub(crate) fn id(&self) -> [u8; 32] { let mut hasher = Sha256::new(); hasher.update(b"continuum/delta/1"); diff --git a/src/transport/wire.rs b/src/transport/wire.rs index 7fe8983..3b67a74 100644 --- a/src/transport/wire.rs +++ b/src/transport/wire.rs @@ -14,7 +14,7 @@ use super::{EncodedMessage, MessageKind, ParsedMessage}; /// The wire format's version, the first byte of every payload. Bump it with every change /// to a message type or a codec (`golden_bytes` fails then). -pub(crate) const VERSION: u8 = 48; +pub(crate) const VERSION: u8 = 49; /// What the second byte of a payload says. fn tag(kind: MessageKind) -> u8 { @@ -480,6 +480,10 @@ pub(crate) fn samples() -> Vec<ParsedMessage> { body: SyncBody::Delta(DeltaSpec { from: Vec::new(), to: vec![ChangeHash([2; 32])], + signatures: Some(crate::transport::DeltaSignatures { + hash: [3; 32], + size: 96, + }), }), ready: true, writer: Some(7), |
