Removed kernel sum from header. Fixes #1568

This commit is contained in:
Ignotus Peverell
2018-10-13 00:57:08 +00:00
parent df0dc91891
commit 805cc24e73
5 changed files with 6 additions and 59 deletions
+1 -27
View File
@@ -35,7 +35,7 @@ use global;
use keychain::{self, BlindingFactor};
use pow::{Difficulty, Proof, ProofOfWork};
use ser::{self, Readable, Reader, Writeable, Writer};
use util::{secp, secp_static, static_secp_instance, LOGGER};
use util::{secp, static_secp_instance, LOGGER};
/// Errors thrown by Block validation
#[derive(Debug, Clone, Eq, PartialEq, Fail)]
@@ -130,9 +130,6 @@ pub struct BlockHeader {
/// We can derive the kernel offset sum for *this* block from
/// the total kernel offset of the previous block header.
pub total_kernel_offset: BlindingFactor,
/// Total accumulated sum of kernel commitments since genesis block.
/// Should always equal the UTXO commitment sum minus supply.
pub total_kernel_sum: Commitment,
/// Total size of the output MMR after applying this block
pub output_mmr_size: u64,
/// Total size of the kernel MMR after applying this block
@@ -152,7 +149,6 @@ fn fixed_size_of_serialized_header(version: u16) -> usize {
size += mem::size_of::<Hash>(); // range_proof_root
size += mem::size_of::<Hash>(); // kernel_root
size += mem::size_of::<BlindingFactor>(); // total_kernel_offset
size += mem::size_of::<Commitment>(); // total_kernel_sum
size += mem::size_of::<u64>(); // output_mmr_size
size += mem::size_of::<u64>(); // kernel_mmr_size
size += mem::size_of::<Difficulty>(); // total_difficulty
@@ -188,7 +184,6 @@ impl Default for BlockHeader {
range_proof_root: ZERO_HASH,
kernel_root: ZERO_HASH,
total_kernel_offset: BlindingFactor::zero(),
total_kernel_sum: Commitment::from_vec(vec![0; 33]),
output_mmr_size: 0,
kernel_mmr_size: 0,
pow: ProofOfWork::default(),
@@ -221,7 +216,6 @@ impl Readable for BlockHeader {
let range_proof_root = Hash::read(reader)?;
let kernel_root = Hash::read(reader)?;
let total_kernel_offset = BlindingFactor::read(reader)?;
let total_kernel_sum = Commitment::read(reader)?;
let (output_mmr_size, kernel_mmr_size) = ser_multiread!(reader, read_u64, read_u64);
let mut pow = ProofOfWork::read(version, reader)?;
if version == 1 {
@@ -243,7 +237,6 @@ impl Readable for BlockHeader {
range_proof_root,
kernel_root,
total_kernel_offset,
total_kernel_sum,
output_mmr_size,
kernel_mmr_size,
pow,
@@ -271,7 +264,6 @@ impl BlockHeader {
[write_fixed_bytes, &self.range_proof_root],
[write_fixed_bytes, &self.kernel_root],
[write_fixed_bytes, &self.total_kernel_offset],
[write_fixed_bytes, &self.total_kernel_sum],
[write_u64, self.output_mmr_size],
[write_u64, self.kernel_mmr_size]
);
@@ -506,16 +498,6 @@ impl Block {
let total_kernel_offset =
committed::sum_kernel_offsets(vec![agg_tx.offset, prev.total_kernel_offset], vec![])?;
let total_kernel_sum = {
let zero_commit = secp_static::commit_to_zero_value();
let secp = static_secp_instance();
let secp = secp.lock().unwrap();
let mut excesses = map_vec!(agg_tx.kernels(), |x| x.excess());
excesses.push(prev.total_kernel_sum);
excesses.retain(|x| *x != zero_commit);
secp.commit_sum(excesses, vec![])?
};
let now = Utc::now().timestamp();
let timestamp = DateTime::<Utc>::from_utc(NaiveDateTime::from_timestamp(now, 0), Utc);
@@ -535,7 +517,6 @@ impl Block {
timestamp,
previous: prev.hash(),
total_kernel_offset,
total_kernel_sum,
pow: ProofOfWork {
total_difficulty: difficulty + prev.pow.total_difficulty,
..Default::default()
@@ -630,7 +611,6 @@ impl Block {
pub fn validate(
&self,
prev_kernel_offset: &BlindingFactor,
prev_kernel_sum: &Commitment,
verifier: Arc<RwLock<VerifierCache>>,
) -> Result<(Commitment), Error> {
self.body.validate(true, verifier)?;
@@ -654,12 +634,6 @@ impl Block {
let (_utxo_sum, kernel_sum) =
self.verify_kernel_sums(self.header.overage(), block_kernel_offset)?;
// check the block header's total kernel sum
let total_sum = committed::sum_commits(vec![kernel_sum, prev_kernel_sum.clone()], vec![])?;
if total_sum != self.header.total_kernel_sum {
return Err(Error::InvalidTotalKernelSum);
}
Ok(kernel_sum)
}