Allow dumpblinding key to accept non-CT address

This facilitates the following workflow:
1) Obtain an updated psbt with in_witness_utxo and in_utxo_rangeproof
2) Get the blinding key from the input utxo address obtained from input
script pubkey without revealing master blinding key
3) Rewind the proof to obtain blinding factors and implement stateless
blinding
This commit is contained in:
sanket1729 2022-08-02 13:14:59 -07:00
parent cd9d64ebff
commit a142232384
2 changed files with 10 additions and 6 deletions

View file

@ -2112,7 +2112,8 @@ RPCHelpMan importissuanceblindingkey()
RPCHelpMan dumpblindingkey()
{
return RPCHelpMan{"dumpblindingkey",
"\nDumps the private blinding key for a CT address in hex.",
"\nDumps the private blinding key for a CT address in hex."
"\nNote: If the address is not a CT address, looks for blinding key corresponding to this non-CT address.",
{
{"address", RPCArg::Type::STR, RPCArg::Optional::NO, "The CT address"},
},
@ -2134,17 +2135,15 @@ RPCHelpMan dumpblindingkey()
if (!IsValidDestination(dest)) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Bitcoin address");
}
if (!IsBlindDestination(dest)) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Not a CT address");
}
CScript script = GetScriptForDestination(dest);
CKey key;
key = pwallet->GetBlindingKey(&script);
if (key.IsValid()) {
CPubKey pubkey(key.GetPubKey());
if (pubkey == GetDestinationBlindingKey(dest)) {
return HexStr(Span<const unsigned char>(key.begin(), key.size()));
if (IsBlindDestination(dest) && pubkey != GetDestinationBlindingKey(dest)) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "CT address blinding key does not match the blinding key in wallet");
}
return HexStr(Span<const unsigned char>(key.begin(), key.size()));
}
throw JSONRPCError(RPC_WALLET_ERROR, "Blinding key for address is unknown");

View file

@ -272,6 +272,11 @@ class CTTest (BitcoinTestFramework):
# Import the blinding key
blindingkey = self.nodes[2].dumpblindingkey(address2)
# Check that importing keys from non-CT address works as intended
blindingkey2 = self.nodes[2].dumpblindingkey(unconfidential_address2)
assert_equal(blindingkey, blindingkey2)
self.nodes[1].importblindingkey(address2, blindingkey)
# Check the auditor's gettransaction and listreceivedbyaddress
# Needs rescan to update wallet txns