MCPcopy Create free account
hub / github.com/bitcoin/bitcoin / SignTransactionSingleInput

Function SignTransactionSingleInput

src/bench/sign_transaction.cpp:29–74  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

27};
28
29static void SignTransactionSingleInput(benchmark::Bench& bench, InputType input_type)
30{
31 ECC_Context ecc_context{};
32
33 FlatSigningProvider keystore;
34 std::vector<CScript> prev_spks;
35
36 // Create a bunch of keys / UTXOs to avoid signing with the same key repeatedly
37 for (int i = 0; i < 32; i++) {
38 CKey privkey = GenerateRandomKey();
39 CPubKey pubkey = privkey.GetPubKey();
40 CKeyID key_id = pubkey.GetID();
41 keystore.keys.emplace(key_id, privkey);
42 keystore.pubkeys.emplace(key_id, pubkey);
43
44 // Create specified locking script type
45 CScript prev_spk = [&]() {
46 switch (input_type) {
47 case InputType::P2WPKH:
48 return GetScriptForDestination(WitnessV0KeyHash(pubkey));
49 case InputType::P2TR:
50 return GetScriptForDestination(WitnessV1Taproot(XOnlyPubKey{pubkey}));
51 } // no default case, so the compiler can warn about missing cases
52 assert(false);
53 }();
54 prev_spks.push_back(prev_spk);
55 }
56
57 // Simple 1-input tx with artificial outpoint
58 // (note that for the purpose of signing with SIGHASH_ALL we don't need any outputs)
59 COutPoint prevout{/*hashIn=*/Txid::FromUint256(uint256::ONE), /*nIn=*/1337};
60 CMutableTransaction unsigned_tx;
61 unsigned_tx.vin.emplace_back(prevout);
62
63 // Benchmark.
64 int iter = 0;
65 bench.minEpochIterations(100).run([&] {
66 CMutableTransaction tx{unsigned_tx};
67 std::map<COutPoint, Coin> coins;
68 const CScript& prev_spk = prev_spks[(iter++) % prev_spks.size()];
69 coins[prevout] = Coin(CTxOut(10000, prev_spk), /*nHeightIn=*/100, /*fCoinBaseIn=*/false);
70 std::map<int, bilingual_str> input_errors;
71 bool complete = SignTransaction(tx, &keystore, coins, {.sighash_type = SIGHASH_ALL}, input_errors);
72 assert(complete);
73 });
74}
75
76static void SignTransactionECDSA(benchmark::Bench& bench) { SignTransactionSingleInput(bench, InputType::P2WPKH); }
77static void SignTransactionSchnorr(benchmark::Bench& bench) { SignTransactionSingleInput(bench, InputType::P2TR); }

Callers 2

SignTransactionECDSAFunction · 0.85
SignTransactionSchnorrFunction · 0.85

Calls 15

GenerateRandomKeyFunction · 0.85
GetScriptForDestinationFunction · 0.85
WitnessV0KeyHashClass · 0.85
WitnessV1TaprootClass · 0.85
emplaceMethod · 0.80
minEpochIterationsMethod · 0.80
CoinClass · 0.50
CTxOutClass · 0.50
SignTransactionFunction · 0.50
GetPubKeyMethod · 0.45
GetIDMethod · 0.45
push_backMethod · 0.45

Tested by

no test coverage detected