Skip to content

Commit 4510632

Browse files
committed
Add new test vector "Silent payment to recipient with SP change (label=0)"
Fix compute output script ‘k’ bug - now increments for each output sharing the same scan key
1 parent 29f23e3 commit 4510632

2 files changed

Lines changed: 75 additions & 2 deletions

File tree

bip-0375/test_vectors.json

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,7 @@
662662
"comment": "Two signers each contribute ECDH shares for their respective inputs"
663663
},
664664
{
665-
"description": "Silent payment with change detection",
665+
"description": "P2WPKH to silent payment with change detection",
666666
"psbt": "cHNidP8B+wQCAAAAAQIEAgAAAAEEBAEAAAABBQQCAAAAAQYBAwABDiAlbK6m2hWAb7hW7a50mI1EDHqxtcCGHsgR0ZCSdHudHAEPBAAAAAABAR+ghgEAAAAAABYAFPja92rYA7DvqV1s/4ruCJHTrxyMARAE/v///yIGA9NX98BxjyR44/2PjMwnKd3YwMyusfArGBpvRNQ7n42NBAAAAAABAwQBAAAAIh0C0Cn/lt4svPeCvkNZxIYg6pK83WvvAyuVFYuRoWk/tPghAlUWTnkm1Q1SoJ/5kGR6XpXB2xv8aKYW+8LaITkn+Yv/Ih4C0Cn/lt4svPeCvkNZxIYg6pK83WvvAyuVFYuRoWk/tPhAwdZ/OHiCv4F5FeoVgh1k1bODXB/AXFWM49gkkqF9kIwQSH27m93BCAyMLZwZcbJmCDxpBU4iGT8kQSisZnN+YAABAwhQwwAAAAAAAAEEIlEgVbkWS8N9yG9biTYWgqowiLWz+lPa20PpXxvRE5uxwDUBCUIC0Cn/lt4svPeCvkNZxIYg6pK83WvvAyuVFYuRoWk/tPgD9SRDSFIBZWa8RdH6alxaGGLN2TPxXIQ7QnI4IvUlMjcBCgQBAAAAAAEDCMivAAAAAAAAAQQWABTjwxDMKvOsbmLK5L0j4+5SueHJWSICA9NX98BxjyR44/2PjMwnKd3YwMyusfArGBpvRNQ7n42NDAAAAAAAAAAAAAAAAQA=",
667667
"input_keys": [
668668
{
@@ -713,6 +713,70 @@
713713
],
714714
"comment": "Uses PSBT_OUT_SP_V0_LABEL and BIP32 derivation for change identification"
715715
},
716+
{
717+
"description": "Silent payment to recipient with SP change (label=0)",
718+
"psbt": "cHNidP8B+wQCAAAAAQIEAgAAAAEEBAEAAAABBQQCAAAAAQYBAwABDiA+pBZO0PMkTo553UGS7UdFpGOtOryyjdXpggKGignYwgEPBAAAAAABAR+ghgEAAAAAABYAFPja92rYA7DvqV1s/4ruCJHTrxyMARAE/v///yIGA9NX98BxjyR44/2PjMwnKd3YwMyusfArGBpvRNQ7n42NBAAAAAABAwQBAAAAIh0C0OfeGchVFsg+GTiVlfzEqqKAjJ1du0glc7WJ2w1NQ/shA0gH+Gwlms4ep9JpUwu5fXthzHLUW7wA9lYwGZ13C29pIh4C0OfeGchVFsg+GTiVlfzEqqKAjJ1du0glc7WJ2w1NQ/tAlgCZCmLP09s3tvbjnI0L2vy1Ki3DtuzSjzG4VK5eKT9BlW79Yg/B4BXnnbr05J2dnu4/CGMbe3hNv8F28mS4wiIdAtAp/5beLLz3gr5DWcSGIOqSvN1r7wMrlRWLkaFpP7T4IQJVFk55JtUNUqCf+ZBkel6Vwdsb/GimFvvC2iE5J/mL/yIeAtAp/5beLLz3gr5DWcSGIOqSvN1r7wMrlRWLkaFpP7T4QMHWfzh4gr+BeRXqFYIdZNWzg1wfwFxVjOPYJJKhfZCMEEh9u5vdwQgMjC2cGXGyZgg8aQVOIhk/JEEorGZzfmAAAQMIQJwAAAAAAAABBCJRIGeR5WTAN8T4IAgi1ORFG+koagPKf1WKnsktXs8Z/HpBAQlCAtDn3hnIVRbIPhk4lZX8xKqigIydXbtIJXO1idsNTUP7A2Wqwj6pXfjI9HO7Wrun1Y4o07RqNBkb1AlcbdXmrXNBAAEDCNjWAAAAAAAAAQQiUSCnrlZnvJt3KzCgIt0kbliQzC07gBLEBu4jSFg5rqtqgQEJQgLQKf+W3iy894K+Q1nEhiDqkrzda+8DK5UVi5GhaT+0+ANUNPp9mrroXxiv7ibhb7t4iMiMVuP5P17uTcDvlI+lxAEKBAAAAAAA",
719+
"input_keys": [
720+
{
721+
"input_index": 0,
722+
"private_key": "e75f1990643539150761b0dc9eceb2ec0cf8636883eea2112d991dec3567a7b9",
723+
"public_key": "03d357f7c0718f2478e3fd8f8ccc2729ddd8c0ccaeb1f02b181a6f44d43b9f8d8d",
724+
"prevout_txid": "3ea4164ed0f3244e8e79dd4192ed4745a463ad3abcb28dd5e98202868a09d8c2",
725+
"prevout_index": 0,
726+
"prevout_scriptpubkey": "0014f8daf76ad803b0efa95d6cff8aee0891d3af1c8c",
727+
"amount": 100000,
728+
"witness_utxo": "a086010000000000160014f8daf76ad803b0efa95d6cff8aee0891d3af1c8c",
729+
"sequence": 4294967295
730+
}
731+
],
732+
"scan_keys": [
733+
{
734+
"scan_pubkey": "02d029ff96de2cbcf782be4359c48620ea92bcdd6bef032b95158b91a1693fb4f8",
735+
"spend_pubkey": "035434fa7d9abae85f18afee26e16fbb7888c88c56e3f93f5eee4dc0ef948fa5c4",
736+
"label": 0
737+
},
738+
{
739+
"scan_pubkey": "02d0e7de19c85516c83e19389595fcc4aaa2808c9d5dbb482573b589db0d4d43fb",
740+
"spend_pubkey": "0365aac23ea95df8c8f473bb5abba7d58e28d3b46a34191bd4095c6dd5e6ad7341",
741+
"label": null
742+
}
743+
],
744+
"expected_ecdh_shares": [
745+
{
746+
"scan_key": "02d0e7de19c85516c83e19389595fcc4aaa2808c9d5dbb482573b589db0d4d43fb",
747+
"ecdh_result": "034807f86c259ace1ea7d269530bb97d7b61cc72d45bbc00f65630199d770b6f69",
748+
"dleq_proof": "9600990a62cfd3db37b6f6e39c8d0bdafcb52a2dc3b6ecd28f31b854ae5e293f41956efd620fc1e015e79dbaf4e49d9d9eee3f08631b7b784dbfc176f264b8c2",
749+
"is_global": false,
750+
"input_index": 0
751+
},
752+
{
753+
"scan_key": "02d029ff96de2cbcf782be4359c48620ea92bcdd6bef032b95158b91a1693fb4f8",
754+
"ecdh_result": "0255164e7926d50d52a09ff990647a5e95c1db1bfc68a616fbc2da213927f98bff",
755+
"dleq_proof": "c1d67f387882bf817915ea15821d64d5b3835c1fc05c558ce3d82492a17d908c10487dbb9bddc1080c8c2d9c1971b266083c69054e22193f244128ac66737e60",
756+
"is_global": false,
757+
"input_index": 0
758+
}
759+
],
760+
"expected_outputs": [
761+
{
762+
"output_index": 0,
763+
"amount": 40000,
764+
"script": "51206791e564c037c4f8200822d4e4451be9286a03ca7f558a9ec92d5ecf19fc7a41",
765+
"is_silent_payment": true,
766+
"sp_info": "02d0e7de19c85516c83e19389595fcc4aaa2808c9d5dbb482573b589db0d4d43fb0365aac23ea95df8c8f473bb5abba7d58e28d3b46a34191bd4095c6dd5e6ad7341",
767+
"sp_label": null
768+
},
769+
{
770+
"output_index": 1,
771+
"amount": 55000,
772+
"script": "5120a7ae5667bc9b772b30a022dd246e5890cc2d3b8012c406ee23485839aeab6a81",
773+
"is_silent_payment": true,
774+
"sp_info": "02d029ff96de2cbcf782be4359c48620ea92bcdd6bef032b95158b91a1693fb4f8035434fa7d9abae85f18afee26e16fbb7888c88c56e3f93f5eee4dc0ef948fa5c4",
775+
"sp_label": 0
776+
}
777+
],
778+
"comment": "Demonstrates BIP-352 label=0 convention for Silent Payment change. Recipient output (output 0) has no label field. Change output (output 1) uses label=0 with PSBT_OUT_SP_V0_LABEL set. Both outputs are Silent Payments with different scan keys."
779+
},
716780
{
717781
"description": "Multiple silent payment outputs to same scan key",
718782
"psbt": "cHNidP8B+wQCAAAAAQIEAgAAAAEEBAEAAAABBQQCAAAAAQYBAyIHAtAp/5beLLz3gr5DWcSGIOqSvN1r7wMrlRWLkaFpP7T4IQJVFk55JtUNUqCf+ZBkel6Vwdsb/GimFvvC2iE5J/mL/yIIAtAp/5beLLz3gr5DWcSGIOqSvN1r7wMrlRWLkaFpP7T4QMHWfzh4gr+BeRXqFYIdZNWzg1wfwFxVjOPYJJKhfZCMEEh9u5vdwQgMjC2cGXGyZgg8aQVOIhk/JEEorGZzfmAAAQ4gLHvTL/FQccCuAyc4ZKFDbIpWITVp4RMtz46nPsjDMiIBDwQAAAAAAQEfoIYBAAAAAAAWABT42vdq2AOw76ldbP+K7giR068cjAEQBP7///8iBgPTV/fAcY8keOP9j4zMJynd2MDMrrHwKxgab0TUO5+NjQQAAAAAAQMEAQAAAAABAwhAnAAAAAAAAAEEIlEg+ytxOv1SuiRxgbmYQapPLIhVut99rOLrLjBV2hPuK4wBCUIC0Cn/lt4svPeCvkNZxIYg6pK83WvvAyuVFYuRoWk/tPgCTVGDU/S9GNdpz2j/Yu8QZptwhiRrCmQD/le95JIRRIsAAQMI2NYAAAAAAAABBCJRIFmgqeG9mJh0IBNVOGDtC0S3JvvFIOnFcbxGSV8kefYYAQlCAtAp/5beLLz3gr5DWcSGIOqSvN1r7wMrlRWLkaFpP7T4Ak1Rg1P0vRjXac9o/2LvEGabcIYkawpkA/5XveSSEUSLAA==",

bip-0375/validator.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,9 @@ def validate_bip352_outputs(
180180
output_index = struct.unpack("<I", output_index_bytes)[0]
181181
outpoints.append((txid, output_index))
182182

183+
# Track k values per scan key (k increments for each output per scan key)
184+
scan_key_k_values = {}
185+
183186
# Validate each silent payment output
184187
for output_idx, output_fields in enumerate(output_maps):
185188
# Only validate outputs with SP_V0_INFO (silent payment outputs)
@@ -193,6 +196,9 @@ def validate_bip352_outputs(
193196
scan_pubkey_bytes = sp_info[:33]
194197
spend_pubkey_bytes = sp_info[33:]
195198

199+
# Get k value for this scan key (starts at 0, increments for each output)
200+
k = scan_key_k_values.get(scan_pubkey_bytes, 0)
201+
196202
# Find matching ECDH share for this scan key
197203
ecdh_share_bytes = None
198204
summed_pubkey_bytes = None
@@ -256,7 +262,7 @@ def validate_bip352_outputs(
256262
summed_pubkey_bytes=summed_pubkey_bytes,
257263
ecdh_share_bytes=ecdh_share_bytes,
258264
spend_pubkey_bytes=spend_pubkey_bytes,
259-
k=output_idx, # Use output index for k parameter
265+
k=k,
260266
)
261267

262268
# Compare with actual PSBT output script
@@ -268,6 +274,9 @@ def validate_bip352_outputs(
268274
f"Output {output_idx} script doesn't match BIP-352 derivation",
269275
)
270276

277+
# Increment k for this scan key after successful validation
278+
scan_key_k_values[scan_pubkey_bytes] = k + 1
279+
271280
return True, "BIP-352 output validation passed"
272281

273282

0 commit comments

Comments
 (0)