From 92748d56d2498acd6a724263ff025c9b6323b0df Mon Sep 17 00:00:00 2001 From: who-biz <37732338+who-biz@users.noreply.github.com> Date: Wed, 10 Jul 2019 00:02:54 -0400 Subject: [PATCH] Fix block verification, move iteration halving to format_utils --- src/crypto/slow-hash.c | 15 +++++-------- .../cryptonote_format_utils.cpp | 22 +++++++++---------- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/crypto/slow-hash.c b/src/crypto/slow-hash.c index 2851939d..ade1b858 100644 --- a/src/crypto/slow-hash.c +++ b/src/crypto/slow-hash.c @@ -772,8 +772,7 @@ void cn_slow_hash(const void *data, size_t length, char *hash, int variant, int // the useAes test is only performed once, not every iteration. if(useAes) { - uint32_t iters_var = variant > 1 ? (iters >> 1) : iters; - for(i = 0; i < iters_var; i++) + for(i = 0; i < iters; i++) { pre_aes(); _c = _mm_aesenc_si128(_c, _a); @@ -782,8 +781,7 @@ void cn_slow_hash(const void *data, size_t length, char *hash, int variant, int } else { - uint32_t iters_var = variant > 1 ? (iters >> 1) : iters; - for(i = 0; i < iters_var; i++) + for(i = 0; i < iters; i++) { pre_aes(); aesb_single_round((uint8_t *) &_c, (uint8_t *) &_c, (uint8_t *) &_a); @@ -1127,8 +1125,7 @@ void cn_slow_hash(const void *data, size_t length, char *hash, int variant, int _b1 = vld1q_u8(((const uint8_t *)b) + AES_BLOCK_SIZE); - uint32_t iters_var = variant > 1 ? (iters >> 1) : iters; - for(i = 0; i < iters_var; i++) + for(i = 0; i < iters; i++) { pre_aes(); _c = vaeseq_u8(_c, zero); @@ -1335,8 +1332,7 @@ void cn_slow_hash(const void *data, size_t length, char *hash, int variant, int U64(b)[0] = U64(&state.k[16])[0] ^ U64(&state.k[48])[0]; U64(b)[1] = U64(&state.k[16])[1] ^ U64(&state.k[48])[1]; - uint32_t iters_var = variant > 1 ? (iters >> 1) : iters; - for(i = 0; i < iters_var; i++) + for(i = 0; i < iters; i++) { #define MASK ((uint32_t)(((MEMORY / AES_BLOCK_SIZE) - 1) << 4)) #define state_index(x) ((*(uint32_t *) x) & MASK) @@ -1523,8 +1519,7 @@ void cn_slow_hash(const void *data, size_t length, char *hash, int variant, int b[i] = state.k[AES_BLOCK_SIZE + i] ^ state.k[AES_BLOCK_SIZE * 3 + i]; } - uint32_t iters_var = variant > 1 ? (iters >> 1) : iters; - for(i = 0; i < iters_var; i++) { + for(i = 0; i < iters; i++) { /* Dependency chain: address -> read value ------+ * written value <-+ hard function (AES or MUL) <+ * next address <-+ diff --git a/src/cryptonote_basic/cryptonote_format_utils.cpp b/src/cryptonote_basic/cryptonote_format_utils.cpp index 435d770c..818a4f3c 100644 --- a/src/cryptonote_basic/cryptonote_format_utils.cpp +++ b/src/cryptonote_basic/cryptonote_format_utils.cpp @@ -132,7 +132,7 @@ namespace cryptonote //--------------------------------------------------------------- bool expand_transaction_1(transaction &tx, bool base_only) { - if (tx.version >= 2 && !is_coinbase(tx)) + if (tx.version >= 1 && !is_coinbase(tx)) { rct::rctSig &rv = tx.rct_signatures; if (rv.outPk.size() != tx.vout.size()) @@ -369,13 +369,11 @@ namespace cryptonote return r; } //--------------------------------------------------------------- - bool parse_tx_extra(const std::vector& tx_extra, std::vector& tx_extra_fields) + bool parse_tx_extra(const std::vector& tx_extra, std::vector& tx_extra_fields) { tx_extra_fields.clear(); - if(tx_extra.empty()) return true; - std::string extra_str(reinterpret_cast(tx_extra.data()), tx_extra.size()); std::istringstream iss(extra_str); binary_archive ar(iss); @@ -640,8 +638,6 @@ namespace cryptonote { std::string res = string_tools::pod_to_hex(h); CHECK_AND_ASSERT_MES(res.size() == 64, res, "wrong hash256 with string_tools::pod_to_hex conversion"); - auto erased_pos = res.erase(8, 48); - res.insert(8, "...."); return res; } //--------------------------------------------------------------- @@ -847,9 +843,7 @@ namespace cryptonote { if (t.is_hash_valid()) { -#ifdef ENABLE_HASH_CASH_INTEGRITY_CHECK CHECK_AND_ASSERT_THROW_MES(!calculate_transaction_hash(t, res, blob_size) || t.hash == res, "tx hash cash integrity failure"); -#endif res = t.hash; if (blob_size) { @@ -901,9 +895,7 @@ namespace cryptonote { if (b.is_hash_valid()) { -#ifdef ENABLE_HASH_CASH_INTEGRITY_CHECK CHECK_AND_ASSERT_THROW_MES(!calculate_block_hash(b, res) || b.hash == res, "block hash cash integrity failure"); -#endif res = b.hash; ++block_hashes_cached_count; return true; @@ -930,14 +922,20 @@ namespace cryptonote const int cn_variant = b.major_version >= 5 ? ( b.major_version >= 8 ? 2 : 1 ) : 0; int cn_iters = b.major_version >= 6 ? ( b.major_version >= 7 ? 0x40000 : 0x20000 ) : 0x80000; - if (b.major_version <= 8) + if (b.major_version <= 7) + { + cn_iters += ((height + 1) & 0x3FF); + } + else if (b.major_version == 8) { cn_iters += ((height + 1) & 0x3FF); + cn_iters >>= 1; } else if (b.major_version == 9) { const uint64_t stamp = b.timestamp; cn_iters += (((stamp % height) + (height + 1)) & 0xFFF); + cn_iters >>= 1; } else if (b.major_version >= 10) { @@ -960,6 +958,8 @@ namespace cryptonote else if (!two) { cn_iters += (((stamp % id_num) + height) & 0x7FFF); } + cn_iters >>= 1; + LOG_PRINT_L2("\nIterations : "<< cn_iters); }