Following #17261, the way to sign transactions, PSBTs, and messages was to use GetSigningProvider()
and get a SigningProvider
containing the private keys. However this may not be feasible for future ScriptPubKeyMan
s, such as for hardware wallets. Instead of exporting a SigningProvider
containing private keys, we need to pass these things into the ScriptPubKeyMan
(via CWallet
) so that they can do whatever is needed internally to sign them. This is largely a refactor as the logic of processing transactions, PSBTs, and messages for is moved into LegacyScriptPubKeyMan
and CWallet
instead of being handled by the caller (e.g. signrawtransaction
).
To help with this, I’ve refactored the 3(!) implementations of a SignTransaction()
function into one generic one. This function will be called by signrawtransactionwithkey
and LegacyScriptPubKeyMan::SignTransaction()
. CWallet::CreateTransaction()
is changed to call CWallet::SignTransaction()
which in turn, calls LegacyScriptPubKeyMan::SignTransaction()
. Other ScriptPubKeyMan
s may implement SignTransaction()
differently.
FillPSBT()
is moved to be a member function of CWallet
and the psbtwallet.cpp/h
files removed. It is further split so that CWallet
handles filling the UTXOs while the ScriptPubKeyMan
handles adding keys, derivation paths, scripts, and signatures. In the end LegacyScriptPubKeyMan::FillPSBT
still calls SignPSBTInput
, but the SigningProvider
is internal to LegacyScriptPubKeyMan
. Other ScriptPubKeyMan
s may do something different.
A new SignMessage()
function is added to both CWallet
and ScriptPubKeyMan
. Instead of having the caller (i.e. signmessage
or the sign message dialog) get the private key, hash the message, and sign, ScriptPubKeyMan
will now handle that (CWallet
passes through to the ScriptPubKeyMan
s as it does for many functions). This signing code is thus consolidated into LegacyScriptPubKeyMan::SignMessage()
, though other ScriptPubKeyMan
s may implement it differently. Additionally, a SigningError
enum is introduced for the different errors that we expect to see from SignMessage()
.
Lastly, GetSigningProvider()
is renamed to GetPublicSigningProvider()
. It will now only provide pubkeys, key origins, and scripts. LegacySigningProvider
has it’s GetKey
and HaveKey
functions changed to only return false. Future implementations should return HidingSigningProvider
s where private keys are hidden.
Other things like dumpprivkey
and dumpwallet
are not changed because they directly need and access the LegacyScriptPubKeyMan
so are not relevant to future changes.