pub struct ROInput { /* private fields */ }
Expand description
Random oracle input structure
The random oracle input encapsulates the serialization format and methods using during hashing.
When implementing the Hashable
trait to enable hashing for a type, you
must implement its to_roinput()
serialization method using the ROInput
functions below.
The random oracle input structure is used (by generic code) to serialize the
object into both a vector of pasta::Fp
field elements and into a vector of
bytes, depending on the situation.
Here is an example of how ROInput
is used during the definition of the
Hashable
trait.
use mina_hasher::{Hashable, ROInput};
use mina_curves::pasta::Fp;
#[derive(Clone)]
pub struct MyExample {
pub x: Fp,
pub y: Fp,
pub nonce: u64,
}
impl Hashable for MyExample {
type D = ();
fn to_roinput(&self) -> ROInput {
ROInput::new()
.append_field(self.x)
.append_field(self.y)
.append_u64(self.nonce)
}
fn domain_string(_: Self::D) -> Option<String> {
format!("MyExampleMainnet").into()
}
}
Details: For technical reasons related to our proof system and performance, non-field-element members are serialized for signing differently than other types. Additionally, during signing all members of the random oracle input get serialized together in two different ways: both as bytes and as a vector of field elements. The random oracle input automates and encapsulates this complexity.
Implementations§
Source§impl ROInput
impl ROInput
Sourcepub fn append_hashable(self, input: &impl Hashable) -> Self
pub fn append_hashable(self, input: &impl Hashable) -> Self
Append a Hashable
input
Sourcepub fn append_roinput(self, roi: ROInput) -> Self
pub fn append_roinput(self, roi: ROInput) -> Self
Append another random oracle input
Sourcepub fn append_field(self, f: Fp) -> Self
pub fn append_field(self, f: Fp) -> Self
Append a base field element
Sourcepub fn append_scalar(self, s: Fq) -> Self
pub fn append_scalar(self, s: Fq) -> Self
Append a scalar field element by converting it to bits.
This method converts the scalar field element to its byte representation,
then extracts exactly [Fq::MODULUS_BIT_SIZE
] bits (255 bits for Pallas curve)
in little-endian bit order and appends them to the bits vector.
§Bit Representation
- Uses little-endian bit ordering within bytes (LSB first)
- Extracts exactly 255 bits from the 32-byte scalar representation
- The scalar field modulus is 255 bits, so the MSB of the 32nd byte is unused
§Differences from Self::append_field
Self::append_scalar
: Converts scalar to 255 bits and adds to thebits
vectorSelf::append_field
: Adds base field element directly to thefields
vector
§Examples
use mina_hasher::ROInput;
use mina_curves::pasta::Fq;
// Regular scalar value
let scalar = Fq::from(42u64);
let roi = ROInput::new().append_scalar(scalar);
let bytes = roi.to_bytes();
assert_eq!(bytes.len(), 32); // 255 bits rounded up to 32 bytes
// Maximum scalar value (modulus - 1)
let max_scalar = Fq::from(0u64) - Fq::from(1u64);
let roi = ROInput::new().append_scalar(max_scalar);
let bytes = roi.to_bytes();
assert_eq!(bytes.len(), 32); // 255 bits rounded up to 32 bytes
§Note
All scalar field values, including the maximum value (modulus - 1), will fit exactly in 255 bits and can be safely appended.
Sourcepub fn append_bool(self, b: bool) -> Self
pub fn append_bool(self, b: bool) -> Self
Append a single bit
Sourcepub fn append_bytes(self, bytes: &[u8]) -> Self
pub fn append_bytes(self, bytes: &[u8]) -> Self
Append bytes
Sourcepub fn append_u32(self, x: u32) -> Self
pub fn append_u32(self, x: u32) -> Self
Append a 32-bit unsigned integer
Sourcepub fn append_u64(self, x: u64) -> Self
pub fn append_u64(self, x: u64) -> Self
Append a 64-bit unsigned integer
Sourcepub fn to_fields(&self) -> Vec<Fp> ⓘ
pub fn to_fields(&self) -> Vec<Fp> ⓘ
Convert the random oracle input to a vector of packed field elements
by packing the bits into field elements and appending them to the fields.
The bits are packed by taking chunks of size Fp::MODULUS_BIT_SIZE - 1
.
Sourcepub fn deserialize(input: &[u8]) -> Result<Self, Error>
pub fn deserialize(input: &[u8]) -> Result<Self, Error>
Deserialize a ROInput
from bytes
Trait Implementations§
impl Eq for ROInput
impl StructuralPartialEq for ROInput
Auto Trait Implementations§
impl Freeze for ROInput
impl RefUnwindSafe for ROInput
impl Send for ROInput
impl Sync for ROInput
impl Unpin for ROInput
impl UnwindSafe for ROInput
Blanket Implementations§
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,
§impl<T> Conv for T
impl<T> Conv for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<T> FmtForward for T
impl<T> FmtForward for T
§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.§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.§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.§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.§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.§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.§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.§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.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§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 more§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 more§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
§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
§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.§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.§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.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Tap for T
impl<T> Tap for T
§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 more§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 more§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 more§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 more§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 more§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 more§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.§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.§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.§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.§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.§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.§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.