mirror of
https://github.com/serai-dex/serai.git
synced 2025-12-09 12:49:23 +00:00
Initial documentation for the Monero libraries (#122)
* Document all features * Largely document the Monero libraries Relevant to https://github.com/serai-dex/serai/issues/103 and likely sufficient to get this removed from https://github.com/serai-dex/serai/issues/102.
This commit is contained in:
@@ -1,3 +1,17 @@
|
||||
///! monero-serai: A modern Monero transaction library intended for usage in wallets. It prides
|
||||
///! itself on accuracy, correctness, and removing common pit falls developers may face.
|
||||
///!
|
||||
///! monero-serai contains safety features, such as first-class acknowledgement of the burning bug,
|
||||
///! yet also a high level API around creating transactions. monero-serai also offers a FROST-based
|
||||
///! multisig, which is orders of magnitude more performant than Monero's.
|
||||
///!
|
||||
///! monero-serai was written for Serai, a decentralized exchange aiming to support Monero.
|
||||
///! Despite this, monero-serai is intended to be a widely usable library, accurate to Monero.
|
||||
///! monero-serai guarantees the functionality needed for Serai, yet will not deprive functionality
|
||||
///! from other users, and may potentially leave Serai's umbrella at some point.
|
||||
///!
|
||||
///! Various legacy transaction formats are not currently implemented, yet monero-serai is still
|
||||
///! increasing its support for various transaction types.
|
||||
use lazy_static::lazy_static;
|
||||
use rand_core::{RngCore, CryptoRng};
|
||||
|
||||
@@ -14,7 +28,7 @@ use curve25519_dalek::{
|
||||
pub use monero_generators::H;
|
||||
|
||||
#[cfg(feature = "multisig")]
|
||||
pub mod frost;
|
||||
pub(crate) mod frost;
|
||||
|
||||
mod serialize;
|
||||
|
||||
@@ -29,6 +43,8 @@ pub mod wallet;
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
/// Monero protocol version. v15 is omitted as v15 was simply v14 and v16 being active at the same
|
||||
/// time, with regards to the transactions supported. Accordingly, v16 should be used during v15.
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Debug, Zeroize)]
|
||||
#[allow(non_camel_case_types)]
|
||||
pub enum Protocol {
|
||||
@@ -38,6 +54,7 @@ pub enum Protocol {
|
||||
}
|
||||
|
||||
impl Protocol {
|
||||
/// Amount of ring members under this protocol version.
|
||||
pub fn ring_len(&self) -> usize {
|
||||
match self {
|
||||
Protocol::Unsupported => panic!("Unsupported protocol version"),
|
||||
@@ -46,6 +63,8 @@ impl Protocol {
|
||||
}
|
||||
}
|
||||
|
||||
/// Whether or not the specified version uses Bulletproofs or Bulletproofs+.
|
||||
/// This method will likely be reworked when versions not using Bulletproofs at all are added.
|
||||
pub fn bp_plus(&self) -> bool {
|
||||
match self {
|
||||
Protocol::Unsupported => panic!("Unsupported protocol version"),
|
||||
@@ -59,6 +78,7 @@ lazy_static! {
|
||||
static ref H_TABLE: EdwardsBasepointTable = EdwardsBasepointTable::create(&H);
|
||||
}
|
||||
|
||||
/// Transparent structure representing a Pedersen commitment's contents.
|
||||
#[allow(non_snake_case)]
|
||||
#[derive(Clone, PartialEq, Eq, Debug, Zeroize, ZeroizeOnDrop)]
|
||||
pub struct Commitment {
|
||||
@@ -67,6 +87,7 @@ pub struct Commitment {
|
||||
}
|
||||
|
||||
impl Commitment {
|
||||
/// The zero commitment, defined as a mask of 1 (as to not be the identity) and a 0 amount.
|
||||
pub fn zero() -> Commitment {
|
||||
Commitment { mask: Scalar::one(), amount: 0 }
|
||||
}
|
||||
@@ -75,12 +96,13 @@ impl Commitment {
|
||||
Commitment { mask, amount }
|
||||
}
|
||||
|
||||
/// Calculate a Pedersen commitment, as a point, from the transparent structure.
|
||||
pub fn calculate(&self) -> EdwardsPoint {
|
||||
(&self.mask * &ED25519_BASEPOINT_TABLE) + (&Scalar::from(self.amount) * &*H_TABLE)
|
||||
}
|
||||
}
|
||||
|
||||
// Allows using a modern rand as dalek's is notoriously dated
|
||||
/// Support generating a random scalar using a modern rand, as dalek's is notoriously dated.
|
||||
pub fn random_scalar<R: RngCore + CryptoRng>(rng: &mut R) -> Scalar {
|
||||
let mut r = [0; 64];
|
||||
rng.fill_bytes(&mut r);
|
||||
@@ -95,6 +117,7 @@ pub fn hash(data: &[u8]) -> [u8; 32] {
|
||||
res
|
||||
}
|
||||
|
||||
/// Hash the provided data to a scalar via keccak256(data) % l.
|
||||
pub fn hash_to_scalar(data: &[u8]) -> Scalar {
|
||||
let scalar = Scalar::from_bytes_mod_order(hash(data));
|
||||
// Monero will explicitly error in this case
|
||||
|
||||
Reference in New Issue
Block a user