Skip to content

Commit 4c6fee9

Browse files
committed
refactor(encode block): simpler api
1 parent 4290604 commit 4c6fee9

File tree

2 files changed

+62
-35
lines changed

2 files changed

+62
-35
lines changed

rust/immutable-ledger/src/serialize.rs

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,18 @@ pub struct ValidatorKeys(pub Vec<[u8; SECRET_KEY_LENGTH]>);
8484
/// Decoded block
8585
pub 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
88100
pub type DecodedBlockHeader = (
89101
ChainId,
@@ -131,23 +143,29 @@ pub enum HashFunction {
131143
///
132144
/// Returns an error if block encoding fails
133145
pub 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,

rust/immutable-ledger/src/validate.rs

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,9 @@ mod tests {
141141

142142
use super::{block_validation, genesis_validation};
143143
use crate::serialize::{
144-
blake2b_512, encode_block, encode_block_header, encode_genesis, BlockTimeStamp, ChainId,
145-
EncodedBlockData, EncodedBlockHeader, HashFunction::Blake2b, Height, Kid, LedgerType,
146-
Metadata, PreviousBlockHash, PurposeId, Validator, ValidatorKeys,
144+
blake2b_512, encode_block, encode_genesis, BlockHeader, BlockTimeStamp, ChainId,
145+
EncodedBlockData, HashFunction::Blake2b, Height, Kid, LedgerType, Metadata,
146+
PreviousBlockHash, PurposeId, Validator, ValidatorKeys,
147147
};
148148

149149
#[test]
@@ -165,23 +165,22 @@ mod tests {
165165
let chain_id = ChainId(Ulid::new());
166166
let block_height = Height(5);
167167
let block_ts = BlockTimeStamp(1_728_474_515);
168-
let prev_block_height = PreviousBlockHash(vec![0; 64]);
168+
let prev_block_hash = PreviousBlockHash(vec![0; 64]);
169169
let ledger_type = LedgerType(Uuid::new_v4());
170170
let purpose_id = PurposeId(Ulid::new());
171171
let validators = Validator(vec![Kid(kid_a), Kid(kid_b)]);
172172
let metadata = Some(Metadata(vec![1; 128]));
173173

174-
let encoded_block_hdr = encode_block_header(
174+
let block_hdr = BlockHeader(
175175
chain_id,
176176
block_height,
177177
block_ts,
178-
&prev_block_height.clone(),
179-
&ledger_type.clone(),
180-
&purpose_id.clone(),
181-
&validators.clone(),
178+
prev_block_hash.clone(),
179+
ledger_type.clone(),
180+
purpose_id.clone(),
181+
validators.clone(),
182182
metadata.clone(),
183-
)
184-
.unwrap();
183+
);
185184

186185
// validators
187186
let validator_secret_key_bytes: [u8; SECRET_KEY_LENGTH] = [
@@ -204,7 +203,7 @@ mod tests {
204203
let encoded_block_data = block_data.writer().clone();
205204

206205
let previous_block = encode_block(
207-
EncodedBlockHeader(encoded_block_hdr.clone()),
206+
block_hdr,
208207
&EncodedBlockData(encoded_block_data.clone()),
209208
&ValidatorKeys(vec![validator_secret_key_bytes, validator_secret_key_bytes]),
210209
&Blake2b,
@@ -220,22 +219,21 @@ mod tests {
220219
let validators = Validator(vec![Kid(kid_a), Kid(kid_b)]);
221220
let metadata = Some(Metadata(vec![1; 128]));
222221

223-
let encoded_block_hdr = encode_block_header(
222+
let block_hdr = BlockHeader(
224223
chain_id,
225224
block_height,
226225
block_ts,
227-
&prev_block_hash,
228-
&ledger_type.clone(),
229-
&purpose_id.clone(),
230-
&validators.clone(),
226+
prev_block_hash.clone(),
227+
ledger_type.clone(),
228+
purpose_id.clone(),
229+
validators.clone(),
231230
metadata.clone(),
232-
)
233-
.unwrap();
231+
);
234232

235233
block_data.bytes(block_data_bytes).unwrap();
236234

237235
let current_block = encode_block(
238-
EncodedBlockHeader(encoded_block_hdr.clone()),
236+
block_hdr,
239237
&EncodedBlockData(encoded_block_data.clone()),
240238
&ValidatorKeys(vec![validator_secret_key_bytes, validator_secret_key_bytes]),
241239
&Blake2b,

0 commit comments

Comments
 (0)