Closed
Description
Goal
Allow contracts to inspect the state of other contracts when deciding whether to validate their state or update it in response to a delta.
Approach
This approach treats update_state()
like a consumer of UpdateData
events, which can contain the state or delta for the current contract or related contracts as specified. The function may return when the state has been updated or request additional related contracts.
fn validate_state(
_parameters: Parameters<'static>,
state: State<'static>,
related: Map<ContractInstanceId, Option<State<'static>>>,
) -> ValidateResult
pub enum ValidateResult {
Valid,
Invalid,
/// The peer will attempt to retrieve the requested contract states
/// and will call validate_state() again when it retrieves them.
RequestRelated(Vec<ContractInstanceId>),
}
// Delta validation is a simple spam prevention mechanism, supporting
// related contracts for this would be overkill
fn validate_delta(
_parameters: Parameters<'static>,
state: Delta<'static>,
) -> bool
/// Called every time one or more UpdateDatas are received,
/// can update state and/or volatile memory in response
fn update_state(
data: Vec<UpdateData>,
parameters: Parameters<'static>,
state: State<'static>,
) -> UpdateResult
pub enum UpdateData {
State(Vec<u8>),
Delta(Vec<u8>),
StateAndDelta { state : UpdateData::State, delta : UpdateData::Delta },
RelatedState { relatedTo: ContractInstanceId, state : UpdateData::State },
RelatedDelta { relatedTo : ContractInstanceId, delta : UpdateData::Delta },
RelatedStateAndDelta {
relatedTo : ContractInstanceId,
state : UpdateData::State,
delta : UpdateData::Delta,
},
}
pub struct UpdateResult {
new_state : Option<State<'static>>,
related : Vec<Related>,
}
pub struct Related {
contract_instance_id : ContractInstanceId,
mode : RelatedMode,
}
pub enum RelatedMode {
/// Retrieve the state once, not concerned with
/// subsequent changes
StateOnce,
/// Retrieve the state once, and then supply
/// deltas from then on. More efficient.
StateOnceThenDeltas,
/// Retrieve the state and then provide new states
/// every time it updates.
StateEvery,
StateThenStateAndDeltas,
}