@@ -84,6 +84,18 @@ pub struct ValidatorKeys(pub Vec<[u8; SECRET_KEY_LENGTH]>);
8484/// Decoded block
8585pub type DecodedBlock = ( DecodedBlockHeader , DecodedBlockData , Signatures ) ;
8686
87+ /// Block header
88+ pub struct BlockHeader (
89+ pub ChainId ,
90+ pub Height ,
91+ pub BlockTimeStamp ,
92+ pub PreviousBlockHash ,
93+ pub LedgerType ,
94+ pub PurposeId ,
95+ pub Validator ,
96+ pub Option < Metadata > ,
97+ ) ;
98+
8799/// Decoded block header
88100pub type DecodedBlockHeader = (
89101 ChainId ,
@@ -131,23 +143,29 @@ pub enum HashFunction {
131143///
132144/// Returns an error if block encoding fails
133145pub fn encode_block (
134- block_hdr : EncodedBlockHeader , block_data : & EncodedBlockData , validator_keys : & ValidatorKeys ,
146+ block_hdr : BlockHeader , block_data : & EncodedBlockData , validator_keys : & ValidatorKeys ,
135147 hasher : & HashFunction ,
136148) -> anyhow:: Result < EncodedBlock > {
137- // Ensure block header is cbor encoded
138- let binding = block_hdr. 0 . clone ( ) ;
139- let mut block_hdr_cbor_encoding_check = minicbor:: Decoder :: new ( & binding) ;
140- let _ = block_hdr_cbor_encoding_check. bytes ( ) ?;
141-
142149 // Enforce block data to be cbor encoded in the form of CBOR byte strings
143150 // which are just (ordered) series of bytes without further interpretation
144151 let binding = block_data. 0 . clone ( ) ;
145152 let mut block_data_cbor_encoding_check = minicbor:: Decoder :: new ( & binding) ;
146153 let _ = block_data_cbor_encoding_check. bytes ( ) ?;
147154
155+ let encoded_block_hdr = encode_block_header (
156+ block_hdr. 0 ,
157+ block_hdr. 1 ,
158+ block_hdr. 2 ,
159+ & block_hdr. 3 ,
160+ & block_hdr. 4 ,
161+ & block_hdr. 5 ,
162+ & block_hdr. 6 ,
163+ block_hdr. 7 ,
164+ ) ?;
165+
148166 let hashed_block_header = match hasher {
149- HashFunction :: Blake3 => blake3 ( & block_hdr . 0 ) ?. to_vec ( ) ,
150- HashFunction :: Blake2b => blake2b_512 ( & block_hdr . 0 ) ?. to_vec ( ) ,
167+ HashFunction :: Blake3 => blake3 ( & encoded_block_hdr ) ?. to_vec ( ) ,
168+ HashFunction :: Blake2b => blake2b_512 ( & encoded_block_hdr ) ?. to_vec ( ) ,
151169 } ;
152170
153171 // validator_signature MUST be a signature of the hashed block_header bytes
@@ -178,7 +196,7 @@ pub fn encode_block(
178196
179197 let block_data_with_sigs = encoder. writer ( ) . clone ( ) ;
180198 // block hdr + block data + sigs
181- let encoded_block = [ block_hdr . 0 , block_data_with_sigs] . concat ( ) ;
199+ let encoded_block = [ encoded_block_hdr , block_data_with_sigs] . concat ( ) ;
182200
183201 Ok ( encoded_block)
184202}
@@ -512,8 +530,8 @@ mod tests {
512530 use super :: { decode_genesis_block, encode_genesis} ;
513531 use crate :: serialize:: {
514532 blake2b_512, decode_block, decode_block_header, encode_block, encode_block_header,
515- BlockTimeStamp , ChainId , EncodedBlockData , EncodedBlockHeader , HashFunction :: Blake2b ,
516- Height , Kid , LedgerType , Metadata , PreviousBlockHash , PurposeId , Validator , ValidatorKeys ,
533+ BlockHeader , BlockTimeStamp , ChainId , EncodedBlockData , HashFunction :: Blake2b , Height , Kid ,
534+ LedgerType , Metadata , PreviousBlockHash , PurposeId , Validator , ValidatorKeys ,
517535 } ;
518536 #[ test]
519537 fn block_header_encode_decode ( ) {
@@ -582,9 +600,9 @@ mod tests {
582600 let metadata = Some ( Metadata ( vec ! [ 1 ; 128 ] ) ) ;
583601
584602 let encoded_block_hdr = encode_block_header (
585- chain_id,
586- block_height,
587- block_ts,
603+ chain_id. clone ( ) ,
604+ block_height. clone ( ) ,
605+ block_ts. clone ( ) ,
588606 & prev_block_height. clone ( ) ,
589607 & ledger_type. clone ( ) ,
590608 & purpose_id. clone ( ) ,
@@ -593,6 +611,17 @@ mod tests {
593611 )
594612 . unwrap ( ) ;
595613
614+ let block_hdr = BlockHeader (
615+ chain_id,
616+ block_height,
617+ block_ts,
618+ prev_block_height. clone ( ) ,
619+ ledger_type. clone ( ) ,
620+ purpose_id. clone ( ) ,
621+ validators. clone ( ) ,
622+ metadata. clone ( ) ,
623+ ) ;
624+
596625 // validators
597626 let validator_secret_key_bytes: [ u8 ; SECRET_KEY_LENGTH ] = [
598627 157 , 097 , 177 , 157 , 239 , 253 , 090 , 096 , 186 , 132 , 074 , 244 , 146 , 236 , 044 , 196 , 068 ,
@@ -614,7 +643,7 @@ mod tests {
614643 let encoded_block_data = block_data. writer ( ) . clone ( ) ;
615644
616645 let encoded_block = encode_block (
617- EncodedBlockHeader ( encoded_block_hdr . clone ( ) ) ,
646+ block_hdr ,
618647 & EncodedBlockData ( encoded_block_data. clone ( ) ) ,
619648 & ValidatorKeys ( vec ! [ validator_secret_key_bytes, validator_secret_key_bytes] ) ,
620649 & Blake2b ,
0 commit comments