Skip to content

Commit

Permalink
Use a proper transcript for Tributary scanner topics
Browse files Browse the repository at this point in the history
  • Loading branch information
kayabaNerve committed Sep 27, 2023
1 parent 01a4b9e commit 4a32f22
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 20 deletions.
2 changes: 0 additions & 2 deletions coordinator/src/substrate/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,6 @@ async fn handle_batch_and_burns<Pro: Processors>(
network_had_event(&mut burns, &mut batches, network);

// Make sure this is the only Batch event for this network in this Block
// TODO: Make sure Serai rejects multiple Batchs within the same block. It should, as of an
// yet to be merged branch
assert!(batch_block.insert(network, network_block).is_none());

// Add the batch included by this block
Expand Down
29 changes: 17 additions & 12 deletions coordinator/src/tributary/db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,17 @@ pub enum Topic {

impl Topic {
fn as_key(&self, genesis: [u8; 32]) -> Vec<u8> {
match self {
Topic::Dkg => [genesis.as_slice(), b"dkg".as_ref()].concat(),
Topic::Batch(id) => [genesis.as_slice(), b"batch".as_ref(), id.as_ref()].concat(),
Topic::Sign(id) => [genesis.as_slice(), b"sign".as_ref(), id.as_ref()].concat(),
}
let mut res = genesis.to_vec();
let (label, id) = match self {
Topic::Dkg => (b"dkg".as_slice(), [].as_slice()),
Topic::Batch(id) => (b"batch".as_slice(), id.as_slice()),
Topic::Sign(id) => (b"sign".as_slice(), id.as_slice()),
};
res.push(u8::try_from(label.len()).unwrap());
res.extend(label);
res.push(u8::try_from(id.len()).unwrap());
res.extend(id);
res
}
}

Expand All @@ -35,13 +41,12 @@ pub struct DataSpecification {

impl DataSpecification {
fn as_key(&self, genesis: [u8; 32]) -> Vec<u8> {
// TODO: Use a proper transcript here to avoid conflicts?
[
self.topic.as_key(genesis).as_ref(),
self.label.as_bytes(),
self.attempt.to_le_bytes().as_ref(),
]
.concat()
let mut res = self.topic.as_key(genesis);
let label_bytes = self.label.bytes();
res.push(u8::try_from(label_bytes.len()).unwrap());
res.extend(label_bytes);
res.extend(self.attempt.to_le_bytes());
res
}
}

Expand Down
26 changes: 20 additions & 6 deletions coordinator/src/tributary/handle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,19 @@ use crate::{
},
};

const DKG_COMMITMENTS: &str = "commitments";
const DKG_SHARES: &str = "shares";
const DKG_CONFIRMATION_NONCES: &str = "confirmation_nonces";
const DKG_CONFIRMATION_SHARES: &str = "confirmation_shares";

// These s/b prefixes between Batch and Sign should be unnecessary, as Batch/Share entries
// themselves should already be domain separated
const BATCH_PREPROCESS: &str = "b_preprocess";
const BATCH_SHARE: &str = "b_share";

const SIGN_PREPROCESS: &str = "s_preprocess";
const SIGN_SHARE: &str = "s_share";

// Instead of maintaing state, this simply re-creates the machine(s) in-full on every call (which
// should only be once per tributary).
// This simplifies data flow and prevents requiring multiple paths.
Expand Down Expand Up @@ -290,7 +300,7 @@ pub(crate) async fn handle_application_tx<
Transaction::DkgCommitments(attempt, bytes, signed) => {
match handle(
txn,
&DataSpecification { topic: Topic::Dkg, label: "commitments", attempt },
&DataSpecification { topic: Topic::Dkg, label: DKG_COMMITMENTS, attempt },
bytes,
&signed,
) {
Expand Down Expand Up @@ -345,7 +355,7 @@ pub(crate) async fn handle_application_tx<
);
match handle(
txn,
&DataSpecification { topic: Topic::Dkg, label: "shares", attempt },
&DataSpecification { topic: Topic::Dkg, label: DKG_SHARES, attempt },
bytes,
&signed,
) {
Expand Down Expand Up @@ -436,7 +446,7 @@ pub(crate) async fn handle_application_tx<
txn,
&DataSpecification {
topic: Topic::Batch(data.plan),
label: "preprocess",
label: BATCH_PREPROCESS,
attempt: data.attempt,
},
data.data,
Expand All @@ -463,7 +473,7 @@ pub(crate) async fn handle_application_tx<
txn,
&DataSpecification {
topic: Topic::Batch(data.plan),
label: "share",
label: BATCH_SHARE,
attempt: data.attempt,
},
data.data,
Expand Down Expand Up @@ -494,7 +504,7 @@ pub(crate) async fn handle_application_tx<
txn,
&DataSpecification {
topic: Topic::Sign(data.plan),
label: "preprocess",
label: SIGN_PREPROCESS,
attempt: data.attempt,
},
data.data,
Expand Down Expand Up @@ -527,7 +537,11 @@ pub(crate) async fn handle_application_tx<
let key_pair = TributaryDb::<D>::key_pair(txn, spec.set());
match handle(
txn,
&DataSpecification { topic: Topic::Sign(data.plan), label: "share", attempt: data.attempt },
&DataSpecification {
topic: Topic::Sign(data.plan),
label: SIGN_SHARE,
attempt: data.attempt,
},
data.data,
&data.signed,
) {
Expand Down

0 comments on commit 4a32f22

Please sign in to comment.