|
|
@@ -22,7 +22,6 @@ pub struct TransactionBuilder {
|
|
|
pub clear_inputs: Vec<TransactionBuilderClearInputInfo>,
|
|
|
pub inputs: Vec<TransactionBuilderInputInfo>,
|
|
|
pub outputs: Vec<TransactionBuilderOutputInfo>,
|
|
|
- pub clear_outputs: Vec<TransactionBuilderClearOutputInfo>,
|
|
|
}
|
|
|
|
|
|
impl TransactionBuilder {
|
|
|
@@ -30,7 +29,6 @@ impl TransactionBuilder {
|
|
|
clear_inputs: &Vec<PartialTransactionClearInput>,
|
|
|
input_blinds: &Vec<jubjub::Fr>,
|
|
|
output_blinds: &Vec<jubjub::Fr>,
|
|
|
- clear_outputs: &Vec<TransactionClearOutput>,
|
|
|
) -> jubjub::Fr {
|
|
|
let mut total = jubjub::Fr::zero();
|
|
|
|
|
|
@@ -46,10 +44,6 @@ impl TransactionBuilder {
|
|
|
total -= output_blind;
|
|
|
}
|
|
|
|
|
|
- for output in clear_outputs {
|
|
|
- total -= output.valcom_blind;
|
|
|
- }
|
|
|
-
|
|
|
total
|
|
|
}
|
|
|
|
|
|
@@ -104,13 +98,11 @@ impl TransactionBuilder {
|
|
|
inputs.push(input);
|
|
|
}
|
|
|
|
|
|
- let last_output_index = self.outputs.len() + self.clear_outputs.len() - 1;
|
|
|
-
|
|
|
let mut outputs = vec![];
|
|
|
let mut output_blinds = vec![];
|
|
|
for (i, output) in self.outputs.iter().enumerate() {
|
|
|
- let valcom_blind = if i == last_output_index {
|
|
|
- Self::compute_remainder_blind(&clear_inputs, &input_blinds, &output_blinds, &vec![])
|
|
|
+ let valcom_blind = if i == self.outputs.len() - 1 {
|
|
|
+ Self::compute_remainder_blind(&clear_inputs, &input_blinds, &output_blinds)
|
|
|
} else {
|
|
|
jubjub::Fr::random(&mut OsRng)
|
|
|
};
|
|
|
@@ -147,28 +139,10 @@ impl TransactionBuilder {
|
|
|
outputs.push(output);
|
|
|
}
|
|
|
|
|
|
- let mut clear_outputs = vec![];
|
|
|
-
|
|
|
- for (i, output) in self.clear_outputs.into_iter().enumerate() {
|
|
|
- let valcom_blind = if self.outputs.len() + i == last_output_index {
|
|
|
- Self::compute_remainder_blind(&clear_inputs, &input_blinds, &output_blinds, &clear_outputs)
|
|
|
- } else {
|
|
|
- jubjub::Fr::random(&mut OsRng)
|
|
|
- };
|
|
|
-
|
|
|
- let output = TransactionClearOutput {
|
|
|
- value: output.value,
|
|
|
- valcom_blind,
|
|
|
- instructions: output.instructions
|
|
|
- };
|
|
|
- clear_outputs.push(output);
|
|
|
- }
|
|
|
-
|
|
|
let partial_tx = PartialTransaction {
|
|
|
clear_inputs,
|
|
|
inputs,
|
|
|
outputs,
|
|
|
- clear_outputs
|
|
|
};
|
|
|
|
|
|
let mut unsigned_tx_data = vec![];
|
|
|
@@ -199,16 +173,10 @@ impl TransactionBuilder {
|
|
|
clear_inputs,
|
|
|
inputs,
|
|
|
outputs: partial_tx.outputs,
|
|
|
- clear_outputs: partial_tx.clear_outputs
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-pub struct TransactionBuilderClearOutputInfo {
|
|
|
- pub value: u64,
|
|
|
- pub instructions: String
|
|
|
-}
|
|
|
-
|
|
|
pub struct TransactionBuilderClearInputInfo {
|
|
|
pub value: u64,
|
|
|
pub signature_secret: jubjub::Fr,
|
|
|
@@ -231,7 +199,6 @@ pub struct PartialTransaction {
|
|
|
pub clear_inputs: Vec<PartialTransactionClearInput>,
|
|
|
pub inputs: Vec<PartialTransactionInput>,
|
|
|
pub outputs: Vec<TransactionOutput>,
|
|
|
- pub clear_outputs: Vec<TransactionClearOutput>,
|
|
|
}
|
|
|
|
|
|
impl Encodable for PartialTransaction {
|
|
|
@@ -239,8 +206,7 @@ impl Encodable for PartialTransaction {
|
|
|
let mut len = 0;
|
|
|
len += self.clear_inputs.encode(&mut s)?;
|
|
|
len += self.inputs.encode(&mut s)?;
|
|
|
- len += self.outputs.encode(&mut s)?;
|
|
|
- len += self.clear_outputs.encode(&mut s)?;
|
|
|
+ len += self.outputs.encode(s)?;
|
|
|
Ok(len)
|
|
|
}
|
|
|
}
|
|
|
@@ -250,8 +216,7 @@ impl Decodable for PartialTransaction {
|
|
|
Ok(Self {
|
|
|
clear_inputs: Decodable::decode(&mut d)?,
|
|
|
inputs: Decodable::decode(&mut d)?,
|
|
|
- outputs: Decodable::decode(&mut d)?,
|
|
|
- clear_outputs: Decodable::decode(&mut d)?,
|
|
|
+ outputs: Decodable::decode(d)?,
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
@@ -260,7 +225,6 @@ pub struct Transaction {
|
|
|
pub clear_inputs: Vec<TransactionClearInput>,
|
|
|
pub inputs: Vec<TransactionInput>,
|
|
|
pub outputs: Vec<TransactionOutput>,
|
|
|
- pub clear_outputs: Vec<TransactionClearOutput>
|
|
|
}
|
|
|
|
|
|
impl Encodable for Transaction {
|
|
|
@@ -268,8 +232,7 @@ impl Encodable for Transaction {
|
|
|
let mut len = 0;
|
|
|
len += self.clear_inputs.encode(&mut s)?;
|
|
|
len += self.inputs.encode(&mut s)?;
|
|
|
- len += self.outputs.encode(&mut s)?;
|
|
|
- len += self.clear_outputs.encode(&mut s)?;
|
|
|
+ len += self.outputs.encode(s)?;
|
|
|
Ok(len)
|
|
|
}
|
|
|
}
|
|
|
@@ -279,8 +242,7 @@ impl Decodable for Transaction {
|
|
|
Ok(Self {
|
|
|
clear_inputs: Decodable::decode(&mut d)?,
|
|
|
inputs: Decodable::decode(&mut d)?,
|
|
|
- outputs: Decodable::decode(&mut d)?,
|
|
|
- clear_outputs: Decodable::decode(&mut d)?,
|
|
|
+ outputs: Decodable::decode(d)?,
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
@@ -290,8 +252,7 @@ impl Transaction {
|
|
|
let mut len = 0;
|
|
|
len += self.clear_inputs.encode_without_signature(&mut s)?;
|
|
|
len += self.inputs.encode_without_signature(&mut s)?;
|
|
|
- len += self.outputs.encode(&mut s)?;
|
|
|
- len += self.clear_outputs.encode(&mut s)?;
|
|
|
+ len += self.outputs.encode(s)?;
|
|
|
Ok(len)
|
|
|
}
|
|
|
|
|
|
@@ -313,7 +274,6 @@ impl Transaction {
|
|
|
}
|
|
|
for input in &self.inputs {
|
|
|
if !verify_spend_proof(spend_pvk, &input.spend_proof, &input.revealed) {
|
|
|
- println!("spend fail");
|
|
|
return false;
|
|
|
}
|
|
|
valcom_total += &input.revealed.value_commit;
|
|
|
@@ -325,9 +285,6 @@ impl Transaction {
|
|
|
}
|
|
|
valcom_total -= &output.revealed.value_commit;
|
|
|
}
|
|
|
- for output in &self.clear_outputs {
|
|
|
- valcom_total -= Self::compute_value_commit(output.value, &output.valcom_blind);
|
|
|
- }
|
|
|
|
|
|
// Verify signatures
|
|
|
let mut unsigned_tx_data = vec![];
|
|
|
@@ -549,32 +506,3 @@ impl Decodable for TransactionOutput {
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-pub struct TransactionClearOutput {
|
|
|
- pub value: u64,
|
|
|
- pub valcom_blind: jubjub::Fr,
|
|
|
- pub instructions: String
|
|
|
-}
|
|
|
-
|
|
|
-impl_vec!(TransactionClearOutput);
|
|
|
-
|
|
|
-impl Encodable for TransactionClearOutput {
|
|
|
- fn encode<S: io::Write>(&self, mut s: S) -> Result<usize> {
|
|
|
- let mut len = 0;
|
|
|
- len += self.value.encode(&mut s)?;
|
|
|
- len += self.valcom_blind.encode(&mut s)?;
|
|
|
- len += self.instructions.encode(s)?;
|
|
|
- Ok(len)
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-impl Decodable for TransactionClearOutput {
|
|
|
- fn decode<D: io::Read>(mut d: D) -> Result<Self> {
|
|
|
- Ok(Self {
|
|
|
- value: Decodable::decode(&mut d)?,
|
|
|
- valcom_blind: Decodable::decode(&mut d)?,
|
|
|
- instructions: Decodable::decode(&mut d)?,
|
|
|
- })
|
|
|
- }
|
|
|
-}
|
|
|
-
|