From a26ca1a92f9fb8bbb5ae1f16cf3be82f4602bf4a Mon Sep 17 00:00:00 2001 From: Luke Parker Date: Thu, 20 Apr 2023 06:59:42 -0400 Subject: [PATCH] Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. --- coordinator/src/tests/tributary.rs | 9 ++-- coordinator/src/tributary/mod.rs | 66 ++++++++++++++++++---------- coordinator/src/tributary/scanner.rs | 57 ++++++++++++------------ 3 files changed, 76 insertions(+), 56 deletions(-) diff --git a/coordinator/src/tests/tributary.rs b/coordinator/src/tests/tributary.rs index 21e5b87e..a1e8413b 100644 --- a/coordinator/src/tests/tributary.rs +++ b/coordinator/src/tests/tributary.rs @@ -71,11 +71,12 @@ fn serialize_transaction() { )); } - test_read_write(Transaction::SignPreprocess(random_sign_data(&mut OsRng))); - test_read_write(Transaction::SignShare(random_sign_data(&mut OsRng))); - - test_read_write(Transaction::FinalizedBlock(OsRng.next_u64())); + test_read_write(Transaction::ExternalBlock(OsRng.next_u64())); + test_read_write(Transaction::SeraiBlock(OsRng.next_u64())); test_read_write(Transaction::BatchPreprocess(random_sign_data(&mut OsRng))); test_read_write(Transaction::BatchShare(random_sign_data(&mut OsRng))); + + test_read_write(Transaction::SignPreprocess(random_sign_data(&mut OsRng))); + test_read_write(Transaction::SignShare(random_sign_data(&mut OsRng))); } diff --git a/coordinator/src/tributary/mod.rs b/coordinator/src/tributary/mod.rs index dc44351d..27e4234f 100644 --- a/coordinator/src/tributary/mod.rs +++ b/coordinator/src/tributary/mod.rs @@ -157,13 +157,17 @@ pub enum Transaction { DkgCommitments(u32, Vec, Signed), DkgShares(u32, HashMap>, Signed), - SignPreprocess(SignData), - SignShare(SignData), - - FinalizedBlock(u64), + // When an external block is finalized, we can allow the associated batch IDs + ExternalBlock(u64), + // When a Serai block is finalized, with the contained batches, we can allow the associated plan + // IDs + SeraiBlock(u64), BatchPreprocess(SignData), BatchShare(SignData), + + SignPreprocess(SignData), + SignShare(SignData), } impl ReadWrite for Transaction { @@ -218,17 +222,24 @@ impl ReadWrite for Transaction { Ok(Transaction::DkgShares(attempt, shares, signed)) } - 2 => SignData::read(reader).map(Transaction::SignPreprocess), - 3 => SignData::read(reader).map(Transaction::SignShare), - - 4 => { + 2 => { let mut block = [0; 8]; reader.read_exact(&mut block)?; - Ok(Transaction::FinalizedBlock(u64::from_le_bytes(block))) + Ok(Transaction::ExternalBlock(u64::from_le_bytes(block))) } - 5 => SignData::read(reader).map(Transaction::BatchPreprocess), - 6 => SignData::read(reader).map(Transaction::BatchShare), + 3 => { + let mut block = [0; 8]; + reader.read_exact(&mut block)?; + Ok(Transaction::SeraiBlock(u64::from_le_bytes(block))) + } + + 4 => SignData::read(reader).map(Transaction::BatchPreprocess), + 5 => SignData::read(reader).map(Transaction::BatchShare), + + 6 => SignData::read(reader).map(Transaction::SignPreprocess), + 7 => SignData::read(reader).map(Transaction::SignShare), + _ => Err(io::Error::new(io::ErrorKind::Other, "invalid transaction type")), } } @@ -274,28 +285,33 @@ impl ReadWrite for Transaction { signed.write(writer) } - Transaction::SignPreprocess(data) => { + Transaction::ExternalBlock(block) => { writer.write_all(&[2])?; - data.write(writer) - } - Transaction::SignShare(data) => { - writer.write_all(&[3])?; - data.write(writer) + writer.write_all(&block.to_le_bytes()) } - Transaction::FinalizedBlock(block) => { - writer.write_all(&[4])?; + Transaction::SeraiBlock(block) => { + writer.write_all(&[3])?; writer.write_all(&block.to_le_bytes()) } Transaction::BatchPreprocess(data) => { - writer.write_all(&[5])?; + writer.write_all(&[4])?; data.write(writer) } Transaction::BatchShare(data) => { + writer.write_all(&[5])?; + data.write(writer) + } + + Transaction::SignPreprocess(data) => { writer.write_all(&[6])?; data.write(writer) } + Transaction::SignShare(data) => { + writer.write_all(&[7])?; + data.write(writer) + } } } } @@ -306,13 +322,15 @@ impl TransactionTrait for Transaction { Transaction::DkgCommitments(_, _, signed) => TransactionKind::Signed(signed), Transaction::DkgShares(_, _, signed) => TransactionKind::Signed(signed), - Transaction::SignPreprocess(data) => TransactionKind::Signed(&data.signed), - Transaction::SignShare(data) => TransactionKind::Signed(&data.signed), - - Transaction::FinalizedBlock(_) => TransactionKind::Provided, + // TODO: Tributary requires these be perfectly ordered, yet they have two separate clocks + Transaction::ExternalBlock(_) => TransactionKind::Provided, + Transaction::SeraiBlock(_) => TransactionKind::Provided, Transaction::BatchPreprocess(data) => TransactionKind::Signed(&data.signed), Transaction::BatchShare(data) => TransactionKind::Signed(&data.signed), + + Transaction::SignPreprocess(data) => TransactionKind::Signed(&data.signed), + Transaction::SignShare(data) => TransactionKind::Signed(&data.signed), } } diff --git a/coordinator/src/tributary/scanner.rs b/coordinator/src/tributary/scanner.rs index abb3aca6..76a39408 100644 --- a/coordinator/src/tributary/scanner.rs +++ b/coordinator/src/tributary/scanner.rs @@ -135,35 +135,9 @@ async fn handle_block( } } - Transaction::SignPreprocess(data) => { - // TODO: Validate data.plan - if let Some(preprocesses) = - handle(b"sign_preprocess", spec.t(), data.plan, data.attempt, data.data, data.signed) - { - processor - .send(CoordinatorMessage::Sign(sign::CoordinatorMessage::Preprocesses { - id: SignId { key: todo!(), id: data.plan, attempt: data.attempt }, - preprocesses, - })) - .await; - } - } - Transaction::SignShare(data) => { - // TODO: Validate data.plan - if let Some(shares) = - handle(b"sign_share", spec.t(), data.plan, data.attempt, data.data, data.signed) - { - processor - .send(CoordinatorMessage::Sign(sign::CoordinatorMessage::Shares { - id: SignId { key: todo!(), id: data.plan, attempt: data.attempt }, - shares, - })) - .await; - } - } - // TODO - Transaction::FinalizedBlock(..) => todo!(), + Transaction::ExternalBlock(..) => todo!(), + Transaction::SeraiBlock(..) => todo!(), Transaction::BatchPreprocess(data) => { // TODO: Validate data.plan @@ -196,6 +170,33 @@ async fn handle_block( .await; } } + + Transaction::SignPreprocess(data) => { + // TODO: Validate data.plan + if let Some(preprocesses) = + handle(b"sign_preprocess", spec.t(), data.plan, data.attempt, data.data, data.signed) + { + processor + .send(CoordinatorMessage::Sign(sign::CoordinatorMessage::Preprocesses { + id: SignId { key: todo!(), id: data.plan, attempt: data.attempt }, + preprocesses, + })) + .await; + } + } + Transaction::SignShare(data) => { + // TODO: Validate data.plan + if let Some(shares) = + handle(b"sign_share", spec.t(), data.plan, data.attempt, data.data, data.signed) + { + processor + .send(CoordinatorMessage::Sign(sign::CoordinatorMessage::Shares { + id: SignId { key: todo!(), id: data.plan, attempt: data.attempt }, + shares, + })) + .await; + } + } } TributaryDb::::handle_event(&mut txn, hash, event_id);