pub struct Extra(pub(crate) Vec<ExtraField>);Expand description
The result of decoding a transaction’s extra field.
Note that the Monero protocol defines a transaction’s extra field as a byte vector. This is a
parsed view of such a byte vector, yet the Monero protocol does not require the extra field
be parseable. The parsing is also lossy in that
Extra::read(&mut buf.as_slice()).serialize() == buf is not guaranteed to hold true.
Tuple Fields§
§0: Vec<ExtraField>Implementations§
Source§impl Extra
impl Extra
Sourcepub fn keys(&self) -> Option<(Vec<Point>, Option<Vec<Point>>)>
pub fn keys(&self) -> Option<(Vec<Point>, Option<Vec<Point>>)>
The keys within this extra.
This returns all keys specified with PublicKey and the first set of keys specified with
PublicKeys. If any are improperly encoded, identity will be yielded in place, intending to
cause an ECDH of the identity point, as Monero uses upon improperly-encoded points.
Sourcepub fn payment_id(&self) -> Option<PaymentId>
pub fn payment_id(&self) -> Option<PaymentId>
The payment ID embedded within this extra.
Sourcepub fn arbitrary_data(&self) -> Vec<Vec<u8>>
pub fn arbitrary_data(&self) -> Vec<Vec<u8>>
The arbitrary data within this extra.
This looks for all instances of ExtraField::Nonce with a marker byte of 0b0111_1111. This
is the largest possible value not interpretable as a VarInt, ensuring it’s able to be
interpreted as a VarInt without issue, and that it’s the most unlikely value to be used by
the Monero wallet protocol itself (which itself has assigned marker bytes incrementally). As
Monero itself does not support including arbitrary data with its wallet however, this was
first introduced by monero-wallet (under the monero-oxide project) and may be bespoke to
the ecosystem of monero-oxide and dependents of it.
The data is stored without any padding or encryption applied. Applications MUST consider this themselves. As Monero does not reserve any space for arbitrary data, the inclusion of any arbitrary data will always be a fingerprint even before considering what the data is. Applications SHOULD include arbitrary data indistinguishable from random, of a popular length (such as padded to the next power of two or the maximum length per chunk) IF arbitrary data is included at all.
For applications where indistinguishability from ‘regular’ Monero transactions is required,
steganography should be considered. Steganography is somewhat-frowned upon however due to it
bloating the Monero blockchain however and efficient methods are likely specific to
individual hard forks. They may also have their own privacy implications, which is why no
methods of stegnography are supported outright by monero-wallet.
pub(crate) fn new( key: CompressedPoint, additional: Vec<CompressedPoint>, ) -> Extra
pub(crate) fn push_nonce(&mut self, nonce: Vec<u8>)
Sourcepub fn write<W: Write>(&self, w: &mut W) -> Result<()>
pub fn write<W: Write>(&self, w: &mut W) -> Result<()>
Write the Extra.
This will write the value in a sorted fashion.
This is not of deterministic length nor length-prefixed. It should only be written to a buffer which will be delimited.
Trait Implementations§
impl StructuralPartialEq for Extra
Auto Trait Implementations§
impl Freeze for Extra
impl RefUnwindSafe for Extra
impl Send for Extra
impl Sync for Extra
impl Unpin for Extra
impl UnwindSafe for Extra
Blanket Implementations§
Source§impl<T> AssertZeroize for T
impl<T> AssertZeroize for T
fn zeroize_or_on_drop(&mut self)
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<A, B> IsEqualPrivate<B, Equal> for A
impl<A, B> IsEqualPrivate<B, Equal> for A
Source§impl<A, B> IsEqualPrivate<B, Greater> for A
impl<A, B> IsEqualPrivate<B, Greater> for A
Source§impl<A, B> IsEqualPrivate<B, Less> for A
impl<A, B> IsEqualPrivate<B, Less> for A
Source§impl<A, B> IsGreaterOrEqualPrivate<B, Equal> for A
impl<A, B> IsGreaterOrEqualPrivate<B, Equal> for A
Source§impl<A, B> IsGreaterOrEqualPrivate<B, Greater> for A
impl<A, B> IsGreaterOrEqualPrivate<B, Greater> for A
Source§impl<A, B> IsGreaterOrEqualPrivate<B, Less> for A
impl<A, B> IsGreaterOrEqualPrivate<B, Less> for A
Source§impl<A, B> IsGreaterPrivate<B, Equal> for A
impl<A, B> IsGreaterPrivate<B, Equal> for A
Source§impl<A, B> IsGreaterPrivate<B, Greater> for A
impl<A, B> IsGreaterPrivate<B, Greater> for A
Source§impl<A, B> IsGreaterPrivate<B, Less> for A
impl<A, B> IsGreaterPrivate<B, Less> for A
Source§impl<A, B> IsLessOrEqualPrivate<B, Equal> for A
impl<A, B> IsLessOrEqualPrivate<B, Equal> for A
Source§impl<A, B> IsLessOrEqualPrivate<B, Greater> for A
impl<A, B> IsLessOrEqualPrivate<B, Greater> for A
Source§impl<A, B> IsLessOrEqualPrivate<B, Less> for A
impl<A, B> IsLessOrEqualPrivate<B, Less> for A
Source§impl<A, B> IsLessPrivate<B, Equal> for A
impl<A, B> IsLessPrivate<B, Equal> for A
Source§impl<A, B> IsLessPrivate<B, Greater> for A
impl<A, B> IsLessPrivate<B, Greater> for A
Source§impl<A, B> IsLessPrivate<B, Less> for A
impl<A, B> IsLessPrivate<B, Less> for A
Source§impl<A, B> IsNotEqualPrivate<B, Equal> for A
impl<A, B> IsNotEqualPrivate<B, Equal> for A
Source§impl<A, B> IsNotEqualPrivate<B, Greater> for A
impl<A, B> IsNotEqualPrivate<B, Greater> for A
Source§impl<A, B> IsNotEqualPrivate<B, Less> for A
impl<A, B> IsNotEqualPrivate<B, Less> for A
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> SizedTypeProperties for T
impl<T> SizedTypeProperties for T
Source§#[doc(hidden)] const SIZE: usize = _
#[doc(hidden)] const SIZE: usize = _
sized_type_properties)Source§#[doc(hidden)] const ALIGN: usize = _
#[doc(hidden)] const ALIGN: usize = _
sized_type_properties)Source§#[doc(hidden)] const IS_ZST: bool = _
#[doc(hidden)] const IS_ZST: bool = _
sized_type_properties)Source§#[doc(hidden)] const LAYOUT: Layout = _
#[doc(hidden)] const LAYOUT: Layout = _
sized_type_properties)Source§#[doc(hidden)] const MAX_SLICE_LEN: usize = _
#[doc(hidden)] const MAX_SLICE_LEN: usize = _
sized_type_properties)[Self]. Read moreSource§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.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
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.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
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.