Skip to content

Commit aaf00eb

Browse files
committed
fix(ledger/block): fix (de-)seralization of compact blocks
1 parent df20464 commit aaf00eb

File tree

6 files changed

+195
-123
lines changed

6 files changed

+195
-123
lines changed

ledger/block/src/lib.rs

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,32 @@ impl<N: Network> Block<N> {
308308
})
309309
}
310310

311+
/// Helper function to compute the solution transmission IDs.
312+
pub fn compute_solution_transmission_ids(solutions: &Solutions<N>) -> Result<Vec<TransmissionID<N>>> {
313+
match solutions.as_puzzle_solutions() {
314+
Some(solutions) => {
315+
let mut transmission_ids = Vec::with_capacity(solutions.solution_ids().count());
316+
for (id, solution) in solutions.iter() {
317+
let checksum = Data::<Solution<N>>::Buffer(solution.to_bytes_le()?.into()).to_checksum::<N>()?;
318+
transmission_ids.push(TransmissionID::Solution(*id, checksum));
319+
}
320+
Ok(transmission_ids)
321+
}
322+
None => Ok(Vec::new()),
323+
}
324+
}
325+
326+
/// Helper function to compute the transaction transmission IDs.
327+
pub fn compute_transaction_transmission_ids(transactions: &[Transaction<N>]) -> Result<Vec<TransmissionID<N>>> {
328+
transactions
329+
.iter()
330+
.map(|tx| {
331+
let checksum = Data::<Transaction<N>>::Buffer(tx.to_bytes_le()?.into()).to_checksum::<N>()?;
332+
Ok(TransmissionID::Transaction(tx.id(), checksum))
333+
})
334+
.collect::<Result<Vec<_>>>()
335+
}
336+
311337
/// Borrow the Block and return a Subdag with full batch certificates.
312338
pub fn to_full_subdag(&self) -> Result<Subdag<N>> {
313339
let Block {
@@ -335,25 +361,9 @@ impl<N: Network> Block<N> {
335361
.map(|confirmed| confirmed.to_unconfirmed_transaction())
336362
.collect::<Result<Vec<_>>>()?;
337363
// Compute the transaction transmission IDs.
338-
let transaction_transmission_ids = unconfirmed_transactions
339-
.iter()
340-
.map(|tx| {
341-
let checksum = Data::<Transaction<N>>::Buffer(tx.to_bytes_le()?.into()).to_checksum::<N>()?;
342-
Ok(TransmissionID::Transaction(tx.id(), checksum))
343-
})
344-
.collect::<Result<Vec<_>>>()?;
364+
let transaction_transmission_ids = Self::compute_transaction_transmission_ids(&unconfirmed_transactions)?;
345365
// Compute the solution transmission IDs.
346-
let solution_transmission_ids = match solutions.as_puzzle_solutions() {
347-
Some(solutions) => {
348-
let mut transmission_ids = Vec::with_capacity(solutions.solution_ids().count());
349-
for (id, solution) in solutions.iter() {
350-
let checksum = Data::<Solution<N>>::Buffer(solution.to_bytes_le()?.into()).to_checksum::<N>()?;
351-
transmission_ids.push(TransmissionID::Solution(*id, checksum));
352-
}
353-
transmission_ids
354-
}
355-
None => Vec::new(),
356-
};
366+
let solution_transmission_ids = Self::compute_solution_transmission_ids(solutions)?;
357367

358368
// Convert Quorum authority to subdag with full batch certificates.
359369
subdag.clone().into_full(

ledger/narwhal/subdag/src/lib.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -280,11 +280,11 @@ impl<N: Network> Subdag<N> {
280280
/// Returns the subdag with full batch certificates.
281281
pub fn into_full(
282282
self,
283-
solutions: &[TransmissionID<N>],
284-
prior_solutions: &[TransmissionID<N>],
285-
aborted_solutions: &[TransmissionID<N>],
283+
solution_ids: &[TransmissionID<N>],
284+
prior_solution_ids: &[TransmissionID<N>],
285+
aborted_solution_ids: &[TransmissionID<N>],
286286
transaction_ids: &[TransmissionID<N>],
287-
prior_transactions: &[TransmissionID<N>],
287+
prior_transaction_ids: &[TransmissionID<N>],
288288
aborted_transaction_ids: &[TransmissionID<N>],
289289
) -> Result<Subdag<N>> {
290290
let subdag = match self {
@@ -300,11 +300,11 @@ impl<N: Network> Subdag<N> {
300300
for certificate in compact_certificates.into_iter() {
301301
// Convert compact certificate to batch certificate.
302302
let batch_certificate = certificate.into_batch_certificate(
303-
solutions.iter(),
304-
prior_solutions.iter(),
305-
aborted_solutions.iter(),
303+
solution_ids.iter(),
304+
prior_solution_ids.iter(),
305+
aborted_solution_ids.iter(),
306306
transaction_ids.iter(),
307-
prior_transactions.iter(),
307+
prior_transaction_ids.iter(),
308308
aborted_transaction_ids.iter(),
309309
)?;
310310
batch_certificates.insert(batch_certificate);
@@ -397,7 +397,7 @@ impl<N: Network> Subdag<N> {
397397
LeaderCertificate::Full(cert)
398398
}
399399
Self::Compact { subdag } => {
400-
// Retrieve entry for the anchor round.
400+
// Retrve entry for the anchor round.
401401
let entry = subdag.iter().next_back();
402402
debug_assert!(entry.is_some(), "There must be at least one round of certificates");
403403
// Retrieve the certificates from the anchor round.

ledger/src/advance.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ impl<N: Network, C: ConsensusStorage<N>> Ledger<N, C> {
6161
.construct_block_template(&previous_block, Some(&subdag), ratifications, solutions, transactions, rng)
6262
.with_context(|| "Failed to construct block template")?;
6363

64+
// Determine the version for this block.
65+
let version = if N::CONSENSUS_VERSION(header.height()).unwrap() >= ConsensusVersion::V10 { 2 } else { 1 };
66+
6467
// --- Solutions ---
6568
// Construct the solution transmission IDs.
6669
let solution_transmission_ids = solutions
@@ -95,7 +98,7 @@ impl<N: Network, C: ConsensusStorage<N>> Ledger<N, C> {
9598
);
9699
aborted_solution_transmission_ids.extend(early_aborted_solution_transmission_ids);
97100
// Construct the aborted solution IDs.
98-
let aborted_solution_ids = if N::CONSENSUS_VERSION(self.latest_height()).unwrap() < ConsensusVersion::V10 {
101+
let aborted_solution_ids = if version < 2 {
99102
Some(
100103
aborted_solution_transmission_ids
101104
.iter()
@@ -148,7 +151,7 @@ impl<N: Network, C: ConsensusStorage<N>> Ledger<N, C> {
148151
);
149152
aborted_transaction_transmission_ids.extend(early_aborted_transaction_transmission_ids);
150153
// Construct the aborted transaction IDs.
151-
let aborted_transaction_ids = if N::CONSENSUS_VERSION(self.latest_height()).unwrap() < ConsensusVersion::V10 {
154+
let aborted_transaction_ids = if version < 2 {
152155
Some(
153156
aborted_transaction_transmission_ids
154157
.iter()
@@ -163,7 +166,7 @@ impl<N: Network, C: ConsensusStorage<N>> Ledger<N, C> {
163166
};
164167

165168
// Construct the compact Subdag
166-
let subdag = if N::CONSENSUS_VERSION(self.latest_height()).unwrap() >= ConsensusVersion::V10 {
169+
let subdag = if version >= 2 {
167170
subdag.into_compact(
168171
solution_transmission_ids,
169172
prior_solution_transmission_ids.clone(),
@@ -181,7 +184,7 @@ impl<N: Network, C: ConsensusStorage<N>> Ledger<N, C> {
181184
aborted_solution_transmission_ids,
182185
prior_transaction_transmission_ids,
183186
aborted_transaction_transmission_ids,
184-
) = if N::CONSENSUS_VERSION(self.latest_height()).unwrap() >= ConsensusVersion::V10 {
187+
) = if version >= 2 {
185188
(
186189
Some(prior_solution_transmission_ids),
187190
Some(aborted_solution_transmission_ids),

0 commit comments

Comments
 (0)