Skip to content

Commit b76de9c

Browse files
committed
spscriptpubkeyman: Check that desc allows labels before creating label destinations
1 parent b69068f commit b76de9c

File tree

2 files changed

+46
-13
lines changed

2 files changed

+46
-13
lines changed

src/wallet/scriptpubkeyman.cpp

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2898,18 +2898,15 @@ SilentPaymentDescriptorScriptPubKeyMan::SilentPaymentDescriptorScriptPubKeyMan(W
28982898
throw std::runtime_error(std::string(__func__) + ": descriptor is not a Silent Payment Descriptor");
28992899
}
29002900

2901-
// Populate m_map_label_tweaks if descriptor is Silent Payments
2902-
if (descriptor.descriptor->GetOutputType() == OutputType::SILENT_PAYMENT) {
2903-
auto sppubkey = GetSpPubKeyFrom(descriptor.descriptor);
2904-
if (!sppubkey.has_value()) {
2905-
throw std::runtime_error(std::string(__func__) + ": descriptor expansion failed");
2906-
}
2907-
auto change_label_data = bip352::CreateLabelTweak(sppubkey->scanKey, 0);
2908-
m_map_label_tweaks.insert(change_label_data);
2909-
for (int i = 1; i < descriptor.next_index; i++) {
2910-
// Add the other generated labelled destinations
2911-
m_map_label_tweaks.insert(bip352::CreateLabelTweak(sppubkey->scanKey, i));
2912-
}
2901+
auto sppubkey = GetSpPubKeyFrom(descriptor.descriptor);
2902+
if (!sppubkey.has_value()) {
2903+
throw std::runtime_error(std::string(__func__) + ": descriptor expansion failed");
2904+
}
2905+
auto change_label_data = bip352::CreateLabelTweak(sppubkey->scanKey, 0);
2906+
m_map_label_tweaks.insert(change_label_data);
2907+
for (int i = 1; i < descriptor.next_index; i++) {
2908+
// Add the other generated labelled destinations
2909+
m_map_label_tweaks.insert(bip352::CreateLabelTweak(sppubkey->scanKey, i));
29132910
}
29142911
}
29152912

@@ -2954,7 +2951,16 @@ V0SilentPaymentDestination SilentPaymentDescriptorScriptPubKeyMan::GetLabeledDes
29542951
util::Result<CTxDestination> SilentPaymentDescriptorScriptPubKeyMan::GetNewLabeledDestination(uint64_t& index)
29552952
{
29562953
LOCK(cs_desc_man);
2957-
auto dest = GetLabeledDestination(m_wallet_descriptor.next_index);
2954+
2955+
auto sppubkey = GetSpPubKeyFrom(m_wallet_descriptor.descriptor);
2956+
if (!sppubkey.has_value()) {
2957+
throw std::runtime_error(std::string(__func__) + ": descriptor expansion failed");
2958+
}
2959+
if (!sppubkey->AllowLabels()) {
2960+
return util::Error{ .message=Untranslated("Failed to create new label destination. Labels not allowed") };
2961+
}
2962+
2963+
auto dest{GetLabeledDestination(m_wallet_descriptor.next_index)};
29582964
index = m_wallet_descriptor.next_index; // Return the index for this destination
29592965
m_wallet_descriptor.next_index++;
29602966
WalletBatch(m_storage.GetDatabase()).WriteDescriptor(GetID(), m_wallet_descriptor);

test/functional/wallet_silentpayments_receiving.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#!/usr/bin/env python3
22

3+
from test_framework.descriptors import descsum_create
34
from test_framework.test_framework import BitcoinTestFramework
45
from test_framework.util import (
56
assert_approx,
@@ -44,6 +45,32 @@ def test_labels(self):
4445
assert_equal(wallet_txs_by_label[0]["label"], "test")
4546
assert_equal(wallet.getreceivedbylabel("test"), 10)
4647

48+
self.log.info("Check that a silent payments wallet allows labels only when the SP desc allows it")
49+
allow_labels_desc = descsum_create("sp(sprtprv1qqqqqqqqq850xtnj8hk0gpg6a7kgutyne8zmy9p38qtumvq6zj2tj97ggd4n2q8g7vh8y00v7sz34mav3ckf8jw9kg2rzwqhekcp59y5hytussmtx5yvyrl8)")
50+
disallow_labels_desc = descsum_create("sp(sprtprv1qqqqqqqqqr50xtnj8hk0gpg6a7kgutyne8zmy9p38qtumvq6zj2tj97ggd4n2q8g7vh8y00v7sz34mav3ckf8jw9kg2rzwqhekcp59y5hytussmtx5vlynje)")
51+
52+
self.nodes[0].createwallet(wallet_name="allow_labels", blank=True, silent_payment=True)
53+
allow_labels_wallet = self.nodes[0].get_wallet_rpc("allow_labels")
54+
assert allow_labels_wallet.importdescriptors([{
55+
"desc": allow_labels_desc,
56+
"active": True,
57+
"next_index": 0,
58+
"timestamp": "now"
59+
}])[0]["success"]
60+
allow_labels_wallet.getnewaddress(address_type="silent-payments", label="test")
61+
assert_equal(allow_labels_wallet.listlabels(), ["test"])
62+
63+
self.nodes[0].createwallet(wallet_name="disallow_labels", blank=True, silent_payment=True)
64+
disallow_labels_wallet = self.nodes[0].get_wallet_rpc("disallow_labels")
65+
assert disallow_labels_wallet.importdescriptors([{
66+
"desc": disallow_labels_desc,
67+
"active": True,
68+
"next_index": 0,
69+
"timestamp": "now"
70+
}])[0]["success"]
71+
assert_raises_rpc_error(-12, "Failed to create new label destination. Labels not allowed", disallow_labels_wallet.getnewaddress, address_type="silent-payments", label="test")
72+
assert_equal(disallow_labels_wallet.listlabels(), [])
73+
4774
def test_encrypt_and_decrypt(self):
4875
self.log.info("Check that a silent payments wallet can be encrypted and decrypted")
4976
self.log.info("Create encrypted wallet")

0 commit comments

Comments
 (0)