Fixes Bug in Transaction generation in ComplexMempool benchmark

Available in line 59 is made a reference , so contents of the coin can be modified

While generating transactions we select ancestors from available_coins ,in case we exhaust all the outputs of an entry in available_coins
then we need to remove it from available_coins before the next iteration of choosing a potential ancestor , it is now implemented with
this patch by ,As the index of the entry is randomly chosen from available_coins , In order to remove it from the vector if index of the
selected entry is not at the end of available_coins vector, it is swapped with the entry at the back of the vector , then the entry at the
end of available_coins is popped out.

Code generating outputs for the transaction is moved out of the loop, as it needs to be done only once before adding the transaction to ordered_coins
pull/826/head
Shorya 3 years ago
parent 83daf47898
commit 29e983386b

@ -56,7 +56,7 @@ static void ComplexMemPool(benchmark::Bench& bench)
size_t n_ancestors = det_rand.randrange(10)+1; size_t n_ancestors = det_rand.randrange(10)+1;
for (size_t ancestor = 0; ancestor < n_ancestors && !available_coins.empty(); ++ancestor){ for (size_t ancestor = 0; ancestor < n_ancestors && !available_coins.empty(); ++ancestor){
size_t idx = det_rand.randrange(available_coins.size()); size_t idx = det_rand.randrange(available_coins.size());
Available coin = available_coins[idx]; Available& coin = available_coins[idx];
uint256 hash = coin.ref->GetHash(); uint256 hash = coin.ref->GetHash();
// biased towards taking just one ancestor, but maybe more // biased towards taking just one ancestor, but maybe more
size_t n_to_take = det_rand.randrange(2) == 0 ? 1 : 1+det_rand.randrange(coin.ref->vout.size() - coin.vin_left); size_t n_to_take = det_rand.randrange(2) == 0 ? 1 : 1+det_rand.randrange(coin.ref->vout.size() - coin.vin_left);
@ -66,16 +66,18 @@ static void ComplexMemPool(benchmark::Bench& bench)
tx.vin.back().scriptSig = CScript() << coin.tx_count; tx.vin.back().scriptSig = CScript() << coin.tx_count;
tx.vin.back().scriptWitness.stack.push_back(CScriptNum(coin.tx_count).getvch()); tx.vin.back().scriptWitness.stack.push_back(CScriptNum(coin.tx_count).getvch());
} }
if (coin.vin_left == coin.ref->vin.size()) { if (coin.vin_left == coin.ref->vout.size()) {
coin = available_coins.back(); if(available_coins.size()-1!=idx){ // if idx is not the last index swap it with the end index
std::swap(available_coins[idx], available_coins.back());
}
available_coins.pop_back(); available_coins.pop_back();
} }
}
tx.vout.resize(det_rand.randrange(10)+2); tx.vout.resize(det_rand.randrange(10)+2);
for (auto& out : tx.vout) { for (auto& out : tx.vout) {
out.scriptPubKey = CScript() << CScriptNum(tx_counter) << OP_EQUAL; out.scriptPubKey = CScript() << CScriptNum(tx_counter) << OP_EQUAL;
out.nValue = 10 * COIN; out.nValue = 10 * COIN;
} }
}
ordered_coins.emplace_back(MakeTransactionRef(tx)); ordered_coins.emplace_back(MakeTransactionRef(tx));
available_coins.emplace_back(ordered_coins.back(), tx_counter++); available_coins.emplace_back(ordered_coins.back(), tx_counter++);
} }

Loading…
Cancel
Save