Skip to main content

ReactiveRuntime

Struct ReactiveRuntime 

Source
pub struct ReactiveRuntime<N: Network = Ethereum> { /* private fields */ }
Expand description

Reactive runtime.

Implementations§

Source§

impl<N: Network> ReactiveRuntime<N>

Source

pub fn new(config: ReactiveConfig) -> Self

Create an empty runtime.

Source

pub fn track_account(&mut self, address: Address, policy: TrackingPolicy)

Track address under policy for the per-block root gate (Phase-8 step 4).

Tracking is strictly opt-in: a runtime with no tracked accounts runs the gate as a no-op. Registering an account clears any baseline it held (a policy change re-adopts on the next probe rather than diffing against a baseline captured under the old policy). Each RootGateCadence firing, the gate probes tracked WholeAccount and Scalars accounts’ roots/fields via the account-proof seam and, on a move no decoder covered, emits a ReactiveReport::CoverageGap and schedules a ResyncReason::RootMoved repair. Slots accounts are never root-gated (spec Decision 3).

Source

pub fn untrack_account(&mut self, address: Address) -> bool

Stop tracking address, dropping its policy and any adopted baseline.

Returns true if the account was tracked.

Source

pub fn set_root_gate_cadence(&mut self, cadence: RootGateCadence)

Set how often the root gate probes tracked accounts (default: RootGateCadence::default — every 16 canonical blocks; see the RootGateCadence docs for why skipping blocks loses no detection).

Reconfiguring resets the gate’s window bookkeeping (the touched-address accumulator and the last-fired block), so a stale window never leaks into the new cadence: the next canonical block fires the gate.

Source

pub fn root_gate_cadence(&self) -> RootGateCadence

The configured RootGateCadence.

Source

pub fn enable_freshness_stamping(&mut self)

Enable freshness stamping of canonical event-derived writes (opt-in).

Installs a FreshnessRegistry the runtime owns; while it is present, applying a canonical handler storage-slot effect for a block N stamps the touched (address, slot) as Validity::ValidThrough(N). The slot is therefore not volatile at N (event-maintained, no need to re-verify) but ages to volatile once the clock passes N.

Idempotent: if a registry is already installed it is left untouched, so an existing registry (and any stamps it holds) is never clobbered.

Source

pub fn freshness(&self) -> Option<&FreshnessRegistry>

Borrow the runtime’s freshness registry, if stamping was enabled.

Returns None unless enable_freshness_stamping was called.

Source

pub fn freshness_mut(&mut self) -> Option<&mut FreshnessRegistry>

Mutably borrow the runtime’s freshness registry, if stamping was enabled.

Returns None unless enable_freshness_stamping was called.

Source

pub fn health(&self) -> CacheHealth

Return the current queryable CacheHealth of the runtime.

Source

pub fn metrics(&self) -> CacheMetricsSnapshot

Return a point-in-time snapshot of the runtime’s observability counters.

Source

pub fn reset_health(&mut self)

Complete the caller-driven self-heal by returning health to CacheHealth::Healthy.

A trust-loss event (a reorg deeper than the journal, or a detected missed block range) escalates health toward CacheHealth::Unhealthy as a “stop until rebuilt” signal that the caller must act on. Once the caller has resynced or rebuilt the affected state, it invokes this to clear the signal. It does not emit a ReactiveReport::Health report, since it is called outside an ingest cycle.

Source

pub fn register_handler( &mut self, handler: Arc<dyn ReactiveHandler<N>>, ) -> Result<(), RegisterError>

Register a handler.

Source

pub fn unregister_handler( &mut self, id: &HandlerId, ) -> Option<Arc<dyn ReactiveHandler<N>>>

Remove one handler from the runtime registry without resetting runtime state.

This delegates to ReactiveRegistry::unregister_handler only. It does not clear the reorg journal, health, metrics, hooks, pending resyncs, tracking policy, freshness registry, or root-gate baselines, and it does not purge EvmCache state. Callers that want cache eviction must issue explicit StateUpdate::purge updates or use cache purge APIs separately.

Source

pub fn contains_handler(&self, id: &HandlerId) -> bool

Return true when the runtime has a registered handler with id.

Source

pub fn handler_ids(&self) -> Vec<HandlerId>

Ids of all registered handlers, in registration (= routing) order.

Source

pub fn handler_interests( &self, id: &HandlerId, ) -> Option<&[ReactiveInterest<N>]>

Borrow the interests owned by one registered handler.

Source

pub fn last_canonical_block(&self) -> Option<BlockRef>

The most recently journaled canonical block, if any.

This is the runtime’s current chain position: the canonical block most recently recorded by ingestion. Reorged blocks are dropped from the journal during recovery, so a rolled-back head does not linger here. ReactiveEngine::register_handler uses it as the default backfill anchor for handlers registered mid-lifecycle. None until the first canonical input is journaled, and always None when ReactiveConfig::journal_depth is 0 (journaling disabled).

Source

pub fn pending_resyncs(&self) -> &[ResyncRequest]

Queued resync requests: surfaced by handlers but not yet executed by an ingest_batch_with_resync pass.

Callers driving resync execution themselves (plain ingest_batch loops) can read the ledger here; reorg recovery cancels entries whose pinned blocks were dropped, and cancel_pending_resyncs drops entries for torn-down accounts.

Source

pub fn cancel_pending_resyncs(&mut self, address: Address) -> Vec<ResyncRequest>

Cancel queued resync work that targets address, returning the cancelled portions.

Every pending ResyncRequest target referencing address is removed; a request reduced to zero targets is dropped entirely, while mixed-target requests keep their other accounts queued. Each returned request mirrors the original id/reason/block/priority and carries only the targets that were cancelled.

This is part of the adapter-teardown recipe (see ReactiveEngine::unregister_handler): it clears the pending ledger so a dropped pool’s queued repairs stop occupying memory and stop surfacing as cancellations in reorg reports. It cannot recall requests already returned to the caller in earlier batch reports.

Source

pub fn register_hook( &mut self, hook: Arc<dyn ReactiveHook<N>>, ) -> Result<(), RegisterError>

Register a hook.

Source

pub fn interests(&self) -> Vec<ReactiveInterest<N>>

Return all registered interests in handler registration order.

Source

pub fn ingest_batch( &mut self, cache: &mut EvmCache, batch: ReactiveInputBatch<N>, ) -> Result<ReactiveBatchReport<N>, ReactiveError>

Ingest a batch, apply valid direct state effects, and dispatch reports.

Source

pub fn ingest_batch_with_resync( &mut self, cache: &mut EvmCache, batch: ReactiveInputBatch<N>, ) -> Result<ReactiveBatchReport<N>, ReactiveError>

Ingest a batch, then execute surfaced storage resync requests.

This entrypoint preserves ingest_batch behavior for direct handler effects, then runs a synchronous resync phase over the collected ResyncRequests. Storage targets are fetched through EvmCache::storage_batch_fetcher grouped by ResyncBlock, successful values are applied as StateUpdate::slot updates through EvmCache::apply_updates, and unsupported or failed targets are reported in ResyncReport::failed. It does not start subscribers, background workers, or network transport.

Auto Trait Implementations§

§

impl<N = Ethereum> !Freeze for ReactiveRuntime<N>

§

impl<N = Ethereum> !RefUnwindSafe for ReactiveRuntime<N>

§

impl<N = Ethereum> !UnwindSafe for ReactiveRuntime<N>

§

impl<N> Send for ReactiveRuntime<N>

§

impl<N> Sync for ReactiveRuntime<N>

§

impl<N> Unpin for ReactiveRuntime<N>
where N: Unpin,

§

impl<N> UnsafeUnpin for ReactiveRuntime<N>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more