mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-31 10:41:08 +00:00
Merge bitcoin/bitcoin#34112: rpc: [mempool] Remove erroneous Univalue integral casts
fab1f4b800d007bd4756b2519c64e1506ffe0d6c rpc: [mempool] Remove erroneous Univalue integral casts (MarcoFalke)
Pull request description:
Casting without reason can only be confusing (because it is not needed), or wrong (because it does the wrong thing).
For example, the added test that adds a positive chunk prioritization will fail:
```
AssertionError: not(-1.94936096 == 41.000312)
```
Fix all issues by removing the erroneous casts, and by adding a test to check against regressions.
ACKs for top commit:
rkrux:
tACK fab1f4b800d007bd4756b2519c64e1506ffe0d6c
pablomartin4btc:
ACK fab1f4b800d007bd4756b2519c64e1506ffe0d6c
glozow:
ACK fab1f4b800d007bd4756b2519c64e1506ffe0d6c
Tree-SHA512: b03c888ec07a8bdff25f7ded67f253b2a8edd83adf08980416e2ac8ac1b36ad952cc5828be833d19f64a55abab62d7a1c6f181bc5f1388ed08cc178b4aaec6ee
This commit is contained in:
commit
2bcb3f6464
@ -315,7 +315,7 @@ static std::vector<RPCResult> MempoolEntryDescription()
|
|||||||
void AppendChunkInfo(UniValue& all_chunks, FeePerWeight chunk_feerate, std::vector<const CTxMemPoolEntry *> chunk_txs)
|
void AppendChunkInfo(UniValue& all_chunks, FeePerWeight chunk_feerate, std::vector<const CTxMemPoolEntry *> chunk_txs)
|
||||||
{
|
{
|
||||||
UniValue chunk(UniValue::VOBJ);
|
UniValue chunk(UniValue::VOBJ);
|
||||||
chunk.pushKV("chunkfee", ValueFromAmount((int)chunk_feerate.fee));
|
chunk.pushKV("chunkfee", ValueFromAmount(chunk_feerate.fee));
|
||||||
chunk.pushKV("chunkweight", chunk_feerate.size);
|
chunk.pushKV("chunkweight", chunk_feerate.size);
|
||||||
UniValue chunk_txids(UniValue::VARR);
|
UniValue chunk_txids(UniValue::VARR);
|
||||||
for (const auto& chunk_tx : chunk_txs) {
|
for (const auto& chunk_tx : chunk_txs) {
|
||||||
@ -383,7 +383,7 @@ static void entryToJSON(const CTxMemPool& pool, UniValue& info, const CTxMemPool
|
|||||||
fees.pushKV("modified", ValueFromAmount(e.GetModifiedFee()));
|
fees.pushKV("modified", ValueFromAmount(e.GetModifiedFee()));
|
||||||
fees.pushKV("ancestor", ValueFromAmount(ancestor_fees));
|
fees.pushKV("ancestor", ValueFromAmount(ancestor_fees));
|
||||||
fees.pushKV("descendant", ValueFromAmount(descendant_fees));
|
fees.pushKV("descendant", ValueFromAmount(descendant_fees));
|
||||||
fees.pushKV("chunk", ValueFromAmount((int)feerate.fee));
|
fees.pushKV("chunk", ValueFromAmount(feerate.fee));
|
||||||
info.pushKV("fees", std::move(fees));
|
info.pushKV("fees", std::move(fees));
|
||||||
|
|
||||||
const CTransaction& tx = e.GetTx();
|
const CTransaction& tx = e.GetTx();
|
||||||
|
|||||||
@ -36,6 +36,57 @@ class PrioritiseTransactionTest(BitcoinTestFramework):
|
|||||||
node.prioritisetransaction(txid, 0, -delta)
|
node.prioritisetransaction(txid, 0, -delta)
|
||||||
assert_equal(node.getprioritisedtransactions(), {})
|
assert_equal(node.getprioritisedtransactions(), {})
|
||||||
|
|
||||||
|
def test_large_fee_bump(self):
|
||||||
|
self.log.info("Test that a large fee delta is honoured")
|
||||||
|
tx = self.wallet.create_self_transfer()
|
||||||
|
txid = tx["txid"]
|
||||||
|
fee_delta = int(86 * COIN) # large enough to not fit into (u)int32_t
|
||||||
|
self.nodes[0].prioritisetransaction(txid=txid, fee_delta=fee_delta)
|
||||||
|
assert_equal(
|
||||||
|
self.nodes[0].getprioritisedtransactions(),
|
||||||
|
{
|
||||||
|
txid: {
|
||||||
|
"fee_delta": fee_delta,
|
||||||
|
"in_mempool": False,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
self.nodes[0].sendrawtransaction(tx["hex"])
|
||||||
|
expected_modified_fee = tx["fee"] + Decimal(fee_delta) / COIN
|
||||||
|
assert_equal(
|
||||||
|
self.nodes[0].getprioritisedtransactions(),
|
||||||
|
{
|
||||||
|
txid: {
|
||||||
|
"fee_delta": fee_delta,
|
||||||
|
"in_mempool": True,
|
||||||
|
"modified_fee": int(expected_modified_fee * COIN),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
# This transaction forms its own chunk.
|
||||||
|
mempool_entry = self.nodes[0].getrawmempool(verbose=True)[txid]
|
||||||
|
assert_equal(mempool_entry["fees"]["base"], tx["fee"])
|
||||||
|
assert_equal(mempool_entry["fees"]["modified"], expected_modified_fee)
|
||||||
|
assert_equal(mempool_entry["fees"]["ancestor"], expected_modified_fee)
|
||||||
|
assert_equal(mempool_entry["fees"]["descendant"], expected_modified_fee)
|
||||||
|
assert_equal(mempool_entry["fees"]["chunk"], expected_modified_fee)
|
||||||
|
assert_equal(mempool_entry["chunkweight"], mempool_entry["weight"])
|
||||||
|
append_chunk_info = self.nodes[0].getmempoolcluster(txid)
|
||||||
|
assert_equal(
|
||||||
|
append_chunk_info,
|
||||||
|
{
|
||||||
|
"clusterweight": mempool_entry["weight"],
|
||||||
|
"txcount": 1,
|
||||||
|
"chunks": [{
|
||||||
|
"chunkfee": expected_modified_fee,
|
||||||
|
"chunkweight": mempool_entry["weight"],
|
||||||
|
"txs": [txid],
|
||||||
|
}],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
self.generate(self.nodes[0], 1)
|
||||||
|
assert_equal(self.nodes[0].getprioritisedtransactions(), {})
|
||||||
|
|
||||||
def test_replacement(self):
|
def test_replacement(self):
|
||||||
self.log.info("Test tx prioritisation stays after a tx is replaced")
|
self.log.info("Test tx prioritisation stays after a tx is replaced")
|
||||||
conflicting_input = self.wallet.get_utxo()
|
conflicting_input = self.wallet.get_utxo()
|
||||||
@ -175,6 +226,7 @@ class PrioritiseTransactionTest(BitcoinTestFramework):
|
|||||||
# Test `prioritisetransaction` invalid `fee_delta`
|
# Test `prioritisetransaction` invalid `fee_delta`
|
||||||
assert_raises_rpc_error(-3, "JSON value of type string is not of expected type number", self.nodes[0].prioritisetransaction, txid=txid, fee_delta='foo')
|
assert_raises_rpc_error(-3, "JSON value of type string is not of expected type number", self.nodes[0].prioritisetransaction, txid=txid, fee_delta='foo')
|
||||||
|
|
||||||
|
self.test_large_fee_bump()
|
||||||
self.test_replacement()
|
self.test_replacement()
|
||||||
self.test_diamond()
|
self.test_diamond()
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user