From 22d3dc9a45e8211cb756f7fdd70f8e8f5fd63d31 Mon Sep 17 00:00:00 2001 From: fuwa Date: Thu, 6 Jun 2019 09:05:39 +0800 Subject: [PATCH] fix old bulletproof conditional branches --- src/cryptonote_basic/cryptonote_format_utils.cpp | 8 +++++++- src/cryptonote_core/cryptonote_core.cpp | 2 +- src/ringct/rctSigs.cpp | 4 ++-- src/ringct/rctTypes.cpp | 5 +++++ src/ringct/rctTypes.h | 1 + 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/cryptonote_basic/cryptonote_format_utils.cpp b/src/cryptonote_basic/cryptonote_format_utils.cpp index 29133fbf5..e8b3aa805 100644 --- a/src/cryptonote_basic/cryptonote_format_utils.cpp +++ b/src/cryptonote_basic/cryptonote_format_utils.cpp @@ -164,7 +164,7 @@ namespace cryptonote if (!base_only) { const bool bulletproof = rct::is_rct_bulletproof(rv.type); - if (bulletproof && rv.type == rct::RCTTypeBulletproof) + if (rct::is_rct_new_bulletproof(rv.type)) { if (rv.p.bulletproofs.size() != 1) { @@ -430,6 +430,12 @@ namespace cryptonote const rct::rctSig &rv = tx.rct_signatures; if (!rct::is_rct_bulletproof(rv.type)) return blob_size; + const size_t n_outputs = tx.vout.size(); + if (n_outputs <= 2) + return blob_size; + if (rct::is_rct_old_bulletproof(rv.type)) + return blob_size; + const uint64_t bp_base = 368; const size_t n_padded_outputs = rct::n_bulletproof_max_amounts(rv.p.bulletproofs); uint64_t bp_clawback = get_transaction_weight_clawback(tx, n_padded_outputs); CHECK_AND_ASSERT_THROW_MES_L1(bp_clawback <= std::numeric_limits::max() - blob_size, "Weight overflow"); diff --git a/src/cryptonote_core/cryptonote_core.cpp b/src/cryptonote_core/cryptonote_core.cpp index 15b54f1e1..1d20d8d24 100644 --- a/src/cryptonote_core/cryptonote_core.cpp +++ b/src/cryptonote_core/cryptonote_core.cpp @@ -833,7 +833,7 @@ namespace cryptonote if (tx.version >= 2) { rct::rctSig &rv = tx.rct_signatures; - if (rv.type != rct::RCTTypeBulletproof){ + if (!rct::is_rct_new_bulletproof(rv.type)){ if (rv.outPk.size() != tx.vout.size()) { LOG_PRINT_L1("WRONG TRANSACTION BLOB, Bad outPk size in tx " << tx_hash << ", rejected"); diff --git a/src/ringct/rctSigs.cpp b/src/ringct/rctSigs.cpp index b6e73e744..c4f0417f2 100644 --- a/src/ringct/rctSigs.cpp +++ b/src/ringct/rctSigs.cpp @@ -1104,7 +1104,7 @@ namespace rct { tools::threadpool::waiter waiter; std::deque results(bulletproof ? rv.p.bulletproofs.size() : rv.outPk.size(), false); DP("range proofs verified?"); - if (bulletproof && rv.type == RCTTypeBulletproof) + if (rct::is_rct_new_bulletproof(rv.type)) { for (size_t i = 0; i < rv.p.bulletproofs.size(); i++) tpool.submit(&waiter, [&, i] { results[i] = verBulletproof(rv.p.bulletproofs[i]); }); @@ -1237,7 +1237,7 @@ namespace rct { for (const rctSig *rvp: rvv) { const rctSig &rv = *rvp; - if (rv.type != RCTTypeBulletproof){ + if (!rct::is_rct_new_bulletproof(rv.type)){ if (!proofs.empty() && !verBulletproof_old(proofs)) { LOG_PRINT_L1("Aggregate range proof verified failed"); diff --git a/src/ringct/rctTypes.cpp b/src/ringct/rctTypes.cpp index 546226858..0cf1cbe5d 100644 --- a/src/ringct/rctTypes.cpp +++ b/src/ringct/rctTypes.cpp @@ -228,6 +228,11 @@ namespace rct { } } + bool is_rct_new_bulletproof(int type) + { + return is_rct_bulletproof(type) && !is_rct_old_bulletproof(type); + } + bool is_rct_borromean(int type) { switch (type) diff --git a/src/ringct/rctTypes.h b/src/ringct/rctTypes.h index 903246a4d..3336d7cac 100644 --- a/src/ringct/rctTypes.h +++ b/src/ringct/rctTypes.h @@ -575,6 +575,7 @@ namespace rct { bool is_rct_simple(int type); bool is_rct_bulletproof(int type); bool is_rct_old_bulletproof(int type); + bool is_rct_new_bulletproof(int type); bool is_rct_borromean(int type); static inline const rct::key &pk2rct(const crypto::public_key &pk) { return (const rct::key&)pk; }