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
73
74
75
76
77
use sov_rollup_interface::da::{BlobReaderTrait, DaSpec};
use sov_state::Storage;
use crate::transaction::Transaction;
use crate::{AccessoryWorkingSet, Context, Spec, WorkingSet};
/// 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>,
) -> 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>,
) -> 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>,
) -> 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>,
) -> 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,
pre_state_root: &<<Self::Context as Spec>::Storage as Storage>::Root,
working_set: &mut WorkingSet<Self::Context>,
);
fn end_slot_hook(&self, working_set: &mut WorkingSet<Self::Context>);
}
pub trait FinalizeHook<Da: DaSpec> {
type Context: Context;
fn finalize_hook(
&self,
root_hash: &<<Self::Context as Spec>::Storage as Storage>::Root,
accesorry_working_set: &mut AccessoryWorkingSet<Self::Context>,
);
}