Skip to content

Commit ed7d224

Browse files
committed
test: add BulkTransaction helper to unit test transaction utils
The padding method used matches the one used in MiniWallet, `MiniWallet._bulk_tx`.
1 parent d4b5553 commit ed7d224

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

src/test/util/transaction_utils.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
44

55
#include <coins.h>
6+
#include <consensus/validation.h>
67
#include <script/signingprovider.h>
78
#include <test/util/transaction_utils.h>
89

@@ -69,3 +70,23 @@ std::vector<CMutableTransaction> SetupDummyInputs(FillableSigningProvider& keyst
6970

7071
return dummyTransactions;
7172
}
73+
74+
void BulkTransaction(CMutableTransaction& tx, int32_t target_weight)
75+
{
76+
tx.vout.emplace_back(0, CScript() << OP_RETURN);
77+
auto unpadded_weight{GetTransactionWeight(CTransaction(tx))};
78+
assert(target_weight >= unpadded_weight);
79+
80+
// determine number of needed padding bytes by converting weight difference to vbytes
81+
auto dummy_vbytes = (target_weight - unpadded_weight + (WITNESS_SCALE_FACTOR - 1)) / WITNESS_SCALE_FACTOR;
82+
// compensate for the increase of the compact-size encoded script length
83+
// (note that the length encoding of the unpadded output script needs one byte)
84+
dummy_vbytes -= GetSizeOfCompactSize(dummy_vbytes) - 1;
85+
86+
// pad transaction by repeatedly appending a dummy opcode to the output script
87+
tx.vout[0].scriptPubKey.insert(tx.vout[0].scriptPubKey.end(), dummy_vbytes, OP_1);
88+
89+
// actual weight should be at most 3 higher than target weight
90+
assert(GetTransactionWeight(CTransaction(tx)) >= target_weight);
91+
assert(GetTransactionWeight(CTransaction(tx)) <= target_weight + 3);
92+
}

src/test/util/transaction_utils.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,8 @@ CMutableTransaction BuildSpendingTransaction(const CScript& scriptSig, const CSc
2626
// the second nValues[2] and nValues[3] outputs paid to a TxoutType::PUBKEYHASH.
2727
std::vector<CMutableTransaction> SetupDummyInputs(FillableSigningProvider& keystoreRet, CCoinsViewCache& coinsRet, const std::array<CAmount,4>& nValues);
2828

29+
// bulk transaction to reach a certain target weight,
30+
// by appending a single output with padded output script
31+
void BulkTransaction(CMutableTransaction& tx, int32_t target_weight);
32+
2933
#endif // BITCOIN_TEST_UTIL_TRANSACTION_UTILS_H

0 commit comments

Comments
 (0)