Skip to content

Commit 1ef28b4

Browse files
committed
Make AnalyzePSBT next role calculation simple, correct
1 parent 4502ed7 commit 1ef28b4

File tree

2 files changed

+15
-20
lines changed

2 files changed

+15
-20
lines changed

src/node/psbt.cpp

+11-20
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
1818
PSBTAnalysis result;
1919

2020
bool calc_fee = true;
21-
bool all_final = true;
22-
bool only_missing_sigs = true;
23-
bool only_missing_final = false;
21+
2422
CAmount in_amt = 0;
2523

2624
result.inputs.resize(psbtx.tx->vin.size());
@@ -29,6 +27,9 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
2927
PSBTInput& input = psbtx.inputs[i];
3028
PSBTInputAnalysis& input_analysis = result.inputs[i];
3129

30+
// We set next role here and ratchet backwards as required
31+
input_analysis.next = PSBTRole::EXTRACTOR;
32+
3233
// Check for a UTXO
3334
CTxOut utxo;
3435
if (psbtx.GetInputUTXO(utxo, i)) {
@@ -57,7 +58,6 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
5758
// Check if it is final
5859
if (!utxo.IsNull() && !PSBTInputSigned(input)) {
5960
input_analysis.is_final = false;
60-
all_final = false;
6161

6262
// Figure out what is missing
6363
SignatureData outdata;
@@ -74,22 +74,24 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
7474
if (outdata.missing_pubkeys.empty() && outdata.missing_redeem_script.IsNull() && outdata.missing_witness_script.IsNull() && !outdata.missing_sigs.empty()) {
7575
input_analysis.next = PSBTRole::SIGNER;
7676
} else {
77-
only_missing_sigs = false;
7877
input_analysis.next = PSBTRole::UPDATER;
7978
}
8079
} else {
81-
only_missing_final = true;
8280
input_analysis.next = PSBTRole::FINALIZER;
8381
}
8482
} else if (!utxo.IsNull()){
8583
input_analysis.is_final = true;
8684
}
8785
}
8886

89-
if (all_final) {
90-
only_missing_sigs = false;
91-
result.next = PSBTRole::EXTRACTOR;
87+
// Calculate next role for PSBT by grabbing "minumum" PSBTInput next role
88+
result.next = PSBTRole::EXTRACTOR;
89+
for (unsigned int i = 0; i < psbtx.tx->vin.size(); ++i) {
90+
PSBTInputAnalysis& input_analysis = result.inputs[i];
91+
result.next = std::min(result.next, input_analysis.next);
9292
}
93+
assert(result.next > PSBTRole::CREATOR);
94+
9395
if (calc_fee) {
9496
// Get the output amount
9597
CAmount out_amt = std::accumulate(psbtx.tx->vout.begin(), psbtx.tx->vout.end(), CAmount(0),
@@ -139,17 +141,6 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
139141
result.estimated_feerate = feerate;
140142
}
141143

142-
if (only_missing_sigs) {
143-
result.next = PSBTRole::SIGNER;
144-
} else if (only_missing_final) {
145-
result.next = PSBTRole::FINALIZER;
146-
} else if (all_final) {
147-
result.next = PSBTRole::EXTRACTOR;
148-
} else {
149-
result.next = PSBTRole::UPDATER;
150-
}
151-
} else {
152-
result.next = PSBTRole::UPDATER;
153144
}
154145

155146
return result;

test/functional/rpc_psbt.py

+4
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,10 @@ def test_psbt_input_keys(psbt_input, keys):
437437
assert_equal(analysis['next'], 'creator')
438438
assert_equal(analysis['error'], 'PSBT is not valid. Input 0 has invalid value')
439439

440+
self.log.info("PSBT with signed, but not finalized, inputs should have Finalizer as next")
441+
analysis = self.nodes[0].analyzepsbt('cHNidP8BAHECAAAAAZYezcxdnbXoQCmrD79t/LzDgtUo9ERqixk8wgioAobrAAAAAAD9////AlDDAAAAAAAAFgAUy/UxxZuzZswcmFnN/E9DGSiHLUsuGPUFAAAAABYAFLsH5o0R38wXx+X2cCosTMCZnQ4baAAAAAABAR8A4fUFAAAAABYAFOBI2h5thf3+Lflb2LGCsVSZwsltIgIC/i4dtVARCRWtROG0HHoGcaVklzJUcwo5homgGkSNAnJHMEQCIGx7zKcMIGr7cEES9BR4Kdt/pzPTK3fKWcGyCJXb7MVnAiALOBgqlMH4GbC1HDh/HmylmO54fyEy4lKde7/BT/PWxwEBAwQBAAAAIgYC/i4dtVARCRWtROG0HHoGcaVklzJUcwo5homgGkSNAnIYDwVpQ1QAAIABAACAAAAAgAAAAAAAAAAAAAAiAgL+CIiB59NSCssOJRGiMYQK1chahgAaaJpIXE41Cyir+xgPBWlDVAAAgAEAAIAAAACAAQAAAAAAAAAA')
442+
assert_equal(analysis['next'], 'finalizer')
443+
440444
analysis = self.nodes[0].analyzepsbt('cHNidP8BAHECAAAAAfA00BFgAm6tp86RowwH6BMImQNL5zXUcTT97XoLGz0BAAAAAAD/////AgCAgWrj0AcAFgAUKNw0x8HRctAgmvoevm4u1SbN7XL87QKVAAAAABYAFPck4gF7iL4NL4wtfRAKgQbghiTUAAAAAAABAR8A8gUqAQAAABYAFJUDtxf2PHo641HEOBOAIvFMNTr2AAAA')
441445
assert_equal(analysis['next'], 'creator')
442446
assert_equal(analysis['error'], 'PSBT is not valid. Output amount invalid')

0 commit comments

Comments
 (0)