Skip to content

Commit 36f48f0

Browse files
[consensus] primitive types encoded as varints (#842)
Co-authored-by: Patrick O'Grady <me@patrickogrady.xyz>
1 parent bfa4f8f commit 36f48f0

11 files changed

Lines changed: 296 additions & 202 deletions

File tree

consensus/src/ordered_broadcast/types.rs

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
//! Types used in [`ordered_broadcast`](crate::ordered_broadcast).
22
33
use bytes::{Buf, BufMut};
4-
use commonware_codec::{Encode, EncodeSize, Error as CodecError, FixedSize, Read, ReadExt, Write};
4+
use commonware_codec::{
5+
varint::UInt, Encode, EncodeSize, Error as CodecError, Read, ReadExt, Write,
6+
};
57
use commonware_cryptography::{
68
bls12381::primitives::{
79
group::{Public, Share, Signature},
@@ -215,15 +217,15 @@ impl<P: Array, D: Digest> Chunk<P, D> {
215217
impl<P: Array, D: Digest> Write for Chunk<P, D> {
216218
fn write(&self, writer: &mut impl BufMut) {
217219
self.sequencer.write(writer);
218-
self.height.write(writer);
220+
UInt(self.height).write(writer);
219221
self.payload.write(writer);
220222
}
221223
}
222224

223225
impl<P: Array, D: Digest> Read for Chunk<P, D> {
224226
fn read_cfg(reader: &mut impl Buf, _: &()) -> Result<Self, CodecError> {
225227
let sequencer = P::read(reader)?;
226-
let height = u64::read(reader)?;
228+
let height = UInt::read(reader)?.into();
227229
let payload = D::read(reader)?;
228230
Ok(Self {
229231
sequencer,
@@ -233,8 +235,10 @@ impl<P: Array, D: Digest> Read for Chunk<P, D> {
233235
}
234236
}
235237

236-
impl<P: Array, D: Digest> FixedSize for Chunk<P, D> {
237-
const SIZE: usize = P::SIZE + u64::SIZE + D::SIZE;
238+
impl<P: Array, D: Digest> EncodeSize for Chunk<P, D> {
239+
fn encode_size(&self) -> usize {
240+
self.sequencer.encode_size() + UInt(self.height).encode_size() + self.payload.encode_size()
241+
}
238242
}
239243

240244
/// Parent is a message that contains information about the parent (previous height) of a Chunk.
@@ -272,15 +276,15 @@ impl<D: Digest> Parent<D> {
272276
impl<D: Digest> Write for Parent<D> {
273277
fn write(&self, writer: &mut impl BufMut) {
274278
self.digest.write(writer);
275-
self.epoch.write(writer);
279+
UInt(self.epoch).write(writer);
276280
self.signature.write(writer);
277281
}
278282
}
279283

280284
impl<D: Digest> Read for Parent<D> {
281285
fn read_cfg(reader: &mut impl Buf, _: &()) -> Result<Self, CodecError> {
282286
let digest = D::read(reader)?;
283-
let epoch = Epoch::read(reader)?;
287+
let epoch = UInt::read(reader)?.into();
284288
let signature = Signature::read(reader)?;
285289
Ok(Self {
286290
digest,
@@ -290,8 +294,10 @@ impl<D: Digest> Read for Parent<D> {
290294
}
291295
}
292296

293-
impl<D: Digest> FixedSize for Parent<D> {
294-
const SIZE: usize = D::SIZE + Epoch::SIZE + Signature::SIZE;
297+
impl<D: Digest> EncodeSize for Parent<D> {
298+
fn encode_size(&self) -> usize {
299+
self.digest.encode_size() + UInt(self.epoch).encode_size() + self.signature.encode_size()
300+
}
295301
}
296302

297303
/// Node is a message from a sequencer that contains a Chunk and a proof that the parent was correctly broadcasted.
@@ -453,7 +459,7 @@ impl<C: Verifier, D: Digest> Read for Node<C, D> {
453459

454460
impl<C: Verifier, D: Digest> EncodeSize for Node<C, D> {
455461
fn encode_size(&self) -> usize {
456-
Chunk::<C::PublicKey, D>::SIZE + C::Signature::SIZE + self.parent.encode_size()
462+
self.chunk.encode_size() + self.signature.encode_size() + self.parent.encode_size()
457463
}
458464
}
459465

@@ -515,7 +521,8 @@ impl<P: Array, D: Digest> Ack<P, D> {
515521
/// It contains both the chunk and the epoch to ensure domain separation and prevent
516522
/// signature reuse across epochs.
517523
fn payload(chunk: &Chunk<P, D>, epoch: &Epoch) -> Vec<u8> {
518-
let mut message = Vec::with_capacity(Chunk::<P, D>::SIZE + Epoch::SIZE);
524+
let epoch = UInt(*epoch);
525+
let mut message = Vec::with_capacity(chunk.encode_size() + epoch.encode_size());
519526
chunk.write(&mut message);
520527
epoch.write(&mut message);
521528
message
@@ -560,15 +567,15 @@ impl<P: Array, D: Digest> Ack<P, D> {
560567
impl<P: Array, D: Digest> Write for Ack<P, D> {
561568
fn write(&self, writer: &mut impl BufMut) {
562569
self.chunk.write(writer);
563-
self.epoch.write(writer);
570+
UInt(self.epoch).write(writer);
564571
self.signature.write(writer);
565572
}
566573
}
567574

568575
impl<P: Array, D: Digest> Read for Ack<P, D> {
569576
fn read_cfg(reader: &mut impl Buf, _: &()) -> Result<Self, CodecError> {
570577
let chunk = Chunk::read(reader)?;
571-
let epoch = Epoch::read(reader)?;
578+
let epoch = UInt::read(reader)?.into();
572579
let signature = PartialSignature::read(reader)?;
573580
Ok(Self {
574581
chunk,
@@ -578,8 +585,10 @@ impl<P: Array, D: Digest> Read for Ack<P, D> {
578585
}
579586
}
580587

581-
impl<P: Array, D: Digest> FixedSize for Ack<P, D> {
582-
const SIZE: usize = Chunk::<P, D>::SIZE + Epoch::SIZE + PartialSignature::SIZE;
588+
impl<P: Array, D: Digest> EncodeSize for Ack<P, D> {
589+
fn encode_size(&self) -> usize {
590+
self.chunk.encode_size() + UInt(self.epoch).encode_size() + self.signature.encode_size()
591+
}
583592
}
584593

585594
/// Activity is the type associated with the [`Reporter`](crate::Reporter) trait.
@@ -691,8 +700,10 @@ impl<C: Verifier, D: Digest> Read for Proposal<C, D> {
691700
}
692701
}
693702

694-
impl<C: Verifier, D: Digest> FixedSize for Proposal<C, D> {
695-
const SIZE: usize = Chunk::<C::PublicKey, D>::SIZE + C::Signature::SIZE;
703+
impl<C: Verifier, D: Digest> EncodeSize for Proposal<C, D> {
704+
fn encode_size(&self) -> usize {
705+
self.chunk.encode_size() + self.signature.encode_size()
706+
}
696707
}
697708

698709
impl<C: Verifier, D: Digest> Hash for Proposal<C, D> {
@@ -768,15 +779,15 @@ impl<P: Array, D: Digest> Lock<P, D> {
768779
impl<P: Array, D: Digest> Write for Lock<P, D> {
769780
fn write(&self, writer: &mut impl BufMut) {
770781
self.chunk.write(writer);
771-
self.epoch.write(writer);
782+
UInt(self.epoch).write(writer);
772783
self.signature.write(writer);
773784
}
774785
}
775786

776787
impl<P: Array, D: Digest> Read for Lock<P, D> {
777788
fn read_cfg(reader: &mut impl Buf, _: &()) -> Result<Self, CodecError> {
778789
let chunk = Chunk::read(reader)?;
779-
let epoch = Epoch::read(reader)?;
790+
let epoch = UInt::read(reader)?.into();
780791
let signature = Signature::read(reader)?;
781792
Ok(Self {
782793
chunk,
@@ -786,8 +797,10 @@ impl<P: Array, D: Digest> Read for Lock<P, D> {
786797
}
787798
}
788799

789-
impl<P: Array, D: Digest> FixedSize for Lock<P, D> {
790-
const SIZE: usize = Chunk::<P, D>::SIZE + Epoch::SIZE + Signature::SIZE;
800+
impl<P: Array, D: Digest> EncodeSize for Lock<P, D> {
801+
fn encode_size(&self) -> usize {
802+
self.chunk.encode_size() + UInt(self.epoch).encode_size() + self.signature.encode_size()
803+
}
791804
}
792805

793806
#[cfg(test)]

0 commit comments

Comments
 (0)