Skip to main content

AnyHeader

Struct AnyHeader 

Source
pub struct AnyHeader {
    pub version: Version,
    pub verifying_key: VerifyingKey,
    pub signature: Signature,
    pub payload_size: PayloadSize,
    pub payload_hash: Option<Hash>,
    pub seq_num: SeqNum,
    pub backlink: Option<Hash>,
    /* private fields */
}
Expand description

Header of a p2panda operation.

The header holds all metadata required to cryptographically secure and authenticate a message Body and it’s custom extensions.

§Extensions

AnyHeader does not know the concrete extensions type. On this level it is only concerned with the validity and integrity of the append-only log type itself which is enough for most low-level protocols, such as the sync protocol.

Applications usually want to attach custom extensions to the header, if you need to know the type you can easily convert from AnyHeader to Header with an explicit E extensions type.

use p2panda_core::{AnyHeader, Hash, Header, SigningKey};
use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
struct MyExtensions {
    dependencies: Vec<Hash>,
}

let signing_key = SigningKey::generate();

// Create a Header with concrete extension type `MyExtensions`.
let header = Header::builder()
    .build(&signing_key, MyExtensions {
        dependencies: vec![Hash::from([0; 32])],
    });

// Encode it to CBOR bytes, this is how we transmit operations over the network.
let bytes = header.encode();

// Convert it to `AnyHeader` which doesn't know the extensions type.
let any_header = AnyHeader::decode(&bytes)?;

// Bring it back to a concrete Header type with `MyExtensions`.
let header_again = Header::try_from(any_header)?;
assert_eq!(header, header_again);

Please note that at this stage we can only verify the integrity and authenticity of the attached extensions, we don’t know if the extensions themselves are valid. We can only find out if this is correct if we know the concrete E type.

Fields§

§version: Version

Operation format version, allowing backwards compatibility when specification changes.

§verifying_key: VerifyingKey

Author of this operation.

§signature: Signature

Signature by author over all fields in header, providing authenticity.

§payload_size: PayloadSize

Number of bytes of the body of this operation, must be zero if no body is given.

§payload_hash: Option<Hash>

Hash of the body of this operation, must be included if payload_size is non-zero and omitted otherwise.

Keeping the hash here allows us to delete the payload (off-chain data) while retaining the ability to check the signature of the header.

§seq_num: SeqNum

Number of operations this author has published to this log, begins with 0 and is always incremented by 1 with each new operation by the same author.

§backlink: Option<Hash>

Hash of the previous operation of the same author and log. Can be omitted if first operation in log.

Implementations§

Source§

impl AnyHeader

Source

pub fn decode(bytes: &[u8]) -> Result<Self, HeaderError>

Attempts decoding header from bytes.

This fails if integrity checks failed or header formatting is invalid.

Source

pub fn encode(&self) -> Vec<u8>

Encodes header to byte-representation (CBOR).

Source

pub fn hash(&self) -> Hash

BLAKE3 hash of the header bytes.

This hash is used as the unique identifier of an operation, aka the Operation Id.

Source

pub fn size(&self) -> u32

Size of header when encoded as CBOR bytes.

Trait Implementations§

Source§

impl Chain<Hash> for AnyHeader

Pointer at previous entry in log which gives us the integrity guarantee of the “hash chain”. The first entry in a log returns None.
Source§

fn seq_num(&self) -> SeqNum

Sequence numbers are helpful to fastly detect forks and use the much faster and optimized diffing strategy when the local log is not forked.
Source§

impl Clone for AnyHeader

Source§

fn clone(&self) -> AnyHeader

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AnyHeader

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Digest<Hash> for AnyHeader

Source§

fn hash(&self) -> Hash

Hash digest of peer-to-peer data-type which can be used as the identifier.
Source§

impl Eq for AnyHeader

Source§

impl Offchain<Hash> for AnyHeader

Source§

fn payload(&self) -> Option<&Body>

Authenticated payload. Read more
Source§

fn payload_hash(&self) -> Option<Hash>

Hash digest of the payload.
Source§

fn payload_size(&self) -> PayloadSize

Size in bytes of the payload.
Source§

impl PartialEq for AnyHeader

Source§

fn eq(&self, other: &AnyHeader) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl Provenance<VerifyingKey> for AnyHeader

Source§

fn author(&self) -> VerifyingKey

Identity of the author of data-type.
Source§

fn verify(&self) -> bool

Checks if data-type and given author is authentic.
Source§

impl StructuralPartialEq for AnyHeader

Source§

impl TryFrom<&[u8]> for AnyHeader

Source§

type Error = HeaderError

The type returned in the event of a conversion error.
Source§

fn try_from(value: &[u8]) -> Result<Self, Self::Error>

Performs the conversion.
Source§

impl<E> TryFrom<AnyHeader> for Header<E>
where E: Extensions,

Source§

type Error = HeaderError

The type returned in the event of a conversion error.
Source§

fn try_from(value: AnyHeader) -> Result<Self, Self::Error>

Performs the conversion.
Source§

impl<E> TryFrom<Header<E>> for AnyHeader
where E: Extensions,

Source§

type Error = HeaderError

The type returned in the event of a conversion error.
Source§

fn try_from(value: Header<E>) -> Result<Self, Self::Error>

Performs the conversion.
Source§

impl TryFrom<Vec<u8>> for AnyHeader

Source§

type Error = HeaderError

The type returned in the event of a conversion error.
Source§

fn try_from(value: Vec<u8>) -> Result<Self, Self::Error>

Performs the conversion.

Auto Trait Implementations§

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<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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

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

Source§

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