Merge pull request #3731

a66f152 Use median timestamp if current time renders a block invalid. (thaerkh)
This commit is contained in:
luigi1111 2018-05-30 15:44:25 -05:00
commit 4267a0bb51
No known key found for this signature in database
GPG key ID: F4ACA0183641E010
2 changed files with 15 additions and 6 deletions

View file

@ -1210,6 +1210,12 @@ bool Blockchain::create_block_template(block& b, const account_public_address& m
b.prev_id = get_tail_id(); b.prev_id = get_tail_id();
b.timestamp = time(NULL); b.timestamp = time(NULL);
uint64_t median_ts;
if (!check_block_timestamp(b, median_ts))
{
b.timestamp = median_ts;
}
diffic = get_difficulty_for_next_block(); diffic = get_difficulty_for_next_block();
CHECK_AND_ASSERT_MES(diffic, false, "difficulty overhead."); CHECK_AND_ASSERT_MES(diffic, false, "difficulty overhead.");
@ -3182,10 +3188,10 @@ uint64_t Blockchain::get_adjusted_time() const
} }
//------------------------------------------------------------------ //------------------------------------------------------------------
//TODO: revisit, has changed a bit on upstream //TODO: revisit, has changed a bit on upstream
bool Blockchain::check_block_timestamp(std::vector<uint64_t>& timestamps, const block& b) const bool Blockchain::check_block_timestamp(std::vector<uint64_t>& timestamps, const block& b, uint64_t& median_ts) const
{ {
LOG_PRINT_L3("Blockchain::" << __func__); LOG_PRINT_L3("Blockchain::" << __func__);
uint64_t median_ts = epee::misc_utils::median(timestamps); median_ts = epee::misc_utils::median(timestamps);
if(b.timestamp < median_ts) if(b.timestamp < median_ts)
{ {
@ -3203,7 +3209,7 @@ bool Blockchain::check_block_timestamp(std::vector<uint64_t>& timestamps, const
// true if the block's timestamp is not less than the timestamp of the // true if the block's timestamp is not less than the timestamp of the
// median of the selected blocks // median of the selected blocks
// false otherwise // false otherwise
bool Blockchain::check_block_timestamp(const block& b) const bool Blockchain::check_block_timestamp(const block& b, uint64_t& median_ts) const
{ {
LOG_PRINT_L3("Blockchain::" << __func__); LOG_PRINT_L3("Blockchain::" << __func__);
if(b.timestamp > get_adjusted_time() + CRYPTONOTE_BLOCK_FUTURE_TIME_LIMIT) if(b.timestamp > get_adjusted_time() + CRYPTONOTE_BLOCK_FUTURE_TIME_LIMIT)
@ -3228,7 +3234,7 @@ bool Blockchain::check_block_timestamp(const block& b) const
timestamps.push_back(m_db->get_block_timestamp(offset)); timestamps.push_back(m_db->get_block_timestamp(offset));
} }
return check_block_timestamp(timestamps, b); return check_block_timestamp(timestamps, b, median_ts);
} }
//------------------------------------------------------------------ //------------------------------------------------------------------
void Blockchain::return_tx_to_pool(std::vector<transaction> &txs) void Blockchain::return_tx_to_pool(std::vector<transaction> &txs)

View file

@ -1300,10 +1300,12 @@ namespace cryptonote
* false otherwise * false otherwise
* *
* @param b the block to be checked * @param b the block to be checked
* @param median_ts return-by-reference the median of timestamps
* *
* @return true if the block's timestamp is valid, otherwise false * @return true if the block's timestamp is valid, otherwise false
*/ */
bool check_block_timestamp(const block& b) const; bool check_block_timestamp(const block& b, uint64_t& median_ts) const;
bool check_block_timestamp(const block& b) const { uint64_t median_ts; return check_block_timestamp(b, median_ts); }
/** /**
* @brief checks a block's timestamp * @brief checks a block's timestamp
@ -1316,7 +1318,8 @@ namespace cryptonote
* *
* @return true if the block's timestamp is valid, otherwise false * @return true if the block's timestamp is valid, otherwise false
*/ */
bool check_block_timestamp(std::vector<uint64_t>& timestamps, const block& b) const; bool check_block_timestamp(std::vector<uint64_t>& timestamps, const block& b, uint64_t& median_ts) const;
bool check_block_timestamp(std::vector<uint64_t>& timestamps, const block& b) const { uint64_t median_ts; return check_block_timestamp(timestamps, b, median_ts); }
/** /**
* @brief get the "adjusted time" * @brief get the "adjusted time"