Struct forest_filecoin::state_manager::StateManager

source ·
pub struct StateManager<DB> {
    cs: Arc<ChainStore<DB>>,
    cache: TipsetStateCache,
    beacon: Arc<BeaconSchedule>,
    chain_config: Arc<ChainConfig>,
    sync_config: Arc<SyncConfig>,
    engine: MultiEngine,
}
Expand description

State manager handles all interactions with the internal Filecoin actors state. This encapsulates the ChainStore functionality, which only handles chain data, to allow for interactions with the underlying state of the chain. The state manager not only allows interfacing with state, but also is used when performing state transitions.

Fields§

§cs: Arc<ChainStore<DB>>§cache: TipsetStateCache

This is a cache which indexes tipsets to their calculated state.

§beacon: Arc<BeaconSchedule>§chain_config: Arc<ChainConfig>§sync_config: Arc<SyncConfig>§engine: MultiEngine

Implementations§

source§

impl<DB> StateManager<DB>
where DB: Blockstore,

source

pub fn get_sectors_for_winning_post( &self, st: &Cid, nv: NetworkVersion, miner_address: &Address, rand: Randomness, ) -> Result<Vec<ExtendedSectorInfo>, Error>

Retrieves and generates a vector of sector info for the winning PoSt verification.

source§

impl<DB> StateManager<DB>
where DB: Blockstore,

source

pub fn new( cs: Arc<ChainStore<DB>>, chain_config: Arc<ChainConfig>, sync_config: Arc<SyncConfig>, ) -> Result<Self, Error>

source

pub fn beacon_schedule(&self) -> &Arc<BeaconSchedule>

source

pub fn get_network_version(&self, epoch: i64) -> NetworkVersion

Returns network version for the given epoch.

source

pub fn chain_config(&self) -> &Arc<ChainConfig>

source

pub fn sync_config(&self) -> &Arc<SyncConfig>

source

pub fn get_state_tree(&self, state_cid: &Cid) -> Result<StateTree<DB>>

Gets the state tree

source

pub fn get_actor( &self, addr: &Address, state_cid: Cid, ) -> Result<Option<ActorState>>

Gets actor from given Cid, if it exists.

source

pub fn get_actor_state<S: LoadActorStateFromBlockstore>( &self, ts: &Tipset, ) -> Result<S>

Gets actor state from implicit actor address

source

pub fn get_actor_state_from_address<S: LoadActorStateFromBlockstore>( &self, ts: &Tipset, actor_address: &Address, ) -> Result<S>

Gets actor state from explicit actor address

source

pub fn get_required_actor( &self, addr: &Address, state_cid: Cid, ) -> Result<ActorState>

Gets required actor from given Cid.

source

pub fn blockstore(&self) -> &DB

Returns a reference to the state manager’s Blockstore.

source

pub fn blockstore_owned(&self) -> Arc<DB>

source

pub fn chain_store(&self) -> &Arc<ChainStore<DB>>

Returns reference to the state manager’s ChainStore.

source

pub fn chain_rand(&self, tipset: Arc<Tipset>) -> ChainRand<DB>

source

pub fn get_network_name(&self, st: &Cid) -> Result<String, Error>

Returns the internal, protocol-level network name.

source

pub fn is_miner_slashed( &self, addr: &Address, state_cid: &Cid, ) -> Result<bool, Error>

Returns true if miner has been slashed or is considered invalid.

source

pub fn get_miner_work_addr( &self, state_cid: Cid, addr: &Address, ) -> Result<Address, Error>

Returns raw work address of a miner given the state root.

source

pub fn get_power( &self, state_cid: &Cid, addr: Option<&Address>, ) -> Result<Option<(Claim, Claim)>, Error>

Returns specified actor’s claimed power and total network power as a tuple.

source

pub fn get_all_sectors( self: &Arc<Self>, addr: &Address, ts: &Tipset, ) -> Result<Vec<SectorOnChainInfo>>

source§

impl<DB> StateManager<DB>
where DB: Blockstore + Send + Sync + 'static,

source

pub async fn tipset_state( self: &Arc<Self>, tipset: &Arc<Tipset>, ) -> Result<(Cid, Cid)>

Returns the pair of (parent state root, message receipt root). This will either be cached or will be calculated and fill the cache. Tipset state for a given tipset is guaranteed not to be computed twice.

source

fn call_raw( self: &Arc<Self>, msg: &Message, rand: ChainRand<DB>, tipset: &Arc<Tipset>, ) -> Result<ApiInvocResult, Error>

source

pub fn call( self: &Arc<Self>, message: &Message, tipset: Option<Arc<Tipset>>, ) -> Result<ApiInvocResult, Error>

runs the given message and returns its result without any persisted changes.

source

pub async fn call_with_gas( self: &Arc<Self>, message: &mut ChainMessage, prior_messages: &[ChainMessage], tipset: Option<Arc<Tipset>>, trace_config: VMTrace, ) -> Result<(InvocResult, ApplyRet), Error>

Computes message on the given Tipset state, after applying other messages and returns the values computed in the VM.

source

pub async fn replay( self: &Arc<Self>, ts: Arc<Tipset>, mcid: Cid, ) -> Result<ApiInvocResult, Error>

Replays the given message and returns the result of executing the indicated message, assuming it was executed in the indicated tipset.

source

pub fn replay_blocking( self: &Arc<Self>, ts: Arc<Tipset>, mcid: Cid, ) -> Result<ApiInvocResult, Error>

Blocking version of replay

source

pub fn eligible_to_mine( &self, address: &Address, base_tipset: &Tipset, lookback_tipset: &Tipset, ) -> Result<bool, Error>

Checks the eligibility of the miner. This is used in the validation that a block’s miner has the requirements to mine a block.

source

pub async fn compute_tipset_state( self: &Arc<Self>, tipset: Arc<Tipset>, callback: Option<impl FnMut(MessageCallbackCtx<'_>) -> Result<()> + Send + 'static>, enable_tracing: VMTrace, ) -> Result<(Cid, Cid), Error>

Conceptually, a Tipset consists of blocks which share an epoch. Each block contains messages, which are executed by the Filecoin Virtual Machine.

VM message execution essentially looks like this:

state[N-900..N] * message = state[N+1]

The states above are stored in the IPLD Blockstore, and can be referred to by a Cid - the state root. The previous 900 states (configurable, see https://docs.filecoin.io/reference/general/glossary/#finality) can be queried when executing a message, so a store needs at least that many. (a snapshot typically contains 2000, for example).

Each message costs FIL to execute - this is gas. After execution, the message has a receipt, showing how much gas was spent. This is similarly a Cid into the block store.

For details, see the documentation for apply_block_messages.

source

pub fn compute_tipset_state_blocking( &self, tipset: Arc<Tipset>, callback: Option<impl FnMut(MessageCallbackCtx<'_>) -> Result<()>>, enable_tracing: VMTrace, ) -> Result<(Cid, Cid), Error>

Blocking version of compute_tipset_state

source

fn tipset_executed_message( &self, tipset: &Tipset, message: &ChainMessage, allow_replaced: bool, ) -> Result<Option<Receipt>, Error>

Check if tipset had executed the message, by loading the receipt based on the index of the message in the block.

source

fn search_back_for_message( &self, current: Arc<Tipset>, message: &ChainMessage, look_back_limit: Option<i64>, allow_replaced: Option<bool>, ) -> Result<Option<(Arc<Tipset>, Receipt)>, Error>

source

pub fn get_receipt( &self, tipset: Arc<Tipset>, msg: Cid, ) -> Result<Receipt, Error>

Returns a message receipt from a given tipset and message CID.

source

pub async fn wait_for_message( self: &Arc<Self>, msg_cid: Cid, confidence: i64, look_back_limit: Option<i64>, allow_replaced: Option<bool>, ) -> Result<(Option<Arc<Tipset>>, Option<Receipt>), Error>

WaitForMessage blocks until a message appears on chain. It looks backwards in the chain to see if this has already happened. It guarantees that the message has been on chain for at least confidence epochs without being reverted before returning.

source

pub async fn search_for_message( self: &Arc<Self>, from: Option<Arc<Tipset>>, msg_cid: Cid, look_back_limit: Option<i64>, allow_replaced: Option<bool>, ) -> Result<Option<(Arc<Tipset>, Receipt)>, Error>

source

pub fn get_bls_public_key( db: &Arc<DB>, addr: &Address, state_cid: Cid, ) -> Result<BlsPublicKey, Error>

Returns a BLS public key from provided address

source

pub fn lookup_id( &self, addr: &Address, ts: &Tipset, ) -> Result<Option<Address>, Error>

Looks up ID Address from the state at the given Tipset.

source

pub fn lookup_required_id( &self, addr: &Address, ts: &Tipset, ) -> Result<Address, Error>

Looks up required ID Address from the state at the given Tipset.

source

pub fn market_state(&self, ts: &Tipset) -> Result<State, Error>

Retrieves market state

source

pub fn market_balance( &self, addr: &Address, ts: &Tipset, ) -> Result<MarketBalance, Error>

Retrieves market balance in escrow and locked tables.

source

pub fn miner_info( &self, addr: &Address, ts: &Tipset, ) -> Result<MinerInfo, Error>

Retrieves miner info.

source

pub fn miner_faults( &self, addr: &Address, ts: &Tipset, ) -> Result<BitField, Error>

Retrieves miner faults.

source

pub fn miner_recoveries( &self, addr: &Address, ts: &Tipset, ) -> Result<BitField, Error>

Retrieves miner recoveries.

source

fn all_partition_sectors( &self, addr: &Address, ts: &Tipset, get_sector: impl Fn(Partition<'_>) -> BitField, ) -> Result<BitField, Error>

source

pub fn miner_power( &self, addr: &Address, ts: &Tipset, ) -> Result<MinerPower, Error>

Retrieves miner power.

source

pub async fn resolve_to_key_addr( self: &Arc<Self>, addr: &Address, ts: &Arc<Tipset>, ) -> Result<Address, Error>

Similar to resolve_to_key_addr in the forest_vm crate::state_manager but does not allow Actor type of addresses. Uses ts to generate the VM state.

source

pub async fn miner_get_base_info( self: &Arc<Self>, beacon_schedule: &BeaconSchedule, tipset: Arc<Tipset>, addr: Address, epoch: i64, ) -> Result<Option<MiningBaseInfo>>

source

pub fn miner_has_min_power( &self, policy: &Policy, addr: &Address, ts: &Tipset, ) -> Result<bool>

Checks power actor state for if miner meets consensus minimum requirements.

source

pub fn validate_range( self: &Arc<Self>, epochs: RangeInclusive<i64>, ) -> Result<()>

Validates all tipsets at epoch start..=end behind the heaviest tipset.

This spawns rayon::current_num_threads threads to do the compute-heavy work of tipset validation.

§What is validation?

Every state transition returns a new state root, which is typically retained in, e.g., snapshots. For “full” snapshots, all state roots are retained. For standard snapshots, the last 2000 or so state roots are retained.

receipts meanwhile, are typically ephemeral, but each tipset knows the receipt root (hash) of the previous tipset.

This function takes advantage of that fact to validate tipsets:

  • tipset[N] claims that receipt_root[N-1] should be 0xDEADBEEF
  • find tipset[N-1], and perform its state transition to get the actual receipt_root
  • assert that they match

See Self::compute_tipset_state_blocking for an explanation of state transitions.

§Known issues

This function is blocking, but we do observe threads waiting and synchronizing. This is suspected to be due something in the VM or its WASM runtime.

source

pub fn validate_tipsets<T>(self: &Arc<Self>, tipsets: T) -> Result<()>
where T: Iterator<Item = Arc<Tipset>> + Send,

source

pub fn get_verified_registry_actor_state(&self, ts: &Tipset) -> Result<State>

source

pub fn get_claim( &self, addr: &Address, ts: &Tipset, claim_id: ClaimID, ) -> Result<Option<Claim>>

source

pub fn get_all_claims(&self, ts: &Tipset) -> Result<HashMap<ClaimID, Claim>>

source

pub fn get_allocation( &self, addr: &Address, ts: &Tipset, allocation_id: AllocationID, ) -> Result<Option<Allocation>>

source

pub fn get_all_allocations( &self, ts: &Tipset, ) -> Result<HashMap<AllocationID, Allocation>>

source

pub fn verified_client_status( &self, addr: &Address, ts: &Tipset, ) -> Result<Option<DataCap>>

source

pub async fn resolve_to_deterministic_address( self: &Arc<Self>, address: Address, ts: Arc<Tipset>, ) -> Result<Address>

Auto Trait Implementations§

§

impl<DB> !Freeze for StateManager<DB>

§

impl<DB> !RefUnwindSafe for StateManager<DB>

§

impl<DB> Send for StateManager<DB>
where DB: Sync + Send,

§

impl<DB> Sync for StateManager<DB>
where DB: Sync + Send,

§

impl<DB> Unpin for StateManager<DB>

§

impl<DB> !UnwindSafe for StateManager<DB>

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<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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<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> IntoRequest<T> for T

source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
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> Pointable for T

source§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> References<RawCodec> for T

source§

fn references<R, E>(_c: RawCodec, _r: &mut R, _set: &mut E) -> Result<(), Error>
where R: Read, E: Extend<Cid<64>>,

Scrape the references from an impl Read. Read more
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
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>,

§

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>,

§

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
source§

impl<T> MaybeSend for T
where T: Send,