11//! Types used in [`ordered_broadcast`](crate::ordered_broadcast).
22
33use 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+ } ;
57use commonware_cryptography:: {
68 bls12381:: primitives:: {
79 group:: { Public , Share , Signature } ,
@@ -215,15 +217,15 @@ impl<P: Array, D: Digest> Chunk<P, D> {
215217impl < 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
223225impl < 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> {
272276impl < 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
280284impl < 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
454460impl < 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> {
560567impl < 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
568575impl < 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
698709impl < C : Verifier , D : Digest > Hash for Proposal < C , D > {
@@ -768,15 +779,15 @@ impl<P: Array, D: Digest> Lock<P, D> {
768779impl < 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
776787impl < 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