1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
use sov_rollup_interface::da::{BlobReaderTrait, DaSpec};
use sov_state::{AccessoryWorkingSet, WorkingSet};
use crate::transaction::Transaction;
use crate::{Context, Spec};
/// Hooks that execute within the `StateTransitionFunction::apply_blob` function for each processed transaction.
pub trait TxHooks {
type Context: Context;
/// Runs just before a transaction is dispatched to an appropriate module.
/// TODO: Why does it return address?
/// Does it implies that it should do signature verification.
/// Can other code rely on that assumption?
fn pre_dispatch_tx_hook(
&self,
tx: &Transaction<Self::Context>,
working_set: &mut WorkingSet<<Self::Context as Spec>::Storage>,
) -> anyhow::Result<<Self::Context as Spec>::Address>;
/// Runs after the tx is dispatched to an appropriate module.
/// IF this hook returns error rollup panics
fn post_dispatch_tx_hook(
&self,
tx: &Transaction<Self::Context>,
working_set: &mut WorkingSet<<Self::Context as Spec>::Storage>,
) -> anyhow::Result<()>;
}
/// Hooks related to the Sequencer functionality.
/// In essence, the sequencer locks a bond at the beginning of the `StateTransitionFunction::apply_blob`,
/// and is rewarded once a blob of transactions is processed.
pub trait ApplyBlobHooks<B: BlobReaderTrait> {
type Context: Context;
type BlobResult;
/// Runs at the beginning of apply_blob, locks the sequencer bond.
/// If this hook returns Err, batch is not applied
fn begin_blob_hook(
&self,
blob: &mut B,
working_set: &mut WorkingSet<<Self::Context as Spec>::Storage>,
) -> anyhow::Result<()>;
/// Executes at the end of apply_blob and rewards or slashed the sequencer
/// If this hook returns Err rollup panics
fn end_blob_hook(
&self,
result: Self::BlobResult,
working_set: &mut WorkingSet<<Self::Context as Spec>::Storage>,
) -> anyhow::Result<()>;
}
/// Hooks that execute during the `StateTransitionFunction::begin_slot` and `end_slot` functions.
pub trait SlotHooks<Da: DaSpec> {
type Context: Context;
fn begin_slot_hook(
&self,
slot_header: &Da::BlockHeader,
validity_condition: &Da::ValidityCondition,
working_set: &mut WorkingSet<<Self::Context as Spec>::Storage>,
);
fn end_slot_hook(&self, working_set: &mut WorkingSet<<Self::Context as Spec>::Storage>);
fn finalize_slot_hook(
&self,
root_hash: [u8; 32],
accesorry_working_set: &mut AccessoryWorkingSet<<Self::Context as Spec>::Storage>,
);
}