From ad594b53dea0370311446fe594ce5a1701d7b7dc Mon Sep 17 00:00:00 2001 From: Antioch Peverell <30642645+antiochp@users.noreply.github.com> Date: Wed, 7 Feb 2018 12:23:48 -0500 Subject: [PATCH] Revert "add block validation consensus rule for block coinbase output" (#691) also fix tests for size of blocks etc. This reverts commit ecda870d70179a58a54f8bf8e1f0c9480d333374. --- core/src/consensus.rs | 18 ++++-------------- core/src/core/block.rs | 41 +++++++++++------------------------------ 2 files changed, 15 insertions(+), 44 deletions(-) diff --git a/core/src/consensus.rs b/core/src/consensus.rs index 8766e3f74..7dbc3aa11 100644 --- a/core/src/consensus.rs +++ b/core/src/consensus.rs @@ -44,16 +44,6 @@ pub fn reward(fee: u64) -> u64 { /// Number of blocks before a coinbase matures and can be spent pub const COINBASE_MATURITY: u64 = 1_000; -/// Max number of coinbase outputs in a valid block. -/// This is to prevent a miner generating an excessively large "compact block". -/// But we do techincally support blocks with multiple coinbase outputs/kernels. -pub const MAX_BLOCK_COINBASE_OUTPUTS: u64 = 1; - -/// Max number of coinbase kernels in a valid block. -/// This is to prevent a miner generating an excessively large "compact block". -/// But we do techincally support blocks with multiple coinbase outputs/kernels. -pub const MAX_BLOCK_COINBASE_KERNELS: u64 = 1; - /// Block interval, in seconds, the network will tune its next_target for. Note /// that we may reduce this value in the future as we get more data on mining /// with Cuckoo Cycle, networks improve and block propagation is optimized @@ -131,7 +121,7 @@ pub fn valid_header_version(height: u64, version: u16) -> bool { /// Time window in blocks to calculate block time median pub const MEDIAN_TIME_WINDOW: u64 = 11; -/// Index at half the desired median +/// Index at half the desired median pub const MEDIAN_TIME_INDEX: u64 = MEDIAN_TIME_WINDOW / 2; /// Number of blocks used to calculate difficulty adjustments @@ -181,8 +171,8 @@ impl fmt::Display for TargetError { /// The difficulty calculation is based on both Digishield and GravityWave /// family of difficulty computation, coming to something very close to Zcash. /// The refence difficulty is an average of the difficulty over a window of -/// DIFFICULTY_ADJUST_WINDOW blocks. The corresponding timespan is calculated -/// by using the difference between the median timestamps at the beginning +/// DIFFICULTY_ADJUST_WINDOW blocks. The corresponding timespan is calculated +/// by using the difference between the median timestamps at the beginning /// and the end of the window. pub fn next_difficulty(cursor: T) -> Result where @@ -202,7 +192,7 @@ where .fold(Difficulty::zero(), |sum, d| sum + d.clone().unwrap().1); // Obtain the median window for the earlier time period - // which is just the first MEDIAN_TIME_WINDOW elements + // which is just the first MEDIAN_TIME_WINDOW elements let mut window_earliest: Vec = diff_data.iter() .take(MEDIAN_TIME_WINDOW as usize) .map(|n| n.clone().unwrap().0) diff --git a/core/src/core/block.rs b/core/src/core/block.rs index 18c2d6059..ce5ea24ae 100644 --- a/core/src/core/block.rs +++ b/core/src/core/block.rs @@ -73,10 +73,6 @@ pub enum Error { /// The lock_height needed to be reached for the coinbase output to mature lock_height: u64, }, - /// Limit on number of coinbase outputs in a valid block. - CoinbaseOutputCountExceeded, - /// Limit on number of coinbase kernels in a valid block. - CoinbaseKernelCountExceeded, /// Other unspecified error condition Other(String) } @@ -234,14 +230,10 @@ impl Writeable for CompactBlock { try!(self.header.write(writer)); if writer.serialization_mode() != ser::SerializationMode::Hash { - // TODO - make these constants and put them somewhere reusable? - assert!(self.out_full.len() < 16); - assert!(self.kern_full.len() < 16); - ser_multiwrite!( writer, - [write_u8, self.out_full.len() as u8], - [write_u8, self.kern_full.len() as u8], + [write_u64, self.out_full.len() as u64], + [write_u64, self.kern_full.len() as u64], [write_u64, self.kern_ids.len() as u64] ); @@ -265,7 +257,7 @@ impl Readable for CompactBlock { let header = try!(BlockHeader::read(reader)); let (out_full_len, kern_full_len, kern_id_len) = - ser_multiread!(reader, read_u8, read_u8, read_u64); + ser_multiread!(reader, read_u64, read_u64, read_u64); let out_full = read_and_verify_sorted(reader, out_full_len as u64)?; let kern_full = read_and_verify_sorted(reader, kern_full_len as u64)?; @@ -670,12 +662,11 @@ impl Block { Ok(()) } - /// Validate the coinbase outputs generated by miners. Entails 3 main checks: - /// - /// * That the block does not exceed the number of permitted coinbase outputs or kernels. - /// * That the sum of all coinbase-marked outputs equal the supply. - /// * That the sum of blinding factors for all coinbase-marked outputs match - /// the coinbase-marked kernels. + // Validate the coinbase outputs generated by miners. Entails 2 main checks: + // + // * That the sum of all coinbase-marked outputs equal the supply. + // * That the sum of blinding factors for all coinbase-marked outputs match + // the coinbase-marked kernels. fn verify_coinbase(&self) -> Result<(), Error> { let cb_outs = self.outputs .iter() @@ -689,16 +680,6 @@ impl Block { .cloned() .collect::>(); - // First check that we do not have too many coinbase outputs in the block. - if cb_outs.len() as u64 > consensus::MAX_BLOCK_COINBASE_OUTPUTS { - return Err(Error::CoinbaseOutputCountExceeded); - } - - // And that we do not have too many coinbase kernels in the block. - if cb_kerns.len() as u64 > consensus::MAX_BLOCK_COINBASE_KERNELS { - return Err(Error::CoinbaseKernelCountExceeded); - } - let over_commit; let out_adjust_sum; let kerns_sum; @@ -1054,7 +1035,7 @@ mod test { ser::serialize(&mut vec, &b.as_compact_block()).expect("serialization failed"); assert_eq!( vec.len(), - 5_662 + 5_676 ); } @@ -1067,7 +1048,7 @@ mod test { ser::serialize(&mut vec, &b.as_compact_block()).expect("serialization failed"); assert_eq!( vec.len(), - 5_668 + 5_682 ); } @@ -1111,7 +1092,7 @@ mod test { ser::serialize(&mut vec, &b.as_compact_block()).expect("serialization failed"); assert_eq!( vec.len(), - 5_722 + 5_736 ); }