Skip to main content

Resolver

Trait Resolver 

Source
pub trait Resolver {
    // Required methods
    fn descriptor(&self, fn_hash: &str) -> Option<Cow<'_, [u8]>>;
    fn receipt(&self, hash: &str) -> Option<Cow<'_, [u8]>>;
    fn evaluate(&self, cell: &Cell, asof: &str) -> Option<Scalar>;

    // Provided methods
    fn manifest(&self, entry: &str) -> Option<Cow<'_, [u8]>> { ... }
    fn evaluation(&self, cell: &Cell, asof: &str) -> Option<Evaluation> { ... }
}
Expand description

What step 7 of SPEC 10.1 obtains: the descriptor, the input receipts (slice members included), the manifests of slice entries, and the evaluation. This crate evaluates no functions and fetches nothing; the caller supplies a resolver, and verify asks it only for what step 7 reaches for the receipt at hand:

  • descriptor once, for cell.fn_hash (7.1);
  • for each entry of inputs, in order, stopping at the first that fails (7.5): receipt once for a receipt hash; for a slice entry slice:<slice id>:<members hash> (spec-0.4.0), manifest once, then receipt once per member, in the manifest’s order;
  • evaluation once, only after 7.1-7.5 pass (7.6);
  • when the value differs and the evaluation came with a lineage, receipt for the lineage’s receipt hashes that inputs does not list, in lineage order, until one shows a replaced input (E_INPUT_SUPERSEDED, 7.6).

Nothing is asked when steps 1-6 fail, and nothing about receipts below the inputs. The descriptor, receipts and manifests are JSON text, so that 7.1 hashes the descriptor before checking it and 7.5 reports an unparseable input as E_INPUT_INVALID, as the specification orders.

manifest and evaluation are provided (0.3.4): a resolver written for 0.3.3 offers no manifests (a slice entry is E_INPUT_UNAVAILABLE) and evaluates through evaluate, with no lineage.

Required Methods§

Source

fn descriptor(&self, fn_hash: &str) -> Option<Cow<'_, [u8]>>

The descriptor JSON text offered for fn_hash, or None if unavailable (E_FN_UNAVAILABLE). Only None is unavailability: the text is parsed strictly (unparseable text reports its parse code), and any other JSON value, null included, is a descriptor offered that fails the hash check (E_FN_HASH_MISMATCH, SPEC 10.1 step 7.1).

Source

fn receipt(&self, hash: &str) -> Option<Cow<'_, [u8]>>

The receipt JSON text offered for receipt hash hash, or None if unavailable (E_INPUT_UNAVAILABLE).

Source

fn evaluate(&self, cell: &Cell, asof: &str) -> Option<Scalar>

The value of evaluating cell as of asof (for stored: the value looked up as of it, SPEC 10.1 step 7.6), or None if this resolver cannot evaluate it: no runtime for the language, a budget exceeded, inputs the evaluator cannot obtain (E_EVAL_UNAVAILABLE, see VerifyResult). asof is the receipt’s asof.

Provided Methods§

Source

fn manifest(&self, entry: &str) -> Option<Cow<'_, [u8]>>

The manifest JSON text offered for slice entry entry (slice:<slice id>:<members hash>), or None if unavailable (E_INPUT_UNAVAILABLE). The text is parsed strictly and checked as a Manifest; one that does not hash to the entry is E_INPUT_UNAVAILABLE, as a receipt with another hash. Provided: None.

Source

fn evaluation(&self, cell: &Cell, asof: &str) -> Option<Evaluation>

Evaluates cell as of asof, with the evaluation’s lineage when the resolver has it: the inputs entries the evaluation read (10.1 step 7.6). verify calls this once, in place of evaluate. When the value differs from the receipt’s, a lineage that replaces one of the receipt’s inputs by a later version of the same cell (whose receipt it offers through receipt), or one of its slice entries by an item beginning slice:<the same slice id>:, makes the result E_INPUT_SUPERSEDED instead of E_VALUE_MISMATCH. Provided: evaluate’s value, with no lineage.

Dyn Compatibility§

This trait is dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§