Skip to content

Commit d052f5e

Browse files
committed
Merge #16841: Replace GetScriptForWitness with GetScriptForDestination
7966aa4 Add variables for repeated scripts (MeshCollider) fec8336 Remove GetScriptForWitness function (MeshCollider) b887060 Replace usage of GetScriptForWitness with GetScriptForDestination (MeshCollider) Pull request description: As per this TODO in the code: > TODO: replace calls to GetScriptForWitness with GetScriptForDestination using the various witness-specific CTxDestination subtypes. The commit "Add additional check for P2SH before adding extra wrapper" also adds an additional check that the scriptPubKey is a P2SH before auto-wrapping the witness script. We shouldn't wrap the witness script if not. Note: #16251 is even better than this check, please review that. ACKs for top commit: instagibbs: ACK bitcoin/bitcoin@7966aa4 jonatack: Code review re-ACK 7966aa4 per `git range-diff b4d0366 ed266f7 7966aa4` achow101: re-ACK 7966aa4 only changes since last is rebase. Tree-SHA512: 3449e0e83bd842acc7c94544a85367da97ac20d859eefc1a618caef0c98204398c266fe8fb9600b78326df5175402e1ae4a132eb766e2c4485e7cda6a2a95c43
2 parents a0e75bd + 7966aa4 commit d052f5e

File tree

8 files changed

+41
-66
lines changed

8 files changed

+41
-66
lines changed

src/bitcoin-tx.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -320,8 +320,8 @@ static void MutateTxAddOutPubKey(CMutableTransaction& tx, const std::string& str
320320
if (!pubkey.IsCompressed()) {
321321
throw std::runtime_error("Uncompressed pubkeys are not useable for SegWit outputs");
322322
}
323-
// Call GetScriptForWitness() to build a P2WSH scriptPubKey
324-
scriptPubKey = GetScriptForWitness(scriptPubKey);
323+
// Build a P2WPKH script
324+
scriptPubKey = GetScriptForDestination(WitnessV0KeyHash(pubkey));
325325
}
326326
if (bScriptHash) {
327327
// Get the ID for the script, and then construct a P2SH destination for it.
@@ -390,8 +390,8 @@ static void MutateTxAddOutMultiSig(CMutableTransaction& tx, const std::string& s
390390
throw std::runtime_error("Uncompressed pubkeys are not useable for SegWit outputs");
391391
}
392392
}
393-
// Call GetScriptForWitness() to build a P2WSH scriptPubKey
394-
scriptPubKey = GetScriptForWitness(scriptPubKey);
393+
// Build a P2WSH with the multisig script
394+
scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(scriptPubKey));
395395
}
396396
if (bScriptHash) {
397397
if (scriptPubKey.size() > MAX_SCRIPT_ELEMENT_SIZE) {
@@ -464,7 +464,7 @@ static void MutateTxAddOutScript(CMutableTransaction& tx, const std::string& str
464464
}
465465

466466
if (bSegWit) {
467-
scriptPubKey = GetScriptForWitness(scriptPubKey);
467+
scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(scriptPubKey));
468468
}
469469
if (bScriptHash) {
470470
if (scriptPubKey.size() > MAX_SCRIPT_ELEMENT_SIZE) {

src/script/standard.cpp

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -313,18 +313,6 @@ CScript GetScriptForMultisig(int nRequired, const std::vector<CPubKey>& keys)
313313
return script;
314314
}
315315

316-
CScript GetScriptForWitness(const CScript& redeemscript)
317-
{
318-
std::vector<std::vector<unsigned char> > vSolutions;
319-
TxoutType typ = Solver(redeemscript, vSolutions);
320-
if (typ == TxoutType::PUBKEY) {
321-
return GetScriptForDestination(WitnessV0KeyHash(Hash160(vSolutions[0])));
322-
} else if (typ == TxoutType::PUBKEYHASH) {
323-
return GetScriptForDestination(WitnessV0KeyHash(uint160{vSolutions[0]}));
324-
}
325-
return GetScriptForDestination(WitnessV0ScriptHash(redeemscript));
326-
}
327-
328316
bool IsValidDestination(const CTxDestination& dest) {
329317
return dest.which() != 0;
330318
}

src/script/standard.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -263,14 +263,4 @@ CScript GetScriptForRawPubKey(const CPubKey& pubkey);
263263
/** Generate a multisig script. */
264264
CScript GetScriptForMultisig(int nRequired, const std::vector<CPubKey>& keys);
265265

266-
/**
267-
* Generate a pay-to-witness script for the given redeem script. If the redeem
268-
* script is P2PK or P2PKH, this returns a P2WPKH script, otherwise it returns a
269-
* P2WSH script.
270-
*
271-
* TODO: replace calls to GetScriptForWitness with GetScriptForDestination using
272-
* the various witness-specific CTxDestination subtypes.
273-
*/
274-
CScript GetScriptForWitness(const CScript& redeemscript);
275-
276266
#endif // BITCOIN_SCRIPT_STANDARD_H

src/test/fuzz/script.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,6 @@ void test_one_input(const std::vector<uint8_t>& buffer)
6363
int required_ret;
6464
(void)ExtractDestinations(script, type_ret, addresses, required_ret);
6565

66-
(void)GetScriptForWitness(script);
67-
6866
const FlatSigningProvider signing_provider;
6967
(void)InferDescriptor(script, signing_provider);
7068

src/test/script_standard_tests.cpp

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -349,21 +349,16 @@ BOOST_AUTO_TEST_CASE(script_standard_GetScriptFor_)
349349
result = GetScriptForMultisig(2, std::vector<CPubKey>(pubkeys, pubkeys + 3));
350350
BOOST_CHECK(result == expected);
351351

352-
// GetScriptForWitness
353-
CScript witnessScript;
354-
355-
witnessScript << ToByteVector(pubkeys[0]) << OP_CHECKSIG;
352+
// WitnessV0KeyHash
356353
expected.clear();
357354
expected << OP_0 << ToByteVector(pubkeys[0].GetID());
358-
result = GetScriptForWitness(witnessScript);
355+
result = GetScriptForDestination(WitnessV0KeyHash(Hash160(ToByteVector(pubkeys[0]))));
359356
BOOST_CHECK(result == expected);
360-
361-
witnessScript.clear();
362-
witnessScript << OP_DUP << OP_HASH160 << ToByteVector(pubkeys[0].GetID()) << OP_EQUALVERIFY << OP_CHECKSIG;
363-
result = GetScriptForWitness(witnessScript);
357+
result = GetScriptForDestination(WitnessV0KeyHash(pubkeys[0].GetID()));
364358
BOOST_CHECK(result == expected);
365359

366-
witnessScript.clear();
360+
// WitnessV0ScriptHash (multisig)
361+
CScript witnessScript;
367362
witnessScript << OP_1 << ToByteVector(pubkeys[0]) << OP_1 << OP_CHECKMULTISIG;
368363

369364
uint256 scriptHash;
@@ -372,7 +367,7 @@ BOOST_AUTO_TEST_CASE(script_standard_GetScriptFor_)
372367

373368
expected.clear();
374369
expected << OP_0 << ToByteVector(scriptHash);
375-
result = GetScriptForWitness(witnessScript);
370+
result = GetScriptForDestination(WitnessV0ScriptHash(witnessScript));
376371
BOOST_CHECK(result == expected);
377372
}
378373

src/test/sigopcount_tests.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,7 @@ BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
154154

155155
// P2WPKH witness program
156156
{
157-
CScript p2pk = CScript() << ToByteVector(pubkey) << OP_CHECKSIG;
158-
CScript scriptPubKey = GetScriptForWitness(p2pk);
157+
CScript scriptPubKey = GetScriptForDestination(WitnessV0KeyHash(pubkey));
159158
CScript scriptSig = CScript();
160159
CScriptWitness scriptWitness;
161160
scriptWitness.stack.push_back(std::vector<unsigned char>(0));
@@ -183,8 +182,7 @@ BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
183182

184183
// P2WPKH nested in P2SH
185184
{
186-
CScript p2pk = CScript() << ToByteVector(pubkey) << OP_CHECKSIG;
187-
CScript scriptSig = GetScriptForWitness(p2pk);
185+
CScript scriptSig = GetScriptForDestination(WitnessV0KeyHash(pubkey));
188186
CScript scriptPubKey = GetScriptForDestination(ScriptHash(scriptSig));
189187
scriptSig = CScript() << ToByteVector(scriptSig);
190188
CScriptWitness scriptWitness;
@@ -199,7 +197,7 @@ BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
199197
// P2WSH witness program
200198
{
201199
CScript witnessScript = CScript() << 1 << ToByteVector(pubkey) << ToByteVector(pubkey) << 2 << OP_CHECKMULTISIGVERIFY;
202-
CScript scriptPubKey = GetScriptForWitness(witnessScript);
200+
CScript scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessScript));
203201
CScript scriptSig = CScript();
204202
CScriptWitness scriptWitness;
205203
scriptWitness.stack.push_back(std::vector<unsigned char>(0));
@@ -215,7 +213,7 @@ BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
215213
// P2WSH nested in P2SH
216214
{
217215
CScript witnessScript = CScript() << 1 << ToByteVector(pubkey) << ToByteVector(pubkey) << 2 << OP_CHECKMULTISIGVERIFY;
218-
CScript redeemScript = GetScriptForWitness(witnessScript);
216+
CScript redeemScript = GetScriptForDestination(WitnessV0ScriptHash(witnessScript));
219217
CScript scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
220218
CScript scriptSig = CScript() << ToByteVector(redeemScript);
221219
CScriptWitness scriptWitness;

src/test/transaction_tests.cpp

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -501,13 +501,19 @@ BOOST_AUTO_TEST_CASE(test_witness)
501501
BOOST_CHECK(keystore.AddCScript(scriptPubkey1L));
502502
BOOST_CHECK(keystore.AddCScript(scriptPubkey2L));
503503
BOOST_CHECK(keystore.AddCScript(scriptMulti));
504-
BOOST_CHECK(keystore.AddCScript(GetScriptForWitness(scriptPubkey1)));
505-
BOOST_CHECK(keystore.AddCScript(GetScriptForWitness(scriptPubkey2)));
506-
BOOST_CHECK(keystore.AddCScript(GetScriptForWitness(scriptPubkey1L)));
507-
BOOST_CHECK(keystore.AddCScript(GetScriptForWitness(scriptPubkey2L)));
508-
BOOST_CHECK(keystore.AddCScript(GetScriptForWitness(scriptMulti)));
504+
CScript destination_script_1, destination_script_2, destination_script_1L, destination_script_2L, destination_script_multi;
505+
destination_script_1 = GetScriptForDestination(WitnessV0KeyHash(pubkey1));
506+
destination_script_2 = GetScriptForDestination(WitnessV0KeyHash(pubkey2));
507+
destination_script_1L = GetScriptForDestination(WitnessV0KeyHash(pubkey1L));
508+
destination_script_2L = GetScriptForDestination(WitnessV0KeyHash(pubkey2L));
509+
destination_script_multi = GetScriptForDestination(WitnessV0ScriptHash(scriptMulti));
510+
BOOST_CHECK(keystore.AddCScript(destination_script_1));
511+
BOOST_CHECK(keystore.AddCScript(destination_script_2));
512+
BOOST_CHECK(keystore.AddCScript(destination_script_1L));
513+
BOOST_CHECK(keystore.AddCScript(destination_script_2L));
514+
BOOST_CHECK(keystore.AddCScript(destination_script_multi));
509515
BOOST_CHECK(keystore2.AddCScript(scriptMulti));
510-
BOOST_CHECK(keystore2.AddCScript(GetScriptForWitness(scriptMulti)));
516+
BOOST_CHECK(keystore2.AddCScript(destination_script_multi));
511517
BOOST_CHECK(keystore2.AddKeyPubKey(key3, pubkey3));
512518

513519
CTransactionRef output1, output2;
@@ -539,8 +545,8 @@ BOOST_AUTO_TEST_CASE(test_witness)
539545
CheckWithFlag(output1, input2, STANDARD_SCRIPT_VERIFY_FLAGS, false);
540546

541547
// Witness pay-to-compressed-pubkey (v0).
542-
CreateCreditAndSpend(keystore, GetScriptForWitness(scriptPubkey1), output1, input1);
543-
CreateCreditAndSpend(keystore, GetScriptForWitness(scriptPubkey2), output2, input2);
548+
CreateCreditAndSpend(keystore, destination_script_1, output1, input1);
549+
CreateCreditAndSpend(keystore, destination_script_2, output2, input2);
544550
CheckWithFlag(output1, input1, 0, true);
545551
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
546552
CheckWithFlag(output1, input1, SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true);
@@ -551,9 +557,9 @@ BOOST_AUTO_TEST_CASE(test_witness)
551557
CheckWithFlag(output1, input2, STANDARD_SCRIPT_VERIFY_FLAGS, false);
552558

553559
// P2SH witness pay-to-compressed-pubkey (v0).
554-
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(GetScriptForWitness(scriptPubkey1))), output1, input1);
555-
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(GetScriptForWitness(scriptPubkey2))), output2, input2);
556-
ReplaceRedeemScript(input2.vin[0].scriptSig, GetScriptForWitness(scriptPubkey1));
560+
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(destination_script_1)), output1, input1);
561+
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(destination_script_2)), output2, input2);
562+
ReplaceRedeemScript(input2.vin[0].scriptSig, destination_script_1);
557563
CheckWithFlag(output1, input1, 0, true);
558564
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
559565
CheckWithFlag(output1, input1, SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true);
@@ -589,12 +595,12 @@ BOOST_AUTO_TEST_CASE(test_witness)
589595
CheckWithFlag(output1, input2, STANDARD_SCRIPT_VERIFY_FLAGS, false);
590596

591597
// Signing disabled for witness pay-to-uncompressed-pubkey (v1).
592-
CreateCreditAndSpend(keystore, GetScriptForWitness(scriptPubkey1L), output1, input1, false);
593-
CreateCreditAndSpend(keystore, GetScriptForWitness(scriptPubkey2L), output2, input2, false);
598+
CreateCreditAndSpend(keystore, destination_script_1L, output1, input1, false);
599+
CreateCreditAndSpend(keystore, destination_script_2L, output2, input2, false);
594600

595601
// Signing disabled for P2SH witness pay-to-uncompressed-pubkey (v1).
596-
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(GetScriptForWitness(scriptPubkey1L))), output1, input1, false);
597-
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(GetScriptForWitness(scriptPubkey2L))), output2, input2, false);
602+
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(destination_script_1L)), output1, input1, false);
603+
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(destination_script_2L)), output2, input2, false);
598604

599605
// Normal 2-of-2 multisig
600606
CreateCreditAndSpend(keystore, scriptMulti, output1, input1, false);
@@ -618,10 +624,10 @@ BOOST_AUTO_TEST_CASE(test_witness)
618624
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
619625

620626
// Witness 2-of-2 multisig
621-
CreateCreditAndSpend(keystore, GetScriptForWitness(scriptMulti), output1, input1, false);
627+
CreateCreditAndSpend(keystore, destination_script_multi, output1, input1, false);
622628
CheckWithFlag(output1, input1, 0, true);
623629
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
624-
CreateCreditAndSpend(keystore2, GetScriptForWitness(scriptMulti), output2, input2, false);
630+
CreateCreditAndSpend(keystore2, destination_script_multi, output2, input2, false);
625631
CheckWithFlag(output2, input2, 0, true);
626632
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
627633
BOOST_CHECK(*output1 == *output2);
@@ -630,10 +636,10 @@ BOOST_AUTO_TEST_CASE(test_witness)
630636
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
631637

632638
// P2SH witness 2-of-2 multisig
633-
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(GetScriptForWitness(scriptMulti))), output1, input1, false);
639+
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(destination_script_multi)), output1, input1, false);
634640
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
635641
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
636-
CreateCreditAndSpend(keystore2, GetScriptForDestination(ScriptHash(GetScriptForWitness(scriptMulti))), output2, input2, false);
642+
CreateCreditAndSpend(keystore2, GetScriptForDestination(ScriptHash(destination_script_multi)), output2, input2, false);
637643
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH, true);
638644
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
639645
BOOST_CHECK(*output1 == *output2);

src/test/txvalidationcache_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
157157
CScript p2pk_scriptPubKey = CScript() << ToByteVector(coinbaseKey.GetPubKey()) << OP_CHECKSIG;
158158
CScript p2sh_scriptPubKey = GetScriptForDestination(ScriptHash(p2pk_scriptPubKey));
159159
CScript p2pkh_scriptPubKey = GetScriptForDestination(PKHash(coinbaseKey.GetPubKey()));
160-
CScript p2wpkh_scriptPubKey = GetScriptForWitness(p2pkh_scriptPubKey);
160+
CScript p2wpkh_scriptPubKey = GetScriptForDestination(WitnessV0KeyHash(coinbaseKey.GetPubKey()));
161161

162162
FillableSigningProvider keystore;
163163
BOOST_CHECK(keystore.AddKey(coinbaseKey));

0 commit comments

Comments
 (0)