Just a style nit preference, it is good as is.
The same blocks with asserts are repeated over and over, I think a helper function could help hiding the asserts and just keeping the minimal information to make each case clear, improving readability.
<details>
<summary>diff</summary>
$ git diff
diff --git a/test/functional/rpc_psbt.py b/test/functional/rpc_psbt.py
index 96ada3386e..6d71784a75 100755
--- a/test/functional/rpc_psbt.py
+++ b/test/functional/rpc_psbt.py
@@ -471,7 +471,7 @@ class PSBTTest(BitcoinTestFramework):
])
def test_combinepsbt_preserves_unknown_fields(self):
- self.log.info("Test that combining PSBTs preserves unknown fields with the same and with distinct values per map")
+ self.log.info("Test that combining PSBTs preserves unknown fields with the same and with distinct values per map, and when they are missing from some maps")
def unknown_key(key_type, key_data):
return bytes([key_type]) + key_data
@@ -486,6 +486,16 @@ class PSBTTest(BitcoinTestFramework):
psbt.o[0].map[key] = output_value
return psbt
+ def check_combined_unknowns(*psbts, global_unknown, input_unknown, output_unknown):
+ # Combine the PSBTs and check that the unknown fields of the global map, the
+ # first input and the first output are preserved, along with the PSBT version
+ combined_psbt = self.nodes[0].combinepsbt([psbt.to_base64() for psbt in psbts])
+ decoded = self.nodes[0].decodepsbt(combined_psbt)
+ assert_equal(decoded["psbt_version"], psbt_version)
+ assert_equal(decoded["unknown"], global_unknown)
+ assert_equal(decoded["inputs"][0]["unknown"], input_unknown)
+ assert_equal(decoded["outputs"][0]["unknown"], output_unknown)
+
unknown_key_a = unknown_key(0xf0, bytes.fromhex("010203040506070809"))
unknown_key_b = unknown_key(0xf0, bytes.fromhex("010203040506070810"))
@@ -503,79 +513,59 @@ class PSBTTest(BitcoinTestFramework):
base_psbt = self.nodes[0].createpsbt(inputs=inputs, outputs=outputs, psbt_version=psbt_version)
# Combining the PSBTs with unknown keys and fields with the same values
- combined_duplicated_psbt = self.nodes[0].combinepsbt([
- build_psbt(unknown_key_a, global_value_a, global_value_a, global_value_a).to_base64(),
- build_psbt(unknown_key_a, global_value_a, global_value_a, global_value_a).to_base64(),
- ])
- decoded = self.nodes[0].decodepsbt(combined_duplicated_psbt)
- assert_equal(decoded["psbt_version"], psbt_version)
- assert_equal(decoded["unknown"], unknown_fields(
- (unknown_key_a, global_value_a)
- ))
- assert_equal(decoded["inputs"][0]["unknown"], unknown_fields(
- (unknown_key_a, global_value_a)
- ))
- assert_equal(decoded["outputs"][0]["unknown"], unknown_fields(
- (unknown_key_a, global_value_a)
- ))
+ check_combined_unknowns(
+ build_psbt(unknown_key_a, global_value_a, global_value_a, global_value_a),
+ build_psbt(unknown_key_a, global_value_a, global_value_a, global_value_a),
+ global_unknown=unknown_fields((unknown_key_a, global_value_a)),
+ input_unknown=unknown_fields((unknown_key_a, global_value_a)),
+ output_unknown=unknown_fields((unknown_key_a, global_value_a)),
+ )
# Combining the PSBTs with the same unknown keys values and distinct fields values
# First PSBT wins
- combined_psbt_same_keys = self.nodes[0].combinepsbt([
- build_psbt(unknown_key_a, global_value_a, global_value_a, global_value_a).to_base64(),
- build_psbt(unknown_key_a, global_value_b, global_value_b, global_value_b).to_base64(),
- ])
- decoded = self.nodes[0].decodepsbt(combined_psbt_same_keys)
- assert_equal(decoded["psbt_version"], psbt_version)
- assert_equal(decoded["unknown"], unknown_fields(
- (unknown_key_a, global_value_a)
- ))
- assert_equal(decoded["inputs"][0]["unknown"], unknown_fields(
- (unknown_key_a, global_value_a)
- ))
- assert_equal(decoded["outputs"][0]["unknown"], unknown_fields(
- (unknown_key_a, global_value_a)
- ))
+ check_combined_unknowns(
+ build_psbt(unknown_key_a, global_value_a, global_value_a, global_value_a),
+ build_psbt(unknown_key_a, global_value_b, global_value_b, global_value_b),
+ global_unknown=unknown_fields((unknown_key_a, global_value_a)),
+ input_unknown=unknown_fields((unknown_key_a, global_value_a)),
+ output_unknown=unknown_fields((unknown_key_a, global_value_a)),
+ )
# Combining PSBTs with unknown fields with the same values
- combined_psbt_same_fields = self.nodes[0].combinepsbt([
- build_psbt(unknown_key_a, global_value_a, global_value_a, global_value_a).to_base64(),
- build_psbt(unknown_key_b, global_value_a, global_value_a, global_value_a).to_base64(),
- ])
- decoded = self.nodes[0].decodepsbt(combined_psbt_same_fields)
- assert_equal(decoded["psbt_version"], psbt_version)
- assert_equal(decoded["unknown"], unknown_fields(
- (unknown_key_a, global_value_a),
- (unknown_key_b, global_value_a),
- ))
- assert_equal(decoded["inputs"][0]["unknown"], unknown_fields(
- (unknown_key_a, global_value_a),
- (unknown_key_b, global_value_a),
- ))
- assert_equal(decoded["outputs"][0]["unknown"], unknown_fields(
- (unknown_key_a, global_value_a),
- (unknown_key_b, global_value_a),
- ))
+ check_combined_unknowns(
+ build_psbt(unknown_key_a, global_value_a, global_value_a, global_value_a),
+ build_psbt(unknown_key_b, global_value_a, global_value_a, global_value_a),
+ global_unknown=unknown_fields(
+ (unknown_key_a, global_value_a),
+ (unknown_key_b, global_value_a),
+ ),
+ input_unknown=unknown_fields(
+ (unknown_key_a, global_value_a),
+ (unknown_key_b, global_value_a),
+ ),
+ output_unknown=unknown_fields(
+ (unknown_key_a, global_value_a),
+ (unknown_key_b, global_value_a),
+ ),
+ )
# Combining PSBTs preserves unknown fields with distinct values
- combined_psbt = self.nodes[0].combinepsbt([
- build_psbt(unknown_key_a, global_value_a, input_value_a, output_value_a).to_base64(),
- build_psbt(unknown_key_b, global_value_b, input_value_b, output_value_b).to_base64(),
- ])
- decoded = self.nodes[0].decodepsbt(combined_psbt)
- assert_equal(decoded["psbt_version"], psbt_version)
- assert_equal(decoded["unknown"], unknown_fields(
- (unknown_key_a, global_value_a),
- (unknown_key_b, global_value_b),
- ))
- assert_equal(decoded["inputs"][0]["unknown"], unknown_fields(
- (unknown_key_a, input_value_a),
- (unknown_key_b, input_value_b),
- ))
- assert_equal(decoded["outputs"][0]["unknown"], unknown_fields(
- (unknown_key_a, output_value_a),
- (unknown_key_b, output_value_b),
- ))
+ check_combined_unknowns(
+ build_psbt(unknown_key_a, global_value_a, input_value_a, output_value_a),
+ build_psbt(unknown_key_b, global_value_b, input_value_b, output_value_b),
+ global_unknown=unknown_fields(
+ (unknown_key_a, global_value_a),
+ (unknown_key_b, global_value_b),
+ ),
+ input_unknown=unknown_fields(
+ (unknown_key_a, input_value_a),
+ (unknown_key_b, input_value_b),
+ ),
+ output_unknown=unknown_fields(
+ (unknown_key_a, output_value_a),
+ (unknown_key_b, output_value_b),
+ ),
+ )
def test_sighash_mismatch(self):
self.log.info("Test sighash type mismatches")
</details>