pub struct FrameAttestation {
pub frame: FrameId,
pub attestation: Option<ProvenanceAttestation>,
pub inclusion_proof: Option<InclusionProof>,
}Expand description
What a result set says about one frame’s attestation — the wire carrier that
keeps a ProvenanceAttestation beside the frame it covers
(SPEC.md §6.5.5, F11).
§Why the identity is echoed in full
A parallel array indexed by position would be smaller and unusable as
evidence: a provider that reorders, omits, or duplicates a frame would shift
an attestation onto the wrong one, and a host filtering the set — which is
the normal case — would have to re-derive the mapping from an order nobody
wrote down. Carrying the whole
FrameId triple makes an entry self-describing, which is the same
reasoning FrameVerdict already applies to
context/verify. It is also exactly what a verifier needs: provider_id
and content_digest are two of the three inputs to
frame_commitment, and neither is recoverable from the frame body alone.
§Why both members are optional
The cheapest honest way to sign an answer is one signature over the
result-set Merkle root, with a per-frame inclusion proof and no per-frame
signature at all. Requiring attestation would make that shape
unrepresentable and force a provider into n signatures to say what one
says. Requiring inclusion_proof would tax a provider that signs frames
individually and publishes no root. An entry carrying neither is noise, and
carries_evidence is how a host says so.
Fields§
§frame: FrameIdThe frame this entry attests, named in full rather than by position.
attestation: Option<ProvenanceAttestation>A detached signature over this frame’s own frame_commitment.
Absent when the provider signed only the result-set root: the frame is
then attested through inclusion_proof, not on its own.
inclusion_proof: Option<InclusionProof>A proof that this frame’s commitment is a leaf of the signed
result_attestation root (SPEC.md §6.5.3).
Optional on the wire, and the reason is a host that keeps a subset: once frames are dropped their sibling commitments are gone, and the root can never be recomputed again. See ADR 0014.
Implementations§
Source§impl FrameAttestation
impl FrameAttestation
Sourcepub fn signed(frame: FrameId, attestation: ProvenanceAttestation) -> Self
pub fn signed(frame: FrameId, attestation: ProvenanceAttestation) -> Self
A per-frame signature with no inclusion proof.
Sourcepub fn proven(frame: FrameId, inclusion_proof: InclusionProof) -> Self
pub fn proven(frame: FrameId, inclusion_proof: InclusionProof) -> Self
Membership of a signed result set, with no per-frame signature.
Sourcepub fn carries_evidence(&self) -> bool
pub fn carries_evidence(&self) -> bool
Whether this entry carries anything a verifier can act on.
An entry with neither a signature nor a proof names a frame and asserts nothing about it. A host MUST NOT read that as attested — it is wire noise, and F9’s “unverifiable degrades to unattested” covers it.
Sourcepub fn with_inclusion_proof(self, proof: InclusionProof) -> Self
pub fn with_inclusion_proof(self, proof: InclusionProof) -> Self
Attach an inclusion proof, so a per-frame signature and result-set membership travel together.
Trait Implementations§
Source§impl Clone for FrameAttestation
impl Clone for FrameAttestation
Source§fn clone(&self) -> FrameAttestation
fn clone(&self) -> FrameAttestation
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more