Files
reth/examples/custom-payload-builder/src/job.rs
Arsenii Kulikov 8d32fd788b feat: allow awaiting payload in progress (#11823)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2024-10-18 10:45:51 +00:00

81 lines
2.9 KiB
Rust

use futures_util::Future;
use reth::{
providers::StateProviderFactory, tasks::TaskSpawner, transaction_pool::TransactionPool,
};
use reth_basic_payload_builder::{PayloadBuilder, PayloadConfig};
use reth_node_api::PayloadKind;
use reth_payload_builder::{KeepPayloadJobAlive, PayloadBuilderError, PayloadJob};
use std::{
pin::Pin,
task::{Context, Poll},
};
/// A [PayloadJob] that builds empty blocks.
pub struct EmptyBlockPayloadJob<Client, Pool, Tasks, Builder>
where
Builder: PayloadBuilder<Pool, Client>,
{
/// The configuration for how the payload will be created.
pub(crate) config: PayloadConfig<Builder::Attributes>,
/// The client that can interact with the chain.
pub(crate) client: Client,
/// The transaction pool.
pub(crate) _pool: Pool,
/// How to spawn building tasks
pub(crate) _executor: Tasks,
/// The type responsible for building payloads.
///
/// See [PayloadBuilder]
pub(crate) builder: Builder,
}
impl<Client, Pool, Tasks, Builder> PayloadJob for EmptyBlockPayloadJob<Client, Pool, Tasks, Builder>
where
Client: StateProviderFactory + Clone + Unpin + 'static,
Pool: TransactionPool + Unpin + 'static,
Tasks: TaskSpawner + Clone + 'static,
Builder: PayloadBuilder<Pool, Client> + Unpin + 'static,
<Builder as PayloadBuilder<Pool, Client>>::Attributes: Unpin + Clone,
<Builder as PayloadBuilder<Pool, Client>>::BuiltPayload: Unpin + Clone,
{
type PayloadAttributes = Builder::Attributes;
type ResolvePayloadFuture =
futures_util::future::Ready<Result<Self::BuiltPayload, PayloadBuilderError>>;
type BuiltPayload = Builder::BuiltPayload;
fn best_payload(&self) -> Result<Self::BuiltPayload, PayloadBuilderError> {
let payload = self.builder.build_empty_payload(&self.client, self.config.clone())?;
Ok(payload)
}
fn payload_attributes(&self) -> Result<Self::PayloadAttributes, PayloadBuilderError> {
Ok(self.config.attributes.clone())
}
fn resolve_kind(
&mut self,
_kind: PayloadKind,
) -> (Self::ResolvePayloadFuture, KeepPayloadJobAlive) {
let payload = self.best_payload();
(futures_util::future::ready(payload), KeepPayloadJobAlive::No)
}
}
/// A [PayloadJob] is a a future that's being polled by the `PayloadBuilderService`
impl<Client, Pool, Tasks, Builder> Future for EmptyBlockPayloadJob<Client, Pool, Tasks, Builder>
where
Client: StateProviderFactory + Clone + Unpin + 'static,
Pool: TransactionPool + Unpin + 'static,
Tasks: TaskSpawner + Clone + 'static,
Builder: PayloadBuilder<Pool, Client> + Unpin + 'static,
<Builder as PayloadBuilder<Pool, Client>>::Attributes: Unpin + Clone,
<Builder as PayloadBuilder<Pool, Client>>::BuiltPayload: Unpin + Clone,
{
type Output = Result<(), PayloadBuilderError>;
fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output> {
Poll::Pending
}
}