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
#![deny(missing_docs)]
//! The rollup capabilities module defines "capabilities" that rollup must
//! provide if they wish to use the standard app template.
//! If you don't want to provide these capabilities,
//! you can bypass the Sovereign module-system completely
//! and write a state transition function from scratch.
//! [See here for docs](https://github.com/Sovereign-Labs/sovereign-sdk/blob/nightly/examples/demo-stf/README.md)
use sov_rollup_interface::da::{BlobReaderTrait, DaSpec};
use sov_state::WorkingSet;
use crate::{Context, Spec};
/// Container type for mixing borrowed and owned blobs.
pub enum BlobRefOrOwned<'a, B: BlobReaderTrait> {
/// Mutable reference
Ref(&'a mut B),
/// Owned blob
Owned(B),
}
impl<'a, B: BlobReaderTrait> BlobRefOrOwned<'a, B> {
/// Convenience method to get mutable reference to the blob
pub fn as_mut_ref(&mut self) -> &mut B {
match self {
BlobRefOrOwned::Ref(r) => r,
BlobRefOrOwned::Owned(ref mut blob) => blob,
}
}
}
impl<'a, B: BlobReaderTrait> From<B> for BlobRefOrOwned<'a, B> {
fn from(value: B) -> Self {
BlobRefOrOwned::Owned(value)
}
}
impl<'a, B: BlobReaderTrait> From<&'a mut B> for BlobRefOrOwned<'a, B> {
fn from(value: &'a mut B) -> Self {
BlobRefOrOwned::Ref(value)
}
}
/// BlobSelector decides which blobs to process in a current slot.
pub trait BlobSelector<Da: DaSpec> {
/// Context type
type Context: Context;
/// It takes two arguments.
/// 1. `current_blobs` - blobs that were received from the network for the current slot.
/// 2. `working_set` - the working to access storage.
/// It returns a vector containing a mix of borrowed and owned blobs.
fn get_blobs_for_this_slot<'a, I>(
&self,
current_blobs: I,
working_set: &mut WorkingSet<<Self::Context as Spec>::Storage>,
) -> anyhow::Result<Vec<BlobRefOrOwned<'a, Da::BlobTransaction>>>
where
I: IntoIterator<Item = &'a mut Da::BlobTransaction>;
}