refactor: skip serialization of feilds other then secret

This avoids wallet fingerprinting by only sending the secret when
checking if a proof is spent as recommnded in the nut.
This commit is contained in:
thesimplekid
2023-12-18 23:21:58 +00:00
parent 299d4c9c05
commit 69bdb18dda
4 changed files with 20 additions and 2 deletions

View File

@@ -308,7 +308,7 @@ impl Mint {
Ok(MeltBolt11Response {
paid: true,
proof: preimage.to_string(),
payment_preimage: Some(preimage.to_string()),
change,
})
}

View File

@@ -300,7 +300,7 @@ impl<C: Client> Wallet<C> {
let melted = Melted {
paid: true,
preimage: Some(melt_response.proof),
preimage: melt_response.payment_preimage,
change: change_proofs,
};

View File

@@ -33,6 +33,8 @@ pub enum Error {
TokenNotVerifed,
#[error("Invoice Amount undefined")]
InvoiceAmountUndefined,
#[error("Proof missing required field")]
MissingProofField,
}
#[cfg(feature = "wallet")]

View File

@@ -389,6 +389,19 @@ impl From<Proof> for mint::Proof {
}
}
impl TryFrom<mint::Proof> for Proof {
type Error = Error;
fn try_from(mint_proof: mint::Proof) -> Result<Proof, Self::Error> {
Ok(Self {
id: mint_proof.id.ok_or(Error::MissingProofField)?,
amount: mint_proof.amount.ok_or(Error::MissingProofField)?,
secret: mint_proof.secret,
c: mint_proof.c.ok_or(Error::MissingProofField)?,
})
}
}
pub mod mint {
use serde::{Deserialize, Serialize};
@@ -401,13 +414,16 @@ pub mod mint {
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Proof {
/// Amount in satoshi
#[serde(skip_serializing)]
pub amount: Option<Amount>,
/// Secret message
#[serde(skip_serializing)]
pub secret: Secret,
/// Unblinded signature
#[serde(rename = "C")]
pub c: Option<PublicKey>,
/// `Keyset id`
#[serde(skip_serializing)]
pub id: Option<Id>,
}