Aggsig Serialization (#618)

* changing ser of aggsig signature
* serialise Signature as raw 64 bytes
* remove compact sig
* remove to_compact
* remove unused import
This commit is contained in:
Yeastplume 2018-01-15 20:45:26 +00:00 committed by Ignotus Peverell
parent 41d4978d46
commit 9704cc35bd
9 changed files with 58 additions and 35 deletions

View file

@ -290,7 +290,7 @@ impl TxKernelPrintable {
fee: k.fee, fee: k.fee,
lock_height: k.lock_height, lock_height: k.lock_height,
excess: util::to_hex(k.excess.0.to_vec()), excess: util::to_hex(k.excess.0.to_vec()),
excess_sig: util::to_hex(k.excess_sig.to_vec()), excess_sig: util::to_hex(k.excess_sig.to_raw_data().to_vec()),
} }
} }
} }

View file

@ -588,12 +588,10 @@ impl Block {
let msg = util::secp::Message::from_slice(&[0; secp::constants::MESSAGE_SIZE])?; let msg = util::secp::Message::from_slice(&[0; secp::constants::MESSAGE_SIZE])?;
let sig = keychain.aggsig_sign_from_key_id(&msg, &key_id).unwrap(); let sig = keychain.aggsig_sign_from_key_id(&msg, &key_id).unwrap();
let excess_sig = sig.serialize_der(&secp);
let proof = TxKernel { let proof = TxKernel {
features: COINBASE_KERNEL, features: COINBASE_KERNEL,
excess: excess, excess: excess,
excess_sig: excess_sig, excess_sig: sig,
fee: 0, fee: 0,
lock_height: 0, lock_height: 0,
}; };

View file

@ -25,7 +25,7 @@
//! build::transaction(vec![input_rand(75), output_rand(42), output_rand(32), //! build::transaction(vec![input_rand(75), output_rand(42), output_rand(32),
//! with_fee(1)]) //! with_fee(1)])
use util::{secp, static_secp_instance, kernel_sig_msg}; use util::{secp, kernel_sig_msg};
use core::{Input, Output, SwitchCommitHash, Transaction, DEFAULT_OUTPUT}; use core::{Input, Output, SwitchCommitHash, Transaction, DEFAULT_OUTPUT};
use util::LOGGER; use util::LOGGER;
@ -137,12 +137,7 @@ pub fn transaction(
); );
let blind_sum = ctx.keychain.blind_sum(&sum)?; let blind_sum = ctx.keychain.blind_sum(&sum)?;
let msg = secp::Message::from_slice(&kernel_sig_msg(tx.fee, tx.lock_height))?; let msg = secp::Message::from_slice(&kernel_sig_msg(tx.fee, tx.lock_height))?;
let sig = Keychain::aggsig_sign_with_blinding(&keychain.secp(), &msg, &blind_sum)?; tx.excess_sig = Keychain::aggsig_sign_with_blinding(&keychain.secp(), &msg, &blind_sum)?;
let secp = static_secp_instance();
let secp = secp.lock().unwrap();
tx.excess_sig = sig.serialize_der(&secp);
Ok((tx, blind_sum)) Ok((tx, blind_sum))
} }

View file

@ -261,8 +261,9 @@ mod test {
let tx = tx2i1o(); let tx = tx2i1o();
let mut vec = Vec::new(); let mut vec = Vec::new();
ser::serialize(&mut vec, &tx).expect("serialized failed"); ser::serialize(&mut vec, &tx).expect("serialized failed");
assert!(vec.len() > 5360); println!("{}", vec.len());
assert!(vec.len() < 5380); assert!(vec.len() > 5340);
assert!(vec.len() < 5370);
} }
#[test] #[test]

View file

@ -110,7 +110,7 @@ pub struct TxKernel {
pub excess: Commitment, pub excess: Commitment,
/// The signature proving the excess is a valid public key, which signs /// The signature proving the excess is a valid public key, which signs
/// the transaction fee. /// the transaction fee.
pub excess_sig: Vec<u8>, pub excess_sig: Signature,
} }
hashable_ord!(TxKernel); hashable_ord!(TxKernel);
@ -122,9 +122,9 @@ impl Writeable for TxKernel {
[write_u8, self.features.bits()], [write_u8, self.features.bits()],
[write_u64, self.fee], [write_u64, self.fee],
[write_u64, self.lock_height], [write_u64, self.lock_height],
[write_fixed_bytes, &self.excess], [write_fixed_bytes, &self.excess]
[write_bytes, &self.excess_sig]
); );
self.excess_sig.write(writer)?;
Ok(()) Ok(())
} }
} }
@ -134,13 +134,12 @@ impl Readable for TxKernel {
let features = KernelFeatures::from_bits(reader.read_u8()?).ok_or( let features = KernelFeatures::from_bits(reader.read_u8()?).ok_or(
ser::Error::CorruptedData, ser::Error::CorruptedData,
)?; )?;
Ok(TxKernel { Ok(TxKernel {
features: features, features: features,
fee: reader.read_u64()?, fee: reader.read_u64()?,
lock_height: reader.read_u64()?, lock_height: reader.read_u64()?,
excess: Commitment::read(reader)?, excess: Commitment::read(reader)?,
excess_sig: reader.read_vec()?, excess_sig: Signature::read(reader)?,
}) })
} }
} }
@ -155,7 +154,7 @@ impl TxKernel {
)); ));
let secp = static_secp_instance(); let secp = static_secp_instance();
let secp = secp.lock().unwrap(); let secp = secp.lock().unwrap();
let sig = try!(Signature::from_der(&secp, &self.excess_sig)); let sig = &self.excess_sig;
let valid = Keychain::aggsig_verify_single_from_commit(&secp, &sig, &msg, &self.excess); let valid = Keychain::aggsig_verify_single_from_commit(&secp, &sig, &msg, &self.excess);
if !valid{ if !valid{
return Err(secp::Error::IncorrectSignature); return Err(secp::Error::IncorrectSignature);
@ -178,18 +177,22 @@ pub struct Transaction {
pub lock_height: u64, pub lock_height: u64,
/// The signature proving the excess is a valid public key, which signs /// The signature proving the excess is a valid public key, which signs
/// the transaction fee. /// the transaction fee.
pub excess_sig: Vec<u8>, pub excess_sig: Signature,
} }
/// Implementation of Writeable for a fully blinded transaction, defines how to /// Implementation of Writeable for a fully blinded transaction, defines how to
/// write the transaction as binary. /// write the transaction as binary.
impl Writeable for Transaction { impl Writeable for Transaction {
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ser::Error> { fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ser::Error> {
println!("Excess sig write: {:?}", self.excess_sig);
ser_multiwrite!( ser_multiwrite!(
writer, writer,
[write_u64, self.fee], [write_u64, self.fee],
[write_u64, self.lock_height], [write_u64, self.lock_height]
[write_bytes, &self.excess_sig], );
self.excess_sig.write(writer)?;
ser_multiwrite!(
writer,
[write_u64, self.inputs.len() as u64], [write_u64, self.inputs.len() as u64],
[write_u64, self.outputs.len() as u64] [write_u64, self.outputs.len() as u64]
); );
@ -209,8 +212,13 @@ impl Writeable for Transaction {
/// transaction from a binary stream. /// transaction from a binary stream.
impl Readable for Transaction { impl Readable for Transaction {
fn read(reader: &mut Reader) -> Result<Transaction, ser::Error> { fn read(reader: &mut Reader) -> Result<Transaction, ser::Error> {
let (fee, lock_height, excess_sig, input_len, output_len) = let (fee, lock_height) =
ser_multiread!(reader, read_u64, read_u64, read_vec, read_u64, read_u64); ser_multiread!(reader, read_u64, read_u64);
let excess_sig = Signature::read(reader)?;
let (input_len, output_len) =
ser_multiread!(reader, read_u64, read_u64);
let inputs = read_and_verify_sorted(reader, input_len)?; let inputs = read_and_verify_sorted(reader, input_len)?;
let outputs = read_and_verify_sorted(reader, output_len)?; let outputs = read_and_verify_sorted(reader, output_len)?;
@ -250,7 +258,7 @@ impl Transaction {
Transaction { Transaction {
fee: 0, fee: 0,
lock_height: 0, lock_height: 0,
excess_sig: vec![], excess_sig: Signature::from_raw_data(&[0;64]).unwrap(),
inputs: vec![], inputs: vec![],
outputs: vec![], outputs: vec![],
} }
@ -267,7 +275,7 @@ impl Transaction {
Transaction { Transaction {
fee: fee, fee: fee,
lock_height: lock_height, lock_height: lock_height,
excess_sig: vec![], excess_sig: Signature::from_raw_data(&[0;64]).unwrap(),
inputs: inputs, inputs: inputs,
outputs: outputs, outputs: outputs,
} }
@ -323,7 +331,7 @@ impl Transaction {
let secp = static_secp_instance(); let secp = static_secp_instance();
let secp = secp.lock().unwrap(); let secp = secp.lock().unwrap();
let sig = Signature::from_der(&secp, &self.excess_sig)?; let sig = self.excess_sig;
// pretend the sum is a public key (which it is, being of the form r.G) and // pretend the sum is a public key (which it is, being of the form r.G) and
// verify the transaction sig with it // verify the transaction sig with it
let valid = Keychain::aggsig_verify_single_from_commit(&secp, &sig, &msg, &rsum); let valid = Keychain::aggsig_verify_single_from_commit(&secp, &sig, &msg, &rsum);
@ -651,7 +659,7 @@ mod test {
let commit = keychain.commit(5, &key_id).unwrap(); let commit = keychain.commit(5, &key_id).unwrap();
// just some bytes for testing ser/deser // just some bytes for testing ser/deser
let sig = vec![1, 0, 0, 0, 0, 0, 0, 1]; let sig = secp::Signature::from_raw_data(&[0;64]).unwrap();
let kernel = TxKernel { let kernel = TxKernel {
features: DEFAULT_KERNEL, features: DEFAULT_KERNEL,

View file

@ -75,16 +75,18 @@ macro_rules! try_to_o {
} }
/// Eliminate some of the boilerplate of deserialization (package ser) by /// Eliminate some of the boilerplate of deserialization (package ser) by
/// passing just the list of reader function. /// passing just the list of reader function (with optional single param)
/// Example before: /// Example before:
/// let foo = try!(reader.read_u64()); /// let foo = try!(reader.read_u64());
/// let bar = try!(reader.read_u32()); /// let bar = try!(reader.read_u32());
/// let fixed_byte_var = try!(reader.read_fixed_bytes(64));
/// Example after: /// Example after:
/// let (foo, bar) = ser_multiread!(reader, read_u64, read_u32); /// let (foo, bar, fixed_byte_var) = ser_multiread!(reader, read_u64, read_u32,
/// read_fixed_bytes(64));
#[macro_export] #[macro_export]
macro_rules! ser_multiread { macro_rules! ser_multiread {
($rdr:ident, $($read_call:ident),*) => { ($rdr:ident, $($read_call:ident $(($val:expr)),*),*) => {
( $(try!($rdr.$read_call())),* ) ( $(try!($rdr.$read_call($($val),*))),* )
} }
} }

View file

@ -29,7 +29,8 @@ use core::hash::Hashed;
use core::transaction::{SWITCH_COMMIT_HASH_SIZE, SwitchCommitHash}; use core::transaction::{SWITCH_COMMIT_HASH_SIZE, SwitchCommitHash};
use util::secp::pedersen::Commitment; use util::secp::pedersen::Commitment;
use util::secp::pedersen::RangeProof; use util::secp::pedersen::RangeProof;
use util::secp::constants::{MAX_PROOF_SIZE, PEDERSEN_COMMITMENT_SIZE}; use util::secp::Signature;
use util::secp::constants::{MAX_PROOF_SIZE, PEDERSEN_COMMITMENT_SIZE, AGG_SIGNATURE_SIZE};
/// Possible errors deriving from serializing or deserializing. /// Possible errors deriving from serializing or deserializing.
#[derive(Debug)] #[derive(Debug)]
@ -353,6 +354,24 @@ impl Readable for RangeProof {
} }
} }
impl Readable for Signature {
fn read(reader: &mut Reader) -> Result<Signature, Error> {
let a = try!(reader.read_fixed_bytes(AGG_SIGNATURE_SIZE));
let mut c = [0; AGG_SIGNATURE_SIZE];
for i in 0..AGG_SIGNATURE_SIZE {
c[i] = a[i];
}
Ok(Signature::from_raw_data(&c).unwrap())
}
}
impl Writeable for Signature {
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
writer.write_fixed_bytes(self)
}
}
/// Utility wrapper for an underlying byte Writer. Defines higher level methods /// Utility wrapper for an underlying byte Writer. Defines higher level methods
/// to write numbers, byte vectors, hashes, etc. /// to write numbers, byte vectors, hashes, etc.
struct BinWriter<'a> { struct BinWriter<'a> {

View file

@ -14,6 +14,6 @@ byteorder = "^0.5"
rand = "0.3" rand = "0.3"
serde = "~1.0.8" serde = "~1.0.8"
serde_derive = "~1.0.8" serde_derive = "~1.0.8"
secp256k1zkp = { git = "https://github.com/mimblewimble/rust-secp256k1-zkp", tag="grin_integration_6" } secp256k1zkp = { git = "https://github.com/mimblewimble/rust-secp256k1-zkp", tag="grin_integration_7" }
#secp256k1zkp = { path = "../../rust-secp256k1-zkp" } #secp256k1zkp = { path = "../../rust-secp256k1-zkp" }

View file

@ -370,7 +370,7 @@ fn build_final_transaction(
keychain, keychain,
)?; )?;
final_tx.excess_sig = excess_sig.serialize_der(&keychain.secp()); final_tx.excess_sig = excess_sig.clone();
// make sure the resulting transaction is valid (could have been lied to on // make sure the resulting transaction is valid (could have been lied to on
// excess). // excess).