@@ -33,29 +33,6 @@ bool MutableTransactionSignatureCreator::CreateSig(const SigningProvider& provid
3333 return true ;
3434}
3535
36- static bool Sign1 (const SigningProvider& provider, const CKeyID& address, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector<valtype>& ret, SigVersion sigversion)
37- {
38- std::vector<unsigned char > vchSig;
39- if (!creator.CreateSig (provider, vchSig, address, scriptCode, sigversion))
40- return false ;
41- ret.push_back (vchSig);
42- return true ;
43- }
44-
45- static bool SignN (const SigningProvider& provider, const std::vector<valtype>& multisigdata, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector<valtype>& ret, SigVersion sigversion)
46- {
47- int nSigned = 0 ;
48- int nRequired = multisigdata.front ()[0 ];
49- for (unsigned int i = 1 ; i < multisigdata.size ()-1 && nSigned < nRequired; i++)
50- {
51- const valtype& pubkey = multisigdata[i];
52- CKeyID keyID = CPubKey (pubkey).GetID ();
53- if (Sign1 (provider, keyID, creator, scriptCode, ret, sigversion))
54- ++nSigned;
55- }
56- return nSigned==nRequired;
57- }
58-
5936/* *
6037 * Sign scriptPubKey using signature made with creator.
6138 * Signatures are returned in scriptSigRet (or returns false if scriptPubKey can't be signed),
@@ -68,6 +45,7 @@ static bool SignStep(const SigningProvider& provider, const BaseSignatureCreator
6845 CScript scriptRet;
6946 uint160 h160;
7047 ret.clear ();
48+ std::vector<unsigned char > sig;
7149
7250 std::vector<valtype> vSolutions;
7351 if (!Solver (scriptPubKey, whichTypeRet, vSolutions))
@@ -81,30 +59,40 @@ static bool SignStep(const SigningProvider& provider, const BaseSignatureCreator
8159 case TX_WITNESS_UNKNOWN:
8260 return false ;
8361 case TX_PUBKEY:
84- keyID = CPubKey (vSolutions[0 ]).GetID ();
85- return Sign1 (provider, keyID, creator, scriptPubKey, ret, sigversion);
86- case TX_PUBKEYHASH:
62+ if (!creator.CreateSig (provider, sig, CPubKey (vSolutions[0 ]).GetID (), scriptPubKey, sigversion)) return false ;
63+ ret.push_back (std::move (sig));
64+ return true ;
65+ case TX_PUBKEYHASH: {
8766 keyID = CKeyID (uint160 (vSolutions[0 ]));
88- if (!Sign1 (provider, keyID, creator, scriptPubKey, ret, sigversion))
89- return false ;
90- else
91- {
92- CPubKey vch;
93- provider.GetPubKey (keyID, vch);
94- ret.push_back (ToByteVector (vch));
95- }
67+ if (!creator.CreateSig (provider, sig, keyID, scriptPubKey, sigversion)) return false ;
68+ ret.push_back (std::move (sig));
69+ CPubKey pubkey;
70+ provider.GetPubKey (keyID, pubkey);
71+ ret.push_back (ToByteVector (pubkey));
9672 return true ;
73+ }
9774 case TX_SCRIPTHASH:
9875 if (provider.GetCScript (uint160 (vSolutions[0 ]), scriptRet)) {
9976 ret.push_back (std::vector<unsigned char >(scriptRet.begin (), scriptRet.end ()));
10077 return true ;
10178 }
10279 return false ;
10380
104- case TX_MULTISIG:
81+ case TX_MULTISIG: {
82+ size_t required = vSolutions.front ()[0 ];
10583 ret.push_back (valtype ()); // workaround CHECKMULTISIG bug
106- return (SignN (provider, vSolutions, creator, scriptPubKey, ret, sigversion));
107-
84+ for (size_t i = 1 ; i < vSolutions.size () - 1 ; ++i) {
85+ CPubKey pubkey = CPubKey (vSolutions[i]);
86+ if (ret.size () < required + 1 && creator.CreateSig (provider, sig, pubkey.GetID (), scriptPubKey, sigversion)) {
87+ ret.push_back (std::move (sig));
88+ }
89+ }
90+ bool ok = ret.size () == required + 1 ;
91+ for (size_t i = 0 ; i + ret.size () < required + 1 ; ++i) {
92+ ret.push_back (valtype ());
93+ }
94+ return ok;
95+ }
10896 case TX_WITNESS_V0_KEYHASH:
10997 ret.push_back (vSolutions[0 ]);
11098 return true ;
0 commit comments