Have coordinator publish batches to Substrate

This commit is contained in:
Luke Parker
2023-05-10 01:45:42 -04:00
parent a70df6a449
commit f55e9b40e6
4 changed files with 36 additions and 12 deletions

View File

@@ -429,10 +429,11 @@ pub async fn handle_processors<D: Db, Pro: Processors, P: P2p>(
); );
// TODO: Also check the other KeyGenId fields // TODO: Also check the other KeyGenId fields
// TODO: Is this safe? // TODO: Publish an unsigned TX with a Musig signature here, instead of on-chain voting
// That removes the need for this nonce
let Ok(nonce) = serai.get_nonce(&substrate_signer.address()).await else { let Ok(nonce) = serai.get_nonce(&substrate_signer.address()).await else {
log::error!("couldn't connect to Serai node to get nonce"); log::error!("couldn't get nonce from Serai node");
todo!(); // TODO todo!()
}; };
let tx = serai let tx = serai
@@ -459,7 +460,7 @@ pub async fn handle_processors<D: Db, Pro: Processors, P: P2p>(
log::info!("voted on key pair for {:?} in TX {}", id.set, hex::encode(hash)) log::info!("voted on key pair for {:?} in TX {}", id.set, hex::encode(hash))
} }
Err(e) => { Err(e) => {
log::error!("couldn't connect to Serai node to publish TX: {:?}", e); log::error!("couldn't connect to Serai node to publish vote TX: {:?}", e);
todo!(); // TODO todo!(); // TODO
} }
} }
@@ -537,9 +538,33 @@ pub async fn handle_processors<D: Db, Pro: Processors, P: P2p>(
})) }))
} }
}, },
ProcessorMessage::Substrate(msg) => match msg { ProcessorMessage::Substrate(inner_msg) => match inner_msg {
// TODO processor_messages::substrate::ProcessorMessage::Update { key: _, batch } => {
processor_messages::substrate::ProcessorMessage::Update { .. } => todo!(), assert_eq!(
batch.batch.network, msg.network,
"processor sent us a batch for a different network than it was for",
);
// TODO: Check this key's key pair's substrate key is authorized to publish batches
// TODO: Check the batch ID is an atomic increment
match serai.publish(&serai.execute_batch(batch.clone())).await {
Ok(hash) => {
log::info!(
"executed batch {:?} {} (block {}) in TX {}",
batch.batch.network,
batch.batch.id,
hex::encode(batch.batch.block),
hex::encode(hash),
)
}
Err(e) => {
log::error!("couldn't connect to Serai node to publish batch TX: {:?}", e);
todo!(); // TODO
}
}
None
}
}, },
}; };

View File

@@ -33,7 +33,7 @@ impl Serai {
.await .await
} }
pub fn execute_batch(&self, batch: SignedBatch) -> Result<Encoded, SeraiError> { pub fn execute_batch(&self, batch: SignedBatch) -> Encoded {
self.unsigned::<InInstructions, _>(&in_instructions::Call::<Runtime>::execute_batch { batch }) self.unsigned::<InInstructions, _>(&in_instructions::Call::<Runtime>::execute_batch { batch })
} }
} }

View File

@@ -269,7 +269,7 @@ impl Serai {
.map_err(SeraiError::RpcError) .map_err(SeraiError::RpcError)
} }
fn unsigned<P: 'static, C: Encode>(&self, call: &C) -> Result<Encoded, SeraiError> { fn unsigned<P: 'static, C: Encode>(&self, call: &C) -> Encoded {
// TODO: Should Serai purge the old transaction code AND set this to 0/1? // TODO: Should Serai purge the old transaction code AND set this to 0/1?
const TRANSACTION_VERSION: u8 = 4; const TRANSACTION_VERSION: u8 = 4;
@@ -284,7 +284,7 @@ impl Serai {
// Prefix the length // Prefix the length
let mut complete_bytes = scale::Compact(u32::try_from(bytes.len()).unwrap()).encode(); let mut complete_bytes = scale::Compact(u32::try_from(bytes.len()).unwrap()).encode();
complete_bytes.extend(bytes); complete_bytes.extend(bytes);
Ok(Encoded(complete_bytes)) Encoded(complete_bytes)
} }
pub fn sign<S: Send + Sync + Signer<SeraiConfig>>( pub fn sign<S: Send + Sync + Signer<SeraiConfig>>(

View File

@@ -31,8 +31,7 @@ pub async fn provide_batch(batch: Batch) -> [u8; 32] {
let block = publish_tx( let block = publish_tx(
&serai &serai
.execute_batch(SignedBatch { batch: batch.clone(), signature: pair.sign(&batch.encode()) }) .execute_batch(SignedBatch { batch: batch.clone(), signature: pair.sign(&batch.encode()) }),
.unwrap(),
) )
.await; .await;