forked from bitcoin/bitcoin
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge bitcoin#20833: rpc/validation: enable packages through testmemp…
…oolaccept 13650fe [policy] detect unsorted packages (glozow) 9ef643e [doc] add release note for package testmempoolaccept (glozow) c4259f4 [test] functional test for packages in RPCs (glozow) 9ede34a [rpc] allow multiple txns in testmempoolaccept (glozow) ae8e6df [policy] limit package sizes (glozow) c9e1a26 [fuzz] add ProcessNewPackage call in tx_pool fuzzer (glozow) 363e3d9 [test] unit tests for ProcessNewPackage (glozow) cd9a11a [test] make submit optional in CreateValidMempoolTransaction (glozow) 2ef1879 [validation] package validation for test accepts (glozow) 578148d [validation] explicit Success/Failure ctors for MempoolAcceptResult (glozow) b88d77a [policy] Define packages (glozow) 249f43f [refactor] add option to disable RBF (glozow) 897e348 [coins/mempool] extend CCoinsViewMemPool to track temporary coins (glozow) 42cf8b2 [validation] make CheckSequenceLocks context-free (glozow) Pull request description: This PR enables validation dry-runs of packages through the `testmempoolaccept` RPC. The expectation is that the results returned from `testmempoolaccept` are what you'd get from test-then-submitting each transaction individually, in that order (this means the package is expected to be sorted in topological order, for now at least). The validation is also atomic: in the case of failure, it immediately halts and may return "unfinished" `MempoolAcceptResult`s for transactions that weren't fully validated. The API for 1 transaction stays the same. **Motivation:** - This allows you to test validity for transaction chains (e.g. with multiple spending paths and where you don't want to broadcast yet); closes bitcoin#18480. - It's also a first step towards package validation in a minimally invasive way. - The RPC commit happens to close bitcoin#21074 by clarifying the "allowed" key. There are a few added restrictions on the packages, mostly to simplify the logic for areas that aren't critical to main package use cases: - No package can have conflicts, i.e. none of them can spend the same inputs, even if it would be a valid BIP125 replacement. - The package cannot conflict with the mempool, i.e. RBF is disabled. - The total count of the package cannot exceed 25 (the default descendant count limit), and total size cannot exceed 101KvB (the default descendant size limit). If you're looking for review comments and github isn't loading them, I have a gist compiling some topics of discussion [here](https://gist.github.com/glozow/c3acaf161c95bba491fce31585b2aaf7) ACKs for top commit: laanwj: Code review re-ACK 13650fe jnewbery: Code review ACK 13650fe ariard: ACK 13650fe Tree-SHA512: 8c5cbfa91a6c714e1c8710bb281d5ff1c5af36741872a7c5df6b24874d6272b4a09f816cb8a4c7de33ef8e1c2a2c252c0df5105b7802f70bc6ff821ed7cc1a2f
- Loading branch information
Showing
16 changed files
with
841 additions
and
87 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
Updated RPCs | ||
------------ | ||
|
||
- The `testmempoolaccept` RPC now accepts multiple transactions (still experimental at the moment, | ||
API may be unstable). This is intended for testing transaction packages with dependency | ||
relationships; it is not recommended for batch-validating independent transactions. In addition to | ||
mempool policy, package policies apply: the list cannot contain more than 25 transactions or have a | ||
total size exceeding 101K virtual bytes, and cannot conflict with (spend the same inputs as) each other or | ||
the mempool, even if it would be a valid BIP125 replace-by-fee. There are some known limitations to | ||
the accuracy of the test accept: it's possible for `testmempoolaccept` to return "allowed"=True for a | ||
group of transactions, but "too-long-mempool-chain" if they are actually submitted. (#20833) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
// Copyright (c) 2021 The Bitcoin Core developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#ifndef BITCOIN_POLICY_PACKAGES_H | ||
#define BITCOIN_POLICY_PACKAGES_H | ||
|
||
#include <consensus/validation.h> | ||
#include <primitives/transaction.h> | ||
|
||
#include <vector> | ||
|
||
/** Default maximum number of transactions in a package. */ | ||
static constexpr uint32_t MAX_PACKAGE_COUNT{25}; | ||
/** Default maximum total virtual size of transactions in a package in KvB. */ | ||
static constexpr uint32_t MAX_PACKAGE_SIZE{101}; | ||
|
||
/** A "reason" why a package was invalid. It may be that one or more of the included | ||
* transactions is invalid or the package itself violates our rules. | ||
* We don't distinguish between consensus and policy violations right now. | ||
*/ | ||
enum class PackageValidationResult { | ||
PCKG_RESULT_UNSET = 0, //!< Initial value. The package has not yet been rejected. | ||
PCKG_POLICY, //!< The package itself is invalid (e.g. too many transactions). | ||
PCKG_TX, //!< At least one tx is invalid. | ||
}; | ||
|
||
/** A package is an ordered list of transactions. The transactions cannot conflict with (spend the | ||
* same inputs as) one another. */ | ||
using Package = std::vector<CTransactionRef>; | ||
|
||
class PackageValidationState : public ValidationState<PackageValidationResult> {}; | ||
|
||
#endif // BITCOIN_POLICY_PACKAGES_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.