Merge pull request #5 from paritytech/nv2

add joinsplit public value propagation to transparent pool
This commit is contained in:
Svyatoslav Nikolsky 2018-11-26 15:20:34 +03:00 committed by GitHub
commit 964f027422
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 4 deletions

View File

@ -175,11 +175,21 @@ impl<'a> BlockCoinbaseClaim<'a> {
let prevout = store.transaction_output(&input.previous_output, tx_idx);
let (sum, overflow) = incoming.overflowing_add(prevout.map(|o| o.value).unwrap_or(0));
if overflow {
return Err(Error::ReferencedInputsSumOverflow);
return Err(Error::ReferencedInputsSumOverflow)
}
incoming = sum;
}
let join_split_public_new = tx.raw.join_split.iter()
.flat_map(|js| &js.descriptions)
.map(|d| d.value_pub_new)
.sum::<u64>();
incoming = match incoming.overflowing_add(join_split_public_new) {
(_, true) => return Err(Error::ReferencedInputsSumOverflow),
(incoming, _) => incoming,
};
// (2) Total sum of all outputs
let spends = tx.raw.total_spends();

View File

@ -220,13 +220,20 @@ impl<'a> TransactionOverspent<'a> {
return Ok(());
}
let available = self.transaction.raw.inputs.iter()
let available_public = self.transaction.raw.inputs.iter()
.map(|input| self.store.transaction_output(&input.previous_output, usize::max_value()).map(|o| o.value).unwrap_or(0))
.sum::<u64>();
let available_join_split = self.transaction.raw.join_split.iter()
.flat_map(|js| &js.descriptions)
.map(|d| d.value_pub_new)
.sum::<u64>();
let total_available = available_public + available_join_split;
let spends = self.transaction.raw.total_spends();
if spends > available {
if spends > total_available {
Err(TransactionError::Overspend)
} else {
Ok(())
@ -458,5 +465,4 @@ mod tests {
.verify_p2sh(true);
assert_eq!(verify_script(&input_script, &output_script, &flags, &checker), Ok(()));
}
}