@@ -82,17 +82,6 @@ FUZZ_TARGET(rbf, .init = initialize_rbf)
82
82
}
83
83
}
84
84
85
- void CheckDiagramConcave (std::vector<FeeFrac>& diagram)
86
- {
87
- // Diagrams are in monotonically-decreasing feerate order.
88
- FeeFrac last_chunk = diagram.front ();
89
- for (size_t i = 1 ; i<diagram.size (); ++i) {
90
- FeeFrac next_chunk = diagram[i] - diagram[i-1 ];
91
- assert (next_chunk <= last_chunk);
92
- last_chunk = next_chunk;
93
- }
94
- }
95
-
96
85
FUZZ_TARGET (package_rbf, .init = initialize_package_rbf)
97
86
{
98
87
FuzzedDataProvider fuzzed_data_provider (buffer.data (), buffer.size ());
@@ -107,7 +96,7 @@ FUZZ_TARGET(package_rbf, .init = initialize_package_rbf)
107
96
std::vector<CTransaction> mempool_txs;
108
97
size_t iter{0 };
109
98
110
- int64_t replacement_vsize = fuzzed_data_provider.ConsumeIntegralInRange <int64_t >(1 , 1000000 );
99
+ int32_t replacement_vsize = fuzzed_data_provider.ConsumeIntegralInRange <int32_t >(1 , 1000000 );
111
100
112
101
// Keep track of the total vsize of CTxMemPoolEntry's being added to the mempool to avoid overflow
113
102
// Add replacement_vsize since this is added to new diagram during RBF check
@@ -167,32 +156,33 @@ FUZZ_TARGET(package_rbf, .init = initialize_package_rbf)
167
156
pool.CalculateDescendants (txiter, all_conflicts);
168
157
}
169
158
170
- // Calculate the feerate diagrams for a replacement.
159
+ // Calculate the chunks for a replacement.
171
160
CAmount replacement_fees = ConsumeMoney (fuzzed_data_provider);
172
- auto calc_results{pool.CalculateFeerateDiagramsForRBF (replacement_fees, replacement_vsize, direct_conflicts, all_conflicts)};
161
+ auto calc_results{pool.CalculateChunksForRBF (replacement_fees, replacement_vsize, direct_conflicts, all_conflicts)};
173
162
174
163
if (calc_results.has_value ()) {
175
- // Sanity checks on the diagrams .
164
+ // Sanity checks on the chunks .
176
165
177
- // Diagrams start at 0.
178
- assert (calc_results->first .front ().size == 0 );
179
- assert (calc_results->first .front ().fee == 0 );
180
- assert (calc_results->second .front ().size == 0 );
181
- assert (calc_results->second .front ().fee == 0 );
182
-
183
- CheckDiagramConcave (calc_results->first );
184
- CheckDiagramConcave (calc_results->second );
166
+ // Feerates are monotonically decreasing.
167
+ FeeFrac first_sum;
168
+ for (size_t i = 0 ; i < calc_results->first .size (); ++i) {
169
+ first_sum += calc_results->first [i];
170
+ if (i) assert (!(calc_results->first [i - 1 ] << calc_results->first [i]));
171
+ }
172
+ FeeFrac second_sum;
173
+ for (size_t i = 0 ; i < calc_results->second .size (); ++i) {
174
+ second_sum += calc_results->second [i];
175
+ if (i) assert (!(calc_results->second [i - 1 ] << calc_results->second [i]));
176
+ }
185
177
186
- CAmount replaced_fee{0 };
187
- int64_t replaced_size{0 };
178
+ FeeFrac replaced;
188
179
for (auto txiter : all_conflicts) {
189
- replaced_fee += txiter->GetModifiedFee ();
190
- replaced_size += txiter->GetTxSize ();
180
+ replaced. fee += txiter->GetModifiedFee ();
181
+ replaced. size += txiter->GetTxSize ();
191
182
}
192
- // The total fee of the new diagram should be the total fee of the old
193
- // diagram - replaced_fee + replacement_fees
194
- assert (calc_results->first .back ().fee - replaced_fee + replacement_fees == calc_results->second .back ().fee );
195
- assert (calc_results->first .back ().size - replaced_size + replacement_vsize == calc_results->second .back ().size );
183
+ // The total fee & size of the new diagram minus replaced fee & size should be the total
184
+ // fee & size of the old diagram minus replacement fee & size.
185
+ assert ((first_sum - replaced) == (second_sum - FeeFrac{replacement_fees, replacement_vsize}));
196
186
}
197
187
198
188
// If internals report error, wrapper should too
@@ -201,10 +191,12 @@ FUZZ_TARGET(package_rbf, .init = initialize_package_rbf)
201
191
assert (err_tuple.value ().first == DiagramCheckError::UNCALCULABLE);
202
192
} else {
203
193
// Diagram check succeeded
194
+ auto old_sum = std::accumulate (calc_results->first .begin (), calc_results->first .end (), FeeFrac{});
195
+ auto new_sum = std::accumulate (calc_results->second .begin (), calc_results->second .end (), FeeFrac{});
204
196
if (!err_tuple.has_value ()) {
205
197
// New diagram's final fee should always match or exceed old diagram's
206
- assert (calc_results-> first . back (). fee <= calc_results-> second . back () .fee );
207
- } else if (calc_results-> first . back (). fee > calc_results-> second . back () .fee ) {
198
+ assert (old_sum. fee <= new_sum .fee );
199
+ } else if (old_sum. fee > new_sum .fee ) {
208
200
// Or it failed, and if old diagram had higher fees, it should be a failure
209
201
assert (err_tuple.value ().first == DiagramCheckError::FAILURE);
210
202
}
0 commit comments