Skip to content

Commit

Permalink
feat(examples): minimal viable ExEx
Browse files Browse the repository at this point in the history
  • Loading branch information
shekhirin committed Apr 11, 2024
1 parent e17da42 commit d2962cc
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 0 deletions.
16 changes: 16 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Expand Up @@ -77,6 +77,7 @@ members = [
"examples/trace-transaction-cli/",
"examples/polygon-p2p/",
"examples/custom-inspector/",
"examples/exex/minimal/",
"testing/ef-tests/",
]
default-members = ["bin/reth"]
Expand Down
19 changes: 19 additions & 0 deletions examples/exex/minimal/Cargo.toml
@@ -0,0 +1,19 @@
[package]
name = "minimal"
version = "0.0.0"
publish = false
edition.workspace = true
license.workspace = true

[dependencies]
reth.workspace = true
reth-exex.workspace = true
reth-node-api.workspace = true
reth-node-core.workspace = true
reth-node-ethereum.workspace = true
reth-primitives.workspace = true
reth-provider.workspace = true

eyre.workspace = true
tokio.workspace = true
futures.workspace = true
57 changes: 57 additions & 0 deletions examples/exex/minimal/src/main.rs
@@ -0,0 +1,57 @@
use std::{
pin::Pin,
task::{Context, Poll},
};

use futures::Future;
use reth::builder::FullNodeTypes;
use reth_exex::{ExExContext, ExExEvent};
use reth_node_ethereum::EthereumNode;
use reth_provider::CanonStateNotification;

struct MinimalExEx<Node: FullNodeTypes> {
ctx: ExExContext<Node>,
}

impl<Node: FullNodeTypes> Future for MinimalExEx<Node> {
type Output = eyre::Result<()>;

fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let this = self.get_mut();

// Process all new chain state notifications until there are no more
while let Poll::Ready(Some(notification)) = this.ctx.notifications.poll_recv(cx) {
// Process one notification
match &notification {
CanonStateNotification::Commit { new } => {
println!("Received commit: {:?}", new.first().number..=new.tip().number);
}
CanonStateNotification::Reorg { old, new } => {
println!(
"Received reorg: {:?} -> {:?}",
old.first().number..=old.tip().number,
new.first().number..=new.tip().number
);
}
};

// Send a finished height event, signaling the node that we don't need any blocks below
// this height anymore
this.ctx.events.send(ExExEvent::FinishedHeight(notification.tip().number))?;
}

Poll::Pending
}
}

fn main() -> eyre::Result<()> {
reth::cli::Cli::parse_args().run(|builder, _| async move {
let handle = builder
.node(EthereumNode::default())
.install_exex("Optimism", move |ctx| futures::future::ok(MinimalExEx { ctx }))
.launch()
.await?;

handle.wait_for_node_exit().await
})
}

0 comments on commit d2962cc

Please sign in to comment.