@@ -23,6 +23,7 @@ use crate::consensus::{Decodable, Encodable, encode};
2323use crate :: hash_types:: { QuorumHash , QuorumVVecHash } ;
2424use crate :: prelude:: * ;
2525use crate :: { VarInt , io} ;
26+ use crate :: consensus:: encode:: { compact_size_len, fixed_bitset_len, read_compact_size, read_fixed_bitset, write_compact_size, write_fixed_bitset} ;
2627
2728/// A Quorum Finalization Commitment. It is described in the finalization section of DIP6:
2829/// [dip-0006.md#6-finalization-phase](https://github.com/dashpay/dips/blob/master/dip-0006.md#6-finalization-phase)
@@ -35,8 +36,8 @@ pub struct QuorumFinalizationCommitment {
3536 pub llmq_type : u8 ,
3637 pub quorum_hash : QuorumHash ,
3738 pub quorum_index : Option < i16 > ,
38- pub signers : Vec < u8 > ,
39- pub valid_members : Vec < u8 > ,
39+ pub signers : Vec < bool > ,
40+ pub valid_members : Vec < bool > ,
4041 pub quorum_public_key : BLSPublicKey ,
4142 pub quorum_vvec_hash : QuorumVVecHash ,
4243 pub quorum_sig : BLSSignature ,
@@ -47,8 +48,10 @@ impl QuorumFinalizationCommitment {
4748 /// The size of the payload in bytes.
4849 pub fn size ( & self ) -> usize {
4950 let mut size = 2 + 1 + 32 + 48 + 32 + 96 + 96 ;
50- size += VarInt ( self . signers . len ( ) as u64 ) . len ( ) + self . signers . len ( ) ;
51- size += VarInt ( self . valid_members . len ( ) as u64 ) . len ( ) + self . valid_members . len ( ) ;
51+ size += compact_size_len ( self . signers . len ( ) as u32 ) ;
52+ size += fixed_bitset_len ( self . signers . as_slice ( ) , self . signers . len ( ) ) ;
53+ size += compact_size_len ( self . valid_members . len ( ) as u32 ) ;
54+ size += fixed_bitset_len ( self . valid_members . as_slice ( ) , self . valid_members . len ( ) ) ;
5255 if self . version == 2 || self . version == 4 {
5356 size += 2 ;
5457 }
@@ -67,8 +70,10 @@ impl Encodable for QuorumFinalizationCommitment {
6770 len += q_index. consensus_encode ( w) ?;
6871 }
6972 }
70- len += self . signers . consensus_encode ( w) ?;
71- len += self . valid_members . consensus_encode ( w) ?;
73+ len += write_compact_size ( w, self . signers . len ( ) as u32 ) ?;
74+ len += write_fixed_bitset ( w, self . signers . as_slice ( ) , self . signers . iter ( ) . len ( ) ) ?;
75+ len += write_compact_size ( w, self . valid_members . len ( ) as u32 ) ?;
76+ len += write_fixed_bitset ( w, self . valid_members . as_slice ( ) , self . valid_members . iter ( ) . len ( ) ) ?;
7277 len += self . quorum_public_key . consensus_encode ( w) ?;
7378 len += self . quorum_vvec_hash . consensus_encode ( w) ?;
7479 len += self . quorum_sig . consensus_encode ( w) ?;
@@ -96,8 +101,8 @@ impl Decodable for QuorumFinalizationCommitment {
96101 llmq_type,
97102 quorum_hash,
98103 quorum_index,
99- signers : signers . iter ( ) . map ( | & b| b as u8 ) . collect ( ) ,
100- valid_members : valid_members . iter ( ) . map ( | & b| b as u8 ) . collect ( ) ,
104+ signers,
105+ valid_members,
101106 quorum_public_key,
102107 quorum_vvec_hash,
103108 quorum_sig,
@@ -144,86 +149,60 @@ impl Decodable for QuorumCommitmentPayload {
144149 }
145150}
146151
147- fn read_compact_size < R : Read + ?Sized > ( r : & mut R ) -> io:: Result < u64 > {
148- let mut marker = [ 0u8 ; 1 ] ;
149- r. read_exact ( & mut marker) ?;
150- match marker[ 0 ] {
151- 0xFD => {
152- // Read the next 2 bytes as a little-endian u16
153- let mut buf = [ 0u8 ; 2 ] ;
154- r. read_exact ( & mut buf) ?;
155- Ok ( u16:: from_le_bytes ( buf) as u64 )
156- }
157- 0xFE => {
158- // Read the next 4 bytes as a little-endian u32
159- let mut buf = [ 0u8 ; 4 ] ;
160- r. read_exact ( & mut buf) ?;
161- Ok ( u32:: from_le_bytes ( buf) as u64 )
162- }
163- 0xFF => {
164- // Read the next 8 bytes as a little-endian u64
165- let mut buf = [ 0u8 ; 8 ] ;
166- r. read_exact ( & mut buf) ?;
167- Ok ( u64:: from_le_bytes ( buf) )
168- }
169- value => {
170- // For values less than 253, the value is stored directly in the marker byte
171- Ok ( value as u64 )
172- }
173- }
174- }
175-
176- fn read_fixed_bitset < R : Read + ?Sized > ( r : & mut R , size : usize ) -> std:: io:: Result < Vec < bool > > {
177- // Calculate the number of bytes needed
178- let num_bytes = ( size + 7 ) / 8 ;
179- let mut bytes = vec ! [ 0u8 ; num_bytes] ;
180-
181- // Read bytes from the reader
182- r. read_exact ( & mut bytes) ?;
183-
184- // Unpack bits into a vector of bools
185- let mut bits = Vec :: with_capacity ( size) ;
186- for p in 0 ..size {
187- let byte = bytes[ p / 8 ] ;
188- let bit = ( byte >> ( p % 8 ) ) & 1 ;
189- bits. push ( bit != 0 ) ;
190- }
191-
192- Ok ( bits)
193- }
194-
195152#[ cfg( test) ]
196153mod tests {
197154 use hashes:: Hash ;
198155
199156 use crate :: bls_sig_utils:: { BLSPublicKey , BLSSignature } ;
200157 use crate :: consensus:: Encodable ;
201158 use crate :: hash_types:: { QuorumHash , QuorumVVecHash } ;
202- use crate :: transaction:: special_transaction:: quorum_commitment:: {
203- QuorumCommitmentPayload , QuorumFinalizationCommitment ,
204- } ;
159+ use crate :: transaction:: special_transaction:: quorum_commitment:: { QuorumCommitmentPayload , QuorumFinalizationCommitment } ;
205160
206161 #[ test]
207162 fn size ( ) {
208- let want = 325 ;
209- let payload = QuorumCommitmentPayload {
210- version : 0 ,
211- height : 0 ,
212- finalization_commitment : QuorumFinalizationCommitment {
163+ {
164+ let want = 317 ;
165+ let payload = QuorumCommitmentPayload {
166+ version : 0 ,
167+ height : 0 ,
168+ finalization_commitment : QuorumFinalizationCommitment {
169+ version : 1 ,
170+ llmq_type : 0 ,
171+ quorum_hash : QuorumHash :: all_zeros ( ) ,
172+ quorum_index : None ,
173+ signers : vec ! [ true , false , true , true , false ] ,
174+ valid_members : vec ! [ false , true , false , true ] ,
175+ quorum_public_key : BLSPublicKey :: from ( [ 0 ; 48 ] ) ,
176+ quorum_vvec_hash : QuorumVVecHash :: all_zeros ( ) ,
177+ quorum_sig : BLSSignature :: from ( [ 0 ; 96 ] ) ,
178+ sig : BLSSignature :: from ( [ 0 ; 96 ] ) ,
179+ } ,
180+ } ;
181+ let actual = payload. consensus_encode ( & mut Vec :: new ( ) ) . unwrap ( ) ;
182+ assert_eq ! ( payload. size( ) , want) ;
183+ assert_eq ! ( actual, want) ;
184+ }
185+ {
186+ let want = 319 ;
187+ let payload = QuorumCommitmentPayload {
213188 version : 0 ,
214- llmq_type : 0 ,
215- quorum_hash : QuorumHash :: all_zeros ( ) ,
216- quorum_index : None ,
217- signers : vec ! [ 1 , 2 , 3 , 4 , 5 ] ,
218- valid_members : vec ! [ 6 , 7 , 8 , 9 , 0 ] ,
219- quorum_public_key : BLSPublicKey :: from ( [ 0 ; 48 ] ) ,
220- quorum_vvec_hash : QuorumVVecHash :: all_zeros ( ) ,
221- quorum_sig : BLSSignature :: from ( [ 0 ; 96 ] ) ,
222- sig : BLSSignature :: from ( [ 0 ; 96 ] ) ,
223- } ,
224- } ;
225- let actual = payload. consensus_encode ( & mut Vec :: new ( ) ) . unwrap ( ) ;
226- assert_eq ! ( payload. size( ) , want) ;
227- assert_eq ! ( actual, want) ;
189+ height : 0 ,
190+ finalization_commitment : QuorumFinalizationCommitment {
191+ version : 2 ,
192+ llmq_type : 0 ,
193+ quorum_hash : QuorumHash :: all_zeros ( ) ,
194+ quorum_index : Some ( 1 ) ,
195+ signers : vec ! [ true , false , true , true , false , true , false ] ,
196+ valid_members : vec ! [ false , true , false , true , false , true ] ,
197+ quorum_public_key : BLSPublicKey :: from ( [ 0 ; 48 ] ) ,
198+ quorum_vvec_hash : QuorumVVecHash :: all_zeros ( ) ,
199+ quorum_sig : BLSSignature :: from ( [ 0 ; 96 ] ) ,
200+ sig : BLSSignature :: from ( [ 0 ; 96 ] ) ,
201+ } ,
202+ } ;
203+ let actual = payload. consensus_encode ( & mut Vec :: new ( ) ) . unwrap ( ) ;
204+ assert_eq ! ( payload. size( ) , want) ;
205+ assert_eq ! ( actual, want) ;
206+ }
228207 }
229208}
0 commit comments