Integrated bulletproofs into Grin with optional build parameter (enabled by default) (#711)

This commit is contained in:
Yeastplume
2018-02-16 20:34:54 +00:00
committed by GitHub
parent 5572fa075e
commit c63aa70a0b
6 changed files with 100 additions and 13 deletions
+30 -6
View File
@@ -1059,9 +1059,13 @@ mod test {
let b = new_block(vec![], &keychain);
let mut vec = Vec::new();
ser::serialize(&mut vec, &b).expect("serialization failed");
let target_len = match Keychain::is_using_bullet_proofs() {
true => 1_256,
false => 5_708,
};
assert_eq!(
vec.len(),
5_708,
target_len,
);
}
@@ -1072,9 +1076,13 @@ mod test {
let b = new_block(vec![&tx1], &keychain);
let mut vec = Vec::new();
ser::serialize(&mut vec, &b).expect("serialization failed");
let target_len = match Keychain::is_using_bullet_proofs() {
true => 2_900,
false => 16_256,
};
assert_eq!(
vec.len(),
16_256,
target_len,
);
}
@@ -1084,9 +1092,13 @@ mod test {
let b = new_block(vec![], &keychain);
let mut vec = Vec::new();
ser::serialize(&mut vec, &b.as_compact_block()).expect("serialization failed");
let target_len = match Keychain::is_using_bullet_proofs() {
true => 1_264,
false => 5_716,
};
assert_eq!(
vec.len(),
5_716,
target_len,
);
}
@@ -1097,9 +1109,13 @@ mod test {
let b = new_block(vec![&tx1], &keychain);
let mut vec = Vec::new();
ser::serialize(&mut vec, &b.as_compact_block()).expect("serialization failed");
let target_len = match Keychain::is_using_bullet_proofs() {
true => 1_270,
false => 5_722,
};
assert_eq!(
vec.len(),
5_722,
target_len,
);
}
@@ -1119,9 +1135,13 @@ mod test {
);
let mut vec = Vec::new();
ser::serialize(&mut vec, &b).expect("serialization failed");
let target_len = match Keychain::is_using_bullet_proofs() {
true => 17696,
false => 111188,
};
assert_eq!(
vec.len(),
111_188,
target_len,
);
}
@@ -1141,9 +1161,13 @@ mod test {
);
let mut vec = Vec::new();
ser::serialize(&mut vec, &b.as_compact_block()).expect("serialization failed");
let target_len = match Keychain::is_using_bullet_proofs() {
true => 1_324,
false => 5_776,
};
assert_eq!(
vec.len(),
5_776,
target_len,
);
}
+11 -1
View File
@@ -263,9 +263,13 @@ mod test {
let tx = tx2i1o();
let mut vec = Vec::new();
ser::serialize(&mut vec, &tx).expect("serialization failed");
let target_len = match Keychain::is_using_bullet_proofs() {
true => 986,
false => 5_438,
};
assert_eq!(
vec.len(),
5_438,
target_len,
);
}
@@ -390,6 +394,12 @@ mod test {
let btx = tx2i1o();
assert!(btx.validate().is_ok());
// Ignored for bullet proofs, info doesn't exist yet and calling range_proof_info
// with a bullet proof causes painful errors
if Keychain::is_using_bullet_proofs() {
return;
}
// checks that the range proof on our blind output is sufficiently hiding
let Output { proof, .. } = btx.outputs[0];
+15 -4
View File
@@ -92,6 +92,8 @@ pub enum Error {
LockHeight(u64),
/// Error originating from an invalid switch commitment (coinbase lock_height related)
SwitchCommitment,
/// Range proof validation error
RangeProof,
}
impl From<secp::Error> for Error {
@@ -749,8 +751,11 @@ impl Output {
pub fn verify_proof(&self) -> Result<(), secp::Error> {
let secp = static_secp_instance();
let secp = secp.lock().unwrap();
secp.verify_range_proof(self.commit, self.proof).map(|_| ())
}
match Keychain::verify_range_proof(&secp, self.commit, self.proof){
Ok(_) => Ok(()),
Err(e) => Err(e),
}
}
/// Given the original blinding factor we can recover the
/// value from the range proof and the commitment
@@ -1089,8 +1094,14 @@ mod test {
};
// check we can successfully recover the value with the original blinding factor
let recovered_value = output.recover_value(&keychain, &key_id).unwrap();
assert_eq!(recovered_value, 1003);
let result = output.recover_value(&keychain, &key_id);
// TODO: Remove this check once value recovery is supported within bullet proofs
if let Some(v) = result {
assert_eq!(v, 1003);
} else {
return;
}
// check we cannot recover the value without the original blinding factor
let key_id2 = keychain.derive_key_id(2).unwrap();