Compare commits

...

11 Commits

Author SHA1 Message Date
Ed Hennis
f4d297b54c Merge branch 'develop' into ximinez/fix-batchinnersigs 2025-12-05 21:12:51 -05:00
Bart
b986395ecc docs: Infer version of Conan dependency to export (#6112)
This change updates a script in the documentation to automatically infer the version of a patched Conan dependency from the conan.lock file.
2025-12-05 11:44:48 -05:00
Ed Hennis
d76c69e78d Merge remote-tracking branch 'XRPLF/develop' into ximinez/fix-batchinnersigs
* XRPLF/develop:
  Implement Lending Protocol (unsupported) (5270)
2025-12-02 17:36:18 -05:00
Ed Hennis
06b4e84654 Merge branch 'develop' into ximinez/fix-batchinnersigs 2025-12-01 14:40:23 -05:00
Ed Hennis
80579dca62 Merge branch 'develop' into ximinez/fix-batchinnersigs 2025-11-28 15:46:27 -05:00
Ed Hennis
37c3133a91 Merge branch 'develop' into ximinez/fix-batchinnersigs 2025-11-27 01:48:40 -05:00
Ed Hennis
5c31b55357 Merge branch 'develop' into ximinez/fix-batchinnersigs 2025-11-26 00:24:58 -05:00
Ed Hennis
cc26829d32 Merge branch 'develop' into ximinez/fix-batchinnersigs 2025-11-25 14:54:48 -05:00
Ed Hennis
ebb05195cf Merge branch 'develop' into ximinez/fix-batchinnersigs 2025-11-24 21:48:54 -05:00
Ed Hennis
bd7a9051db Merge branch 'develop' into ximinez/fix-batchinnersigs 2025-11-24 21:30:04 -05:00
Ed Hennis
f4d55c8b77 fix: Inner batch transactions never have a valid signatures
- Introduces amendment `fixBatchInnerSigs`
2025-11-21 16:11:05 -05:00
6 changed files with 49 additions and 23 deletions

View File

@@ -141,26 +141,37 @@ Alternatively, you can pull the patched recipes into the repository and use them
locally: locally:
```bash ```bash
# Extract the version number from the lockfile.
function extract_version {
version=$(cat conan.lock | sed -nE "s@.+${1}/(.+)#.+@\1@p" | head -n1)
echo ${version}
}
# Define which recipes to export.
recipes=(ed25519 grpc secp256k1 snappy soci)
# Selectively check out the recipes from our CCI fork.
cd external cd external
mkdir -p conan-center-index mkdir -p conan-center-index
cd conan-center-index cd conan-center-index
git init git init
git remote add origin git@github.com:XRPLF/conan-center-index.git git remote add origin git@github.com:XRPLF/conan-center-index.git
git sparse-checkout init git sparse-checkout init
git sparse-checkout set recipes/ed25519 for recipe in ${recipes[@]}; do
git sparse-checkout add recipes/grpc echo "Checking out ${recipe}..."
git sparse-checkout add recipes/secp256k1 git sparse-checkout add recipes/${recipe}/all
git sparse-checkout add recipes/snappy done
git sparse-checkout add recipes/soci
git fetch origin master git fetch origin master
git checkout master git checkout master
rm -rf .git
cd ../.. cd ../..
conan export --version 2015.03 external/conan-center-index/recipes/ed25519/all
conan export --version 1.72.0 external/conan-center-index/recipes/grpc/all # Export the recipes into the local cache.
conan export --version 0.7.0 external/conan-center-index/recipes/secp256k1/all for recipe in ${recipes[@]}; do
conan export --version 1.1.10 external/conan-center-index/recipes/snappy/all version=$(extract_version ${recipe})
conan export --version 4.0.3 external/conan-center-index/recipes/soci/all echo "Exporting ${recipe}/${version}..."
conan export --version $(extract_version ${recipe}) \
external/conan-center-index/recipes/${recipe}/all
done
``` ```
In the case we switch to a newer version of a dependency that still requires a In the case we switch to a newer version of a dependency that still requires a

View File

@@ -16,6 +16,7 @@
// Add new amendments to the top of this list. // Add new amendments to the top of this list.
// Keep it sorted in reverse chronological order. // Keep it sorted in reverse chronological order.
XRPL_FIX (BatchInnerSigs, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(LendingProtocol, Supported::no, VoteBehavior::DefaultNo) XRPL_FEATURE(LendingProtocol, Supported::no, VoteBehavior::DefaultNo)
XRPL_FEATURE(PermissionDelegationV1_1, Supported::no, VoteBehavior::DefaultNo) XRPL_FEATURE(PermissionDelegationV1_1, Supported::no, VoteBehavior::DefaultNo)
XRPL_FIX (DirectoryLimit, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (DirectoryLimit, Supported::yes, VoteBehavior::DefaultNo)

View File

@@ -2295,9 +2295,12 @@ class Batch_test : public beast::unit_test::suite
Serializer s; Serializer s;
parsed.object->add(s); parsed.object->add(s);
auto const jrr = env.rpc("submit", strHex(s.slice()))[jss::result]; auto const jrr = env.rpc("submit", strHex(s.slice()))[jss::result];
BEAST_EXPECT( BEAST_EXPECTS(
jrr[jss::status] == "success" && jrr[jss::status] == "error" &&
jrr[jss::engine_result] == "temINVALID_FLAG"); jrr[jss::error] == "invalidTransaction" &&
jrr[jss::error_exception] ==
"fails local checks: Empty SigningPubKey.",
to_string(jrr));
env.close(); env.close();
} }
@@ -4353,6 +4356,7 @@ public:
using namespace test::jtx; using namespace test::jtx;
auto const sa = testable_amendments(); auto const sa = testable_amendments();
testWithFeats(sa); testWithFeats(sa);
testWithFeats(sa - fixBatchInnerSigs);
} }
}; };

View File

@@ -1681,7 +1681,7 @@ NetworkOPsImp::apply(std::unique_lock<std::mutex>& batchLock)
// only be set if the Batch feature is enabled. If Batch is // only be set if the Batch feature is enabled. If Batch is
// not enabled, the flag is always invalid, so don't relay // not enabled, the flag is always invalid, so don't relay
// it regardless. // it regardless.
!sttx.isFlag(tfInnerBatchTxn)) !(sttx.isFlag(tfInnerBatchTxn)))
{ {
protocol::TMTransaction tx; protocol::TMTransaction tx;
Serializer s; Serializer s;

View File

@@ -671,7 +671,10 @@ Transactor::checkSign(
auto const pkSigner = sigObject.getFieldVL(sfSigningPubKey); auto const pkSigner = sigObject.getFieldVL(sfSigningPubKey);
// Ignore signature check on batch inner transactions // Ignore signature check on batch inner transactions
if (parentBatchId && view.rules().enabled(featureBatch)) bool const useCtx = view.rules().enabled(fixBatchInnerSigs);
if ((useCtx ? parentBatchId.has_value()
: sigObject.isFlag(tfInnerBatchTxn)) &&
view.rules().enabled(featureBatch))
{ {
// Defensive Check: These values are also checked in Batch::preflight // Defensive Check: These values are also checked in Batch::preflight
if (sigObject.isFieldPresent(sfTxnSignature) || !pkSigner.empty() || if (sigObject.isFieldPresent(sfTxnSignature) || !pkSigner.empty() ||

View File

@@ -41,6 +41,12 @@ checkValidity(
Validity::SigBad, Validity::SigBad,
"Malformed: Invalid inner batch transaction."}; "Malformed: Invalid inner batch transaction."};
// This block should probably have never been included in the
// original `Batch` implementation. An inner transaction never
// has a valid signature.
bool const neverValid = rules.enabled(fixBatchInnerSigs);
if (!neverValid)
{
std::string reason; std::string reason;
if (!passesLocalChecks(tx, reason)) if (!passesLocalChecks(tx, reason))
{ {
@@ -51,6 +57,7 @@ checkValidity(
router.setFlags(id, SF_SIGGOOD); router.setFlags(id, SF_SIGGOOD);
return {Validity::Valid, ""}; return {Validity::Valid, ""};
} }
}
if (any(flags & SF_SIGBAD)) if (any(flags & SF_SIGBAD))
// Signature is known bad // Signature is known bad