CreateTransaction: Assume minimum p2sh-p2wpkh spend size for unknown change
This commit is contained in:
parent
0050a7e979
commit
d2611e9d97
3 changed files with 51 additions and 0 deletions
|
@ -16,6 +16,7 @@
|
||||||
#include <validation.h>
|
#include <validation.h>
|
||||||
#include <wallet/coincontrol.h>
|
#include <wallet/coincontrol.h>
|
||||||
#include <wallet/test/wallet_test_fixture.h>
|
#include <wallet/test/wallet_test_fixture.h>
|
||||||
|
#include <policy/policy.h>
|
||||||
|
|
||||||
#include <boost/test/unit_test.hpp>
|
#include <boost/test/unit_test.hpp>
|
||||||
#include <univalue.h>
|
#include <univalue.h>
|
||||||
|
@ -515,4 +516,47 @@ BOOST_FIXTURE_TEST_CASE(dummy_input_size_test, TestChain100Setup)
|
||||||
BOOST_CHECK_EQUAL(CalculateNestedKeyhashInputSize(true), DUMMY_NESTED_P2WPKH_INPUT_SIZE);
|
BOOST_CHECK_EQUAL(CalculateNestedKeyhashInputSize(true), DUMMY_NESTED_P2WPKH_INPUT_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Explicit calculation which is used to test the wallet constant
|
||||||
|
// We get the same virtual size due to rounding(weight/4) for both use_max_sig values
|
||||||
|
static size_t CalculateNestedKeyhashInputSize(bool use_max_sig)
|
||||||
|
{
|
||||||
|
// Generate ephemeral valid pubkey
|
||||||
|
CKey key;
|
||||||
|
key.MakeNewKey(true);
|
||||||
|
CPubKey pubkey = key.GetPubKey();
|
||||||
|
|
||||||
|
// Generate pubkey hash
|
||||||
|
uint160 key_hash(Hash160(pubkey.begin(), pubkey.end()));
|
||||||
|
|
||||||
|
// Create inner-script to enter into keystore. Key hash can't be 0...
|
||||||
|
CScript inner_script = CScript() << OP_0 << std::vector<unsigned char>(key_hash.begin(), key_hash.end());
|
||||||
|
|
||||||
|
// Create outer P2SH script for the output
|
||||||
|
uint160 script_id(Hash160(inner_script.begin(), inner_script.end()));
|
||||||
|
CScript script_pubkey = CScript() << OP_HASH160 << std::vector<unsigned char>(script_id.begin(), script_id.end()) << OP_EQUAL;
|
||||||
|
|
||||||
|
// Add inner-script to key store and key to watchonly
|
||||||
|
CBasicKeyStore keystore;
|
||||||
|
keystore.AddCScript(inner_script);
|
||||||
|
keystore.AddKeyPubKey(key, pubkey);
|
||||||
|
|
||||||
|
// Fill in dummy signatures for fee calculation.
|
||||||
|
SignatureData sig_data;
|
||||||
|
|
||||||
|
if (!ProduceSignature(keystore, use_max_sig ? DUMMY_MAXIMUM_SIGNATURE_CREATOR : DUMMY_SIGNATURE_CREATOR, script_pubkey, sig_data)) {
|
||||||
|
// We're hand-feeding it correct arguments; shouldn't happen
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
CTxIn tx_in;
|
||||||
|
UpdateInput(tx_in, sig_data);
|
||||||
|
return (size_t)GetVirtualTransactionInputSize(tx_in);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_FIXTURE_TEST_CASE(dummy_input_size_test, TestChain100Setup)
|
||||||
|
{
|
||||||
|
BOOST_CHECK_EQUAL(CalculateNestedKeyhashInputSize(false), DUMMY_NESTED_P2WPKH_INPUT_SIZE);
|
||||||
|
BOOST_CHECK_EQUAL(CalculateNestedKeyhashInputSize(true), DUMMY_NESTED_P2WPKH_INPUT_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
|
@ -95,6 +95,9 @@ constexpr CAmount HIGH_MAX_TX_FEE{100 * HIGH_TX_FEE_PER_KB};
|
||||||
//! Pre-calculated constants for input size estimation in *virtual size*
|
//! Pre-calculated constants for input size estimation in *virtual size*
|
||||||
static constexpr size_t DUMMY_NESTED_P2WPKH_INPUT_SIZE = 91;
|
static constexpr size_t DUMMY_NESTED_P2WPKH_INPUT_SIZE = 91;
|
||||||
|
|
||||||
|
//! Pre-calculated constants for input size estimation in *virtual size*
|
||||||
|
static constexpr size_t DUMMY_NESTED_P2WPKH_INPUT_SIZE = 91;
|
||||||
|
|
||||||
class CCoinControl;
|
class CCoinControl;
|
||||||
class COutput;
|
class COutput;
|
||||||
class CScript;
|
class CScript;
|
||||||
|
|
|
@ -256,6 +256,10 @@ class PSBTTest(BitcoinTestFramework):
|
||||||
# We don't care about the decode result, but decoding must succeed.
|
# We don't care about the decode result, but decoding must succeed.
|
||||||
self.nodes[0].decodepsbt(double_processed_psbt["psbt"])
|
self.nodes[0].decodepsbt(double_processed_psbt["psbt"])
|
||||||
|
|
||||||
|
# Make sure change address wallet does not have P2SH innerscript access to results in success
|
||||||
|
# when attempting BnB coin selection
|
||||||
|
self.nodes[0].walletcreatefundedpsbt([], [{self.nodes[2].getnewaddress():unspent["amount"]+1}], block_height+2, {"changeAddress":self.nodes[1].getnewaddress()}, False)
|
||||||
|
|
||||||
# BIP 174 Test Vectors
|
# BIP 174 Test Vectors
|
||||||
|
|
||||||
# Check that unknown values are just passed through
|
# Check that unknown values are just passed through
|
||||||
|
|
Loading…
Reference in a new issue