aboutsummaryrefslogtreecommitdiff
path: root/src/psbt.cpp
diff options
context:
space:
mode:
authorRussell Yanofsky <russ@yanofsky.org>2019-04-08 16:33:05 -0400
committerRussell Yanofsky <russ@yanofsky.org>2019-04-09 17:53:08 -0400
commit4d074e84a2cf419510e2920417799f62747f4b07 (patch)
tree545a1e6e757086c1e29becb5e202422f1a40688b /src/psbt.cpp
parentfd509bd1f71df628b933ea7a135a9a957a5e0136 (diff)
downloadbitcoin-4d074e84a2cf419510e2920417799f62747f4b07.tar.xz
[build] Move AnalyzePSBT from psbt.cpp to node/psbt.cpp
psbt.cpp definitions except for AnalyzePSBT are used by the wallet and need to be linked into the wallet binary. AnalyzePSBT is an exception in that it is not used by the wallet, and depends on node classes like CCoinsViewCache, and on node global variables like nBytesPerSigOp. So AnalyzePSBT is more at home in libbitcoin_server than libbitcoin_common, and in any case needs to be defined in a separate object file than other PSBT utilities, to avoid dragging link dependencies on node functions and global variables into the wallet.
Diffstat (limited to 'src/psbt.cpp')
-rw-r--r--src/psbt.cpp123
1 files changed, 0 insertions, 123 deletions
diff --git a/src/psbt.cpp b/src/psbt.cpp
index 184129e330..f31f2af0d1 100644
--- a/src/psbt.cpp
+++ b/src/psbt.cpp
@@ -340,129 +340,6 @@ std::string PSBTRoleName(PSBTRole role) {
}
}
-PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
-{
- // Go through each input and build status
- PSBTAnalysis result;
-
- bool calc_fee = true;
- bool all_final = true;
- bool only_missing_sigs = true;
- bool only_missing_final = false;
- CAmount in_amt = 0;
-
- result.inputs.resize(psbtx.tx->vin.size());
-
- for (unsigned int i = 0; i < psbtx.tx->vin.size(); ++i) {
- PSBTInput& input = psbtx.inputs[i];
- PSBTInputAnalysis& input_analysis = result.inputs[i];
-
- // Check for a UTXO
- CTxOut utxo;
- if (psbtx.GetInputUTXO(utxo, i)) {
- in_amt += utxo.nValue;
- input_analysis.has_utxo = true;
- } else {
- input_analysis.has_utxo = false;
- input_analysis.is_final = false;
- input_analysis.next = PSBTRole::UPDATER;
- calc_fee = false;
- }
-
- // Check if it is final
- if (!utxo.IsNull() && !PSBTInputSigned(input)) {
- input_analysis.is_final = false;
- all_final = false;
-
- // Figure out what is missing
- SignatureData outdata;
- bool complete = SignPSBTInput(DUMMY_SIGNING_PROVIDER, psbtx, i, 1, &outdata);
-
- // Things are missing
- if (!complete) {
- input_analysis.missing_pubkeys = outdata.missing_pubkeys;
- input_analysis.missing_redeem_script = outdata.missing_redeem_script;
- input_analysis.missing_witness_script = outdata.missing_witness_script;
- input_analysis.missing_sigs = outdata.missing_sigs;
-
- // If we are only missing signatures and nothing else, then next is signer
- if (outdata.missing_pubkeys.empty() && outdata.missing_redeem_script.IsNull() && outdata.missing_witness_script.IsNull() && !outdata.missing_sigs.empty()) {
- input_analysis.next = PSBTRole::SIGNER;
- } else {
- only_missing_sigs = false;
- input_analysis.next = PSBTRole::UPDATER;
- }
- } else {
- only_missing_final = true;
- input_analysis.next = PSBTRole::FINALIZER;
- }
- } else if (!utxo.IsNull()){
- input_analysis.is_final = true;
- }
- }
-
- if (all_final) {
- only_missing_sigs = false;
- result.next = PSBTRole::EXTRACTOR;
- }
- if (calc_fee) {
- // Get the output amount
- CAmount out_amt = std::accumulate(psbtx.tx->vout.begin(), psbtx.tx->vout.end(), CAmount(0),
- [](CAmount a, const CTxOut& b) {
- return a += b.nValue;
- }
- );
-
- // Get the fee
- CAmount fee = in_amt - out_amt;
- result.fee = fee;
-
- // Estimate the size
- CMutableTransaction mtx(*psbtx.tx);
- CCoinsView view_dummy;
- CCoinsViewCache view(&view_dummy);
- bool success = true;
-
- for (unsigned int i = 0; i < psbtx.tx->vin.size(); ++i) {
- PSBTInput& input = psbtx.inputs[i];
- Coin newcoin;
-
- if (!SignPSBTInput(DUMMY_SIGNING_PROVIDER, psbtx, i, 1, nullptr, true) || !psbtx.GetInputUTXO(newcoin.out, i)) {
- success = false;
- break;
- } else {
- mtx.vin[i].scriptSig = input.final_script_sig;
- mtx.vin[i].scriptWitness = input.final_script_witness;
- newcoin.nHeight = 1;
- view.AddCoin(psbtx.tx->vin[i].prevout, std::move(newcoin), true);
- }
- }
-
- if (success) {
- CTransaction ctx = CTransaction(mtx);
- size_t size = GetVirtualTransactionSize(ctx, GetTransactionSigOpCost(ctx, view, STANDARD_SCRIPT_VERIFY_FLAGS));
- result.estimated_vsize = size;
- // Estimate fee rate
- CFeeRate feerate(fee, size);
- result.estimated_feerate = feerate;
- }
-
- if (only_missing_sigs) {
- result.next = PSBTRole::SIGNER;
- } else if (only_missing_final) {
- result.next = PSBTRole::FINALIZER;
- } else if (all_final) {
- result.next = PSBTRole::EXTRACTOR;
- } else {
- result.next = PSBTRole::UPDATER;
- }
- } else {
- result.next = PSBTRole::UPDATER;
- }
-
- return result;
-}
-
bool DecodeBase64PSBT(PartiallySignedTransaction& psbt, const std::string& base64_tx, std::string& error)
{
bool invalid;