From 98683f44fe1a0dbd9baa3ea9b51be4c56be7c805 Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Tue, 10 Sep 2024 09:35:49 -0400 Subject: [PATCH 1/4] Make return type matched with declared function type so compiler return value optimization is performed --- libraries/chain/controller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index 7b5287f2d6..349ad371b4 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -3967,7 +3967,7 @@ struct controller_impl { "QC is_strong (${s1}) in block extension does not match is_strong_qc (${s2}) in header extension. Block number: ${b}", ("s1", qc_proof.is_strong())("s2", new_qc_claim.is_strong_qc)("b", block_num) ); - return qc_proof; + return std::optional{qc_proof}; } // verify legacy block invariants From f8f066da81e10db15180984a0768c0775f3dd2ce Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Tue, 10 Sep 2024 09:40:59 -0400 Subject: [PATCH 2/4] Only do to_qc_claim() conversion inside dlog() to avoid unnecesary conversion in normal path --- libraries/chain/controller.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index 349ad371b4..ba45515c78 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -4098,10 +4098,9 @@ struct controller_impl { if (qc) { verify_qc(b, prev, *qc); - const auto qc_claim = qc->to_qc_claim(); dlog("received block: #${bn} ${t} ${prod} ${id}, qc claim: ${qc_claim}, previous: ${p}", ("bn", b->block_num())("t", b->timestamp)("prod", b->producer)("id", id) - ("qc_claim", qc_claim)("p", b->previous)); + ("qc_claim", qc->to_qc_claim())("p", b->previous)); } } From 40044af62a58e2602340b931781ba3f33a377067 Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Tue, 10 Sep 2024 10:41:52 -0400 Subject: [PATCH 3/4] Change strictness to strength about QC claim in a comment --- libraries/chain/controller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index ba45515c78..4be7b694ce 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -3962,7 +3962,7 @@ struct controller_impl { "Block #${b}: Mismatch between qc.block_num (${n1}) in block extension and block_num (${n2}) in header extension", ("n1", qc_proof.block_num)("n2", new_qc_claim.block_num)("b", block_num) ); - // Verify claimed strictness is the same as in proof + // Verify claimed strength is the same as in proof EOS_ASSERT( qc_proof.is_strong() == new_qc_claim.is_strong_qc, invalid_qc_claim, "QC is_strong (${s1}) in block extension does not match is_strong_qc (${s2}) in header extension. Block number: ${b}", ("s1", qc_proof.is_strong())("s2", new_qc_claim.is_strong_qc)("b", block_num) ); From 4de8aa30d411b79c895891e37cd6270468b143ba Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Tue, 10 Sep 2024 13:14:16 -0400 Subject: [PATCH 4/4] Change exception type from invalid_qc_claim to block_validate_exception as consider the source of truth to be the QC claim in the block header --- libraries/chain/controller.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index 4be7b694ce..bf2dfbfad5 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -3958,12 +3958,12 @@ struct controller_impl { const auto& qc_proof = qc_ext.qc; // Check QC information in header extension and block extension match - EOS_ASSERT( qc_proof.block_num == new_qc_claim.block_num, invalid_qc_claim, + EOS_ASSERT( qc_proof.block_num == new_qc_claim.block_num, block_validate_exception, "Block #${b}: Mismatch between qc.block_num (${n1}) in block extension and block_num (${n2}) in header extension", ("n1", qc_proof.block_num)("n2", new_qc_claim.block_num)("b", block_num) ); // Verify claimed strength is the same as in proof - EOS_ASSERT( qc_proof.is_strong() == new_qc_claim.is_strong_qc, invalid_qc_claim, + EOS_ASSERT( qc_proof.is_strong() == new_qc_claim.is_strong_qc, block_validate_exception, "QC is_strong (${s1}) in block extension does not match is_strong_qc (${s2}) in header extension. Block number: ${b}", ("s1", qc_proof.is_strong())("s2", new_qc_claim.is_strong_qc)("b", block_num) );