Skip to content

Commit

Permalink
refactor!: have dbcs take derived key
Browse files Browse the repository at this point in the history
- This makes more sense in upper layer (bearer scenario for testing).
  • Loading branch information
oetyng committed Apr 13, 2023
1 parent 0bb8816 commit 8a124c9
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 59 deletions.
12 changes: 8 additions & 4 deletions benches/reissue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@ fn bench_reissue_1_to_100(c: &mut Criterion) {
let (mut spentbook_node, (starting_dbc, starting_main_key)) =
generate_dbc_of_value(Token::from_nano(N_OUTPUTS), &mut rng).unwrap();

let derived_key = starting_dbc.derived_key(&starting_main_key).unwrap();
let dbc_builder = sn_dbc::TransactionBuilder::default()
.add_input_dbc(&starting_dbc, &starting_main_key)
.add_input_dbc(&starting_dbc, &derived_key)
.unwrap()
.add_outputs((0..N_OUTPUTS).map(|_| {
(
Expand Down Expand Up @@ -77,8 +78,9 @@ fn bench_reissue_100_to_1(c: &mut Criterion) {
})
.collect();

let derived_key = starting_dbc.derived_key(&starting_main_key).unwrap();
let dbc_builder = sn_dbc::TransactionBuilder::default()
.add_input_dbc(&starting_dbc, &starting_main_key)
.add_input_dbc(&starting_dbc, &derived_key)
.unwrap()
.add_outputs(
outputs
Expand Down Expand Up @@ -109,7 +111,8 @@ fn bench_reissue_100_to_1(c: &mut Criterion) {

for (dbc, _) in dbcs.into_iter() {
let (main_key, _, _) = outputs.get(&dbc.id()).unwrap();
tx_builder = tx_builder.add_input_dbc(&dbc, main_key).unwrap();
let derived_key = dbc.derived_key(main_key).unwrap();
tx_builder = tx_builder.add_input_dbc(&dbc, &derived_key).unwrap();
}

let merge_dbc_builder = tx_builder
Expand Down Expand Up @@ -168,8 +171,9 @@ fn generate_dbc_of_value(

let main_key = MainKey::random_from_rng(rng);

let derived_key = genesis_dbc.derived_key(&genesis_material.main_key).unwrap();
let dbc_builder = sn_dbc::TransactionBuilder::default()
.add_input_dbc(&genesis_dbc, &genesis_material.main_key)
.add_input_dbc(&genesis_dbc, &derived_key)
.unwrap()
.add_outputs(output_amounts.into_iter().map(|amount| {
(
Expand Down
27 changes: 8 additions & 19 deletions src/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use crate::{
transaction::{
DbcTransaction, InputHistory, Output, RevealedAmount, RevealedOutput, RevealedTx,
},
DbcId, MainKey,
DbcId, DerivedKey,
};
use crate::{
rand::{CryptoRng, RngCore},
Expand Down Expand Up @@ -48,9 +48,9 @@ impl TransactionBuilder {
self
}

/// Add an input given a Dbc and associated MainKey.
pub fn add_input_dbc(mut self, dbc: &Dbc, main_key: &MainKey) -> Result<Self> {
let input = dbc.revealed_input(main_key)?;
/// Add an input given a Dbc and its DerivedKey.
pub fn add_input_dbc(mut self, dbc: &Dbc, derived_key: &DerivedKey) -> Result<Self> {
let input = dbc.revealed_input(derived_key)?;
let input_src_tx = dbc.src_tx.clone();
self = self.add_input(InputHistory {
input,
Expand All @@ -59,21 +59,10 @@ impl TransactionBuilder {
Ok(self)
}

/// Add an input given a list of Dbcs and associated MainKeys.
pub fn add_input_dbcs(mut self, main_key: &MainKey, dbcs: &[Dbc]) -> Result<Self> {
for dbc in dbcs.iter() {
self = self.add_input_dbc(dbc, main_key)?;
}
Ok(self)
}

/// Add an input given a list of Dbcs and associated MainKeys.
pub fn add_input_dbcs_with_keys(
mut self,
dbcs: impl IntoIterator<Item = (Dbc, MainKey)>,
) -> Result<Self> {
for (dbc, main_key) in dbcs.into_iter() {
self = self.add_input_dbc(&dbc, &main_key)?;
/// Add an input given a list of Dbcs and associated DerivedKeys.
pub fn add_input_dbcs(mut self, dbcs: &[(Dbc, DerivedKey)]) -> Result<Self> {
for (dbc, derived_key) in dbcs.iter() {
self = self.add_input_dbc(dbc, derived_key)?;
}
Ok(self)
}
Expand Down
45 changes: 25 additions & 20 deletions src/dbc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,17 @@ impl Dbc {
}

/// Decrypt and return the revealed amount.
pub fn revealed_amount(&self, main_key: &MainKey) -> Result<RevealedAmount> {
let derived_key = self.derived_key(main_key)?;
RevealedAmount::try_from((&derived_key, &self.ciphers.revealed_amount_cipher))
pub fn revealed_amount(&self, derived_key: &DerivedKey) -> Result<RevealedAmount> {
RevealedAmount::try_from((derived_key, &self.ciphers.revealed_amount_cipher))
}

/// Return the input that represents this Dbc for use as
/// a transaction input.
pub fn revealed_input(&self, derived_key: &DerivedKey) -> Result<RevealedInput> {
Ok(RevealedInput::new(
derived_key.clone(),
self.revealed_amount(derived_key)?,
))
}

/// Return the reason why this Dbc was spent.
Expand All @@ -125,15 +133,6 @@ impl Dbc {
.blinded_amount())
}

/// Return the input that represents this Dbc for use as
/// a transaction input.
pub fn revealed_input(&self, main_key: &MainKey) -> Result<RevealedInput> {
Ok(RevealedInput::new(
self.derived_key(main_key)?,
self.revealed_amount(main_key)?,
))
}

/// Generate the hash of this Dbc
pub fn hash(&self) -> Hash {
let mut sha3 = Sha3::v256();
Expand Down Expand Up @@ -226,7 +225,8 @@ impl Dbc {
/// this check, then they could be stuck with an unspendable Dbc
/// and no recourse.
pub(crate) fn verify_amounts(&self, main_key: &MainKey) -> Result<()> {
let revealed_amount: RevealedAmount = self.revealed_amount(main_key)?;
let derived_key = self.derived_key(main_key)?;
let revealed_amount: RevealedAmount = self.revealed_amount(&derived_key)?;
let blinded_amount = revealed_amount.blinded_amount(&Default::default());
let blinded_amount_in_tx = self.blinded_output(main_key)?.blinded_amount();

Expand Down Expand Up @@ -290,7 +290,8 @@ pub(crate) mod tests {
let hex = dbc.to_hex()?;

let dbc = Dbc::from_hex(&hex)?;
let amount = dbc.revealed_amount(&main_key)?.value();
let derived_key = dbc.derived_key(&main_key)?;
let amount = dbc.revealed_amount(&derived_key)?.value();
assert_eq!(amount, 1_530_000_000);
Ok(())
}
Expand Down Expand Up @@ -318,13 +319,16 @@ pub(crate) mod tests {
ciphers,
signed_spends: Default::default(),
};
let derived_key = dbc.derived_key(&main_key)?;

let hex = dbc.to_hex()?;

let dbc_from_hex = Dbc::from_hex(&hex)?;
let left = dbc.revealed_amount(&main_key)?.value();
let right = dbc_from_hex.revealed_amount(&main_key)?.value();
assert_eq!(left, right);
let derived_key_from_hex = dbc_from_hex.derived_key(&main_key)?;

let amount = dbc.revealed_amount(&derived_key)?.value();
let amount_from_hex = dbc_from_hex.revealed_amount(&derived_key_from_hex)?.value();
assert_eq!(amount, amount_from_hex);

Ok(())
}

Expand All @@ -341,7 +345,7 @@ pub(crate) mod tests {
"d823b03be25ad306ce2c2ef8f67d8a49322ed2a8636de5dbf01f6cc3467dc91e",
)?;
let main_key = MainKey::new(sk);
let result = dbc.revealed_input(&main_key);
let result = dbc.derived_key(&main_key);
assert!(result.is_err());
assert_eq!(
result.unwrap_err().to_string(),
Expand Down Expand Up @@ -434,8 +438,9 @@ pub(crate) mod tests {
Token::from_nano(mock::GenesisMaterial::GENESIS_AMOUNT - amount),
];

let derived_key = genesis_dbc.derived_key(&genesis_material.main_key)?;
let dbc_builder = crate::TransactionBuilder::default()
.add_input_dbc(&genesis_dbc, &genesis_material.main_key)
.add_input_dbc(&genesis_dbc, &derived_key)
.unwrap()
.add_outputs(output_amounts.into_iter().map(|amount| {
(
Expand Down
36 changes: 20 additions & 16 deletions src/spentbook.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
mod tests {
use crate::{
tests::{TinyInt, TinyVec},
Hash, MainKey, RevealedAmount,
DerivedKey, Hash, MainKey, RevealedAmount,
};
use blsttc::SecretKey;
use quickcheck_macros::quickcheck;
Expand Down Expand Up @@ -59,8 +59,9 @@ mod tests {
})
.collect();

let derived_key = genesis_dbc.derived_key(&genesis.main_key).unwrap();
let dbc_builder = TransactionBuilder::default()
.add_input_dbc(&genesis_dbc, &genesis.main_key)?
.add_input_dbc(&genesis_dbc, &derived_key)?
.add_outputs(
first_output_key_map
.values()
Expand Down Expand Up @@ -106,9 +107,10 @@ mod tests {
let mut sum: u64 = 0;
for (dbc, _) in output_dbcs.iter() {
let (main_key, _, _) = first_output_key_map.get(&dbc.id()).unwrap();
let derived_key = dbc.derived_key(main_key).unwrap();
// note: we could just use revealed amount provided by DbcBuilder::build()
// but we go further to verify the correct value is encrypted in the Dbc.
sum += dbc.revealed_amount(main_key)?.value()
sum += dbc.revealed_amount(&derived_key)?.value()
}
sum
},
Expand Down Expand Up @@ -158,8 +160,9 @@ mod tests {
})
.collect();

let derived_key = genesis_dbc.derived_key(&genesis_material.main_key).unwrap();
let dbc_builder = TransactionBuilder::default()
.add_input_dbc(&genesis_dbc, &genesis_material.main_key)?
.add_input_dbc(&genesis_dbc, &derived_key)?
.add_outputs(
first_output_key_map
.values()
Expand Down Expand Up @@ -191,11 +194,12 @@ mod tests {
let first_output_dbcs = dbc_builder.build()?;

// The outputs become inputs for next tx.
let second_inputs_dbcs: Vec<(Dbc, MainKey)> = first_output_dbcs
let second_inputs_dbcs: Vec<(Dbc, DerivedKey)> = first_output_dbcs
.into_iter()
.map(|(dbc, _revealed_amount)| {
let (main_key, _, _) = first_output_key_map.remove(&dbc.id()).unwrap();
(dbc, main_key)
let derived_key = dbc.derived_key(&main_key).unwrap();
(dbc, derived_key)
})
.collect();

Expand All @@ -212,7 +216,7 @@ mod tests {
.collect();

let dbc_builder = TransactionBuilder::default()
.add_input_dbcs_with_keys(second_inputs_dbcs)?
.add_input_dbcs(&second_inputs_dbcs)?
.add_outputs(
second_output_key_map
.values()
Expand Down Expand Up @@ -395,8 +399,9 @@ mod tests {
let b_output_main_key = MainKey::random_from_rng(&mut rng);
let b_output_dbc_id_src = b_output_main_key.random_dbc_id_src(&mut rng);

let a_derived_key = a_dbc.derived_key(&a_main_key).unwrap();
let dbc_builder = TransactionBuilder::default()
.add_input_dbc(&a_dbc, &a_main_key)?
.add_input_dbc(&a_dbc, &a_derived_key)?
.add_output(Token::from_nano(b_output_amount), b_output_dbc_id_src)
.build(Hash::default(), &mut rng)?;

Expand All @@ -416,7 +421,7 @@ mod tests {

// Replace the encrypted secret amount with an encrypted secret claiming
// twice the amount.
let a_revealed_amount = a_dbc.revealed_amount(&a_main_key)?;
let a_revealed_amount = a_dbc.revealed_amount(&a_derived_key)?;
let b_fudged_revealed_amount = RevealedAmount::from((
b_output_amount * 2, // Claim we are paying twice the amount.
a_revealed_amount.blinding_factor(), // Use the real blinding factor.
Expand All @@ -434,8 +439,9 @@ mod tests {
));

// Obtain revealed amount (true and fudged) from the `revealed_amount_cipher` of each.
let b_output_revealed_amount = b_output_dbc.revealed_amount(&b_output_main_key)?;
let b_output_fudged_amount = b_fudged_output_dbc.revealed_amount(&b_output_main_key)?;
let b_derived_key = b_output_dbc.derived_key(&b_output_main_key).unwrap();
let b_output_revealed_amount = b_output_dbc.revealed_amount(&b_derived_key)?;
let b_output_fudged_amount = b_fudged_output_dbc.revealed_amount(&b_derived_key)?;

// Confirm the fudged amount is double of .
assert_eq!(
Expand All @@ -457,9 +463,7 @@ mod tests {

// Confirm that the revealed amount of `b_fudged_output_dbc` (2000) does not match `b_output_amount` (1000).
assert_ne!(
b_fudged_output_dbc
.revealed_amount(&b_output_main_key)?
.value(),
b_fudged_output_dbc.revealed_amount(&b_derived_key)?.value(),
b_output_amount,
);

Expand All @@ -471,7 +475,7 @@ mod tests {
let c_output_dbc_id_src = c_output_main_key.random_dbc_id_src(&mut rng);

let dbc_builder_fudged = crate::TransactionBuilder::default()
.add_input_dbc(&b_fudged_output_dbc, &b_output_main_key)?
.add_input_dbc(&b_fudged_output_dbc, &b_derived_key)?
.add_output(
Token::from_nano(b_output_fudged_amount.value()),
c_output_dbc_id_src,
Expand Down Expand Up @@ -524,7 +528,7 @@ mod tests {
// because entries are immutable.

let dbc_builder = TransactionBuilder::default()
.add_input_dbc(&b_output_dbc, &b_output_main_key)
.add_input_dbc(&b_output_dbc, &b_derived_key)
.unwrap()
.add_output(
Token::from_nano(b_output_revealed_amount.value()),
Expand Down

0 comments on commit 8a124c9

Please sign in to comment.