mirror of
https://github.com/serai-dex/serai.git
synced 2025-12-08 04:09:23 +00:00
Start defining the coordinator
This commit is contained in:
@@ -14,13 +14,19 @@ all-features = true
|
||||
rustdoc-args = ["--cfg", "docsrs"]
|
||||
|
||||
[dependencies]
|
||||
log = "0.4"
|
||||
|
||||
blake2 = "0.10"
|
||||
|
||||
frost = { package = "modular-frost", path = "../crypto/frost" }
|
||||
|
||||
serai-db = { path = "../common/db" }
|
||||
|
||||
processor-messages = { package = "processor-messages", path = "../processor/messages" }
|
||||
tributary = { package = "tributary-chain", path = "./tributary" }
|
||||
|
||||
serai-client = { path = "../substrate/client", features = ["serai"] }
|
||||
|
||||
tokio = { version = "1", features = ["full"] }
|
||||
|
||||
[dev-dependencies]
|
||||
|
||||
@@ -1,7 +1,33 @@
|
||||
#![allow(dead_code)]
|
||||
#![allow(unused_variables)]
|
||||
#![allow(unused_mut)]
|
||||
|
||||
use serai_db::Db;
|
||||
|
||||
use serai_client::Serai;
|
||||
|
||||
mod transaction;
|
||||
mod substrate;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
async fn run<D: Db>(db: D, serai: Serai) {
|
||||
let mut last_substrate_block = 0; // TODO: Load from DB
|
||||
|
||||
loop {
|
||||
match substrate::handle_new_blocks(&serai, &mut last_substrate_block).await {
|
||||
Ok(()) => {}
|
||||
Err(e) => log::error!("couldn't communicate with serai node: {e}"),
|
||||
}
|
||||
|
||||
// Handle all messages from tributaries
|
||||
|
||||
// Handle all messages from processors
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {}
|
||||
async fn main() {
|
||||
// Open the database
|
||||
}
|
||||
|
||||
52
coordinator/src/substrate.rs
Normal file
52
coordinator/src/substrate.rs
Normal file
@@ -0,0 +1,52 @@
|
||||
use serai_client::{SeraiError, Block, Serai};
|
||||
|
||||
async fn handle_block(serai: &Serai, block: Block) -> Result<Vec<()>, SeraiError> {
|
||||
let hash = block.hash();
|
||||
let mut actions = vec![];
|
||||
|
||||
// If a new validator set was activated, create tributary/inform processor to do a DKG
|
||||
for new_set in serai.get_new_set_events(hash).await? {
|
||||
todo!()
|
||||
}
|
||||
|
||||
// If a key pair was confirmed, inform the processor
|
||||
for key_gen in serai.get_key_gen_events(hash).await? {
|
||||
todo!()
|
||||
}
|
||||
|
||||
// If batch, tell processor of block acknowledged/burns
|
||||
for new_set in serai.get_batch_events(hash).await? {
|
||||
todo!()
|
||||
}
|
||||
|
||||
Ok(actions)
|
||||
}
|
||||
|
||||
pub(crate) async fn handle_new_blocks(
|
||||
serai: &Serai,
|
||||
last_substrate_block: &mut u64,
|
||||
) -> Result<(), SeraiError> {
|
||||
// Check if there's been a new Substrate block
|
||||
let latest = serai.get_latest_block().await?;
|
||||
let latest_number = latest.number();
|
||||
if latest_number == *last_substrate_block {
|
||||
return Ok(());
|
||||
}
|
||||
let mut latest = Some(latest);
|
||||
|
||||
for b in (*last_substrate_block + 1) ..= latest_number {
|
||||
let actions = handle_block(
|
||||
serai,
|
||||
if b == latest_number {
|
||||
latest.take().unwrap()
|
||||
} else {
|
||||
serai.get_block_by_number(b).await?.unwrap()
|
||||
},
|
||||
)
|
||||
.await?;
|
||||
// TODO: Handle actions, update the DB
|
||||
*last_substrate_block += 1;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user