Compare commits

..

3 Commits

Author SHA1 Message Date
Richard Holland
1a4d54f9d9 force build 2024-09-07 15:41:00 +10:00
Wietse Wind
26cd629d28 Merge/2.2.2 jobqueue (#360)
* Merge fbbea9e6e2

* Merge 7741483894

* clang-format

* Oops

---------

Co-authored-by: Wietse Wind <wrw@Wietses-MacBook-Pro.local>
2024-09-07 15:22:15 +10:00
RichardAH
2fb93f874b fixPageCap (#359)
* page cap fix

---------

Co-authored-by: Denis Angell <dangell@transia.co>
2024-09-07 11:39:24 +10:00
5 changed files with 221 additions and 4 deletions

View File

@@ -1,4 +1,4 @@
# Xahau # Xahau
**Note:** Throughout this README, references to "we" or "our" pertain to the community and contributors involved in the Xahau network. It does not imply a legal entity or a specific collection of individuals. **Note:** Throughout this README, references to "we" or "our" pertain to the community and contributors involved in the Xahau network. It does not imply a legal entity or a specific collection of individuals.
@@ -68,4 +68,4 @@ git-subtree. See those directories' README files for more details.
- **Testnet & Faucet**: Test applications and obtain test XAH at [xahau-test.net](https://xahau-test.net) and use the testnet explorer at [explorer.xahau.network](https://explorer.xahau.network). - **Testnet & Faucet**: Test applications and obtain test XAH at [xahau-test.net](https://xahau-test.net) and use the testnet explorer at [explorer.xahau.network](https://explorer.xahau.network).
- **Supporting Wallets**: A list of wallets that support XAH and Xahau-based assets. - **Supporting Wallets**: A list of wallets that support XAH and Xahau-based assets.
- [Xumm](https://xumm.app) - [Xumm](https://xumm.app)
- [Crossmark](https://crossmark.io) - [Crossmark](https://crossmark.io)

View File

@@ -91,8 +91,10 @@ ApplyView::dirAdd(
return page; return page;
} }
bool const capped = !rules().enabled(fixPageCap);
// Check whether we're out of pages. // Check whether we're out of pages.
if (++page >= dirNodeMaxPages) if (++page >= dirNodeMaxPages && capped)
return std::nullopt; return std::nullopt;
// We are about to create a new node; we'll link it to // We are about to create a new node; we'll link it to

View File

@@ -74,7 +74,7 @@ namespace detail {
// Feature.cpp. Because it's only used to reserve storage, and determine how // Feature.cpp. Because it's only used to reserve storage, and determine how
// large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than // large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than
// the actual number of amendments. A LogicError on startup will verify this. // the actual number of amendments. A LogicError on startup will verify this.
static constexpr std::size_t numFeatures = 71; static constexpr std::size_t numFeatures = 72;
/** Amendments that this server supports and the default voting behavior. /** Amendments that this server supports and the default voting behavior.
Whether they are enabled depends on the Rules defined in the validated Whether they are enabled depends on the Rules defined in the validated
@@ -359,6 +359,7 @@ extern uint256 const featureRemit;
extern uint256 const featureZeroB2M; extern uint256 const featureZeroB2M;
extern uint256 const fixNSDelete; extern uint256 const fixNSDelete;
extern uint256 const fix240819; extern uint256 const fix240819;
extern uint256 const fixPageCap;
} // namespace ripple } // namespace ripple

View File

@@ -465,6 +465,7 @@ REGISTER_FEATURE(Remit, Supported::yes, VoteBehavior::De
REGISTER_FEATURE(ZeroB2M, Supported::yes, VoteBehavior::DefaultNo); REGISTER_FEATURE(ZeroB2M, Supported::yes, VoteBehavior::DefaultNo);
REGISTER_FIX (fixNSDelete, Supported::yes, VoteBehavior::DefaultNo); REGISTER_FIX (fixNSDelete, Supported::yes, VoteBehavior::DefaultNo);
REGISTER_FIX (fix240819, Supported::yes, VoteBehavior::DefaultYes); REGISTER_FIX (fix240819, Supported::yes, VoteBehavior::DefaultYes);
REGISTER_FIX (fixPageCap, Supported::yes, VoteBehavior::DefaultYes);
// The following amendments are obsolete, but must remain supported // The following amendments are obsolete, but must remain supported
// because they could potentially get enabled. // because they could potentially get enabled.

View File

@@ -19,6 +19,8 @@
#include <ripple/app/hook/Enum.h> #include <ripple/app/hook/Enum.h>
#include <ripple/app/ledger/LedgerMaster.h> #include <ripple/app/ledger/LedgerMaster.h>
#include <ripple/app/tx/impl/SetHook.h> #include <ripple/app/tx/impl/SetHook.h>
#include <ripple/json/json_reader.h>
#include <ripple/json/json_writer.h>
#include <ripple/protocol/TxFlags.h> #include <ripple/protocol/TxFlags.h>
#include <ripple/protocol/jss.h> #include <ripple/protocol/jss.h>
#include <test/app/SetHook_wasm.h> #include <test/app/SetHook_wasm.h>
@@ -87,6 +89,147 @@ public:
// fee unit tests, the rest of the time we want to ignore it. // fee unit tests, the rest of the time we want to ignore it.
#define HSFEE fee(100'000'000) #define HSFEE fee(100'000'000)
#define M(m) memo(m, "", "") #define M(m) memo(m, "", "")
std::unique_ptr<Config>
makePageCapConfig(
FeatureBitset features,
uint32_t networkID,
std::string fee,
std::string a_res,
std::string o_res,
uint32_t ledgerID)
{
using namespace jtx;
Json::Value jsonValue;
Json::Reader reader;
std::string base_genesis = R"json({
"ledger": {
"accepted": true,
"accountState": [
{
"Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"Balance": "100000000000000000",
"Flags": 0,
"LedgerEntryType": "AccountRoot",
"OwnerCount": 0,
"PreviousTxnID": "A92EF82C3C68F771927E3892A2F708F12CBD492EF68A860F042E4053C8EC6C8D",
"PreviousTxnLgrSeq": 0,
"Sequence": 1,
"index": "2B6AC232AA4C4BE41BF49D2459FA4A0347E1B543A4C92FCEE0821C0201E2E9A8"
},
{
"Amendments": [],
"Flags": 0,
"LedgerEntryType": "Amendments",
"index": "7DB0788C020F02780A673DC74757F23823FA3014C1866E72CC4CD8B226CD6EF4"
},
{
"BaseFee": "A",
"Flags": 0,
"LedgerEntryType": "FeeSettings",
"ReferenceFeeUnits": 10,
"ReserveBase": 1000000,
"ReserveIncrement": 200000,
"XahauActivationLgrSeq": 0,
"index": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A651"
},
{
"Flags": 0,
"IndexNext": "40000",
"IndexPrevious": "3fffe",
"Indexes": [],
"LedgerEntryType": "DirectoryNode",
"Owner": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn",
"RootIndex": "EC1A88838E9ADA27E8ED583917C1530D2F48C3A3C93F50EDAD662D662E9BCC76",
"index": "EC1A88838E9ADA27E8ED583917C1530D2F48C3A3C93F50EDAD662D662E9BCC76"
},
{
"Flags": 0,
"IndexNext": "3fffe",
"IndexPrevious": "3fffd",
"Indexes": [],
"LedgerEntryType": "DirectoryNode",
"Owner": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn",
"RootIndex": "EC1A88838E9ADA27E8ED583917C1530D2F48C3A3C93F50EDAD662D662E9BCC76",
"index": "4A5F3F9E6762A4F89FFCD385FF2309E1F7D1309321BFEEA61D5C9ACB768DB61B"
},
{
"Flags": 0,
"Indexes": [],
"LedgerEntryType": "DirectoryNode",
"Owner": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn",
"RootIndex": "A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217D",
"index": "A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217D"
},
{
"Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn",
"Balance": "99999899000000",
"Flags": 8388608,
"LedgerEntryType": "AccountRoot",
"HookNamespaces": [ "0000000000000000000000000000000000000000000000000000000000000000" ],
"HookStateCount": 8388576,
"OwnerCount": 8388577,
"PreviousTxnID": "A92EF82C3C68F771927E3892A2F708F12CBD492EF68A860F042E4053C8EC6C8D",
"PreviousTxnLgrSeq": 0,
"Sequence": 3,
"index": "92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F"
}
],
"account_hash": "5DF3A98772FB73E782B8740E87885C6BAD9BA486422E3626DEF968AD2CB2C514",
"close_flags": 0,
"close_time": 0,
"close_time_human": "2000-Jan-01 00:00:00.000000",
"close_time_resolution": 10,
"closed": true,
"hash": "56DA0940767AC2F17F0E384F04816002403D0756432B9D503DDA20128A2AAF11",
"ledger_hash": "56DA0940767AC2F17F0E384F04816002403D0756432B9D503DDA20128A2AAF11",
"ledger_index": "0",
"parent_close_time": 0,
"parent_hash": "56DA0940767AC2F17F0E384F04816002403D0756432B9D503DDA20128A2AAF11",
"seqNum": "5",
"totalCoins": "100000000000000000",
"total_coins": "100000000000000000",
"transaction_hash": "9A77D1D1A4B36DA77B9C4DC63FDEB8F821741D157802F9C42A6ED86003D8B4A0",
"transactions": []
},
"ledger_current_index": 0,
"status": "success",
"validated": true
})json";
reader.parse(base_genesis, jsonValue);
foreachFeature(features, [&](uint256 const& feature) {
std::string featureName = featureToName(feature);
std::optional<uint256> featureHash =
getRegisteredFeature(featureName);
if (featureHash.has_value())
{
std::string hashString = to_string(featureHash.value());
jsonValue["ledger"]["accountState"][1]["Amendments"].append(
hashString);
}
});
jsonValue["ledger_current_index"] = ledgerID;
jsonValue["ledger"]["ledger_index"] = to_string(ledgerID);
jsonValue["ledger"]["seqNum"] = to_string(ledgerID);
return envconfig([&](std::unique_ptr<Config> cfg) {
cfg->NETWORK_ID = networkID;
cfg->START_LEDGER = jsonValue.toStyledString();
cfg->START_UP = Config::LOAD_JSON;
Section config;
config.append(
{"reference_fee = " + fee,
"account_reserve = " + a_res,
"owner_reserve = " + o_res});
auto setup = setup_FeeVote(config);
cfg->FEES = setup;
return cfg;
});
}
void void
testHooksOwnerDir(FeatureBitset features) testHooksOwnerDir(FeatureBitset features)
{ {
@@ -928,6 +1071,73 @@ public:
} }
} }
void
testPageCap(FeatureBitset features)
{
testcase("Test page cap");
using namespace jtx;
test::jtx::Env env{
*this,
makePageCapConfig(features, 21337, "10", "1000000", "200000", 0),
features};
bool const hasFix = env.current()->rules().enabled(fixPageCap);
auto const alice = Account{"alice"};
env.memoize(alice);
auto const bob = Account{"bob"};
env.fund(XRP(10000000), bob);
auto const preHookCount = (*env.le(alice))[sfHookStateCount];
auto const preOwnerCount = (*env.le(alice))[sfOwnerCount];
std::string hook =
"0061736D01000000012A0660057F7F7F7F7F017E60027F7F017E60027F7F017F60"
"047F7F7F7F017E60037F7F7E017E60017F017E02520603656E7605747261636500"
"0003656E760C686F6F6B5F6163636F756E74000103656E76025F67000203656E76"
"057374617465000303656E760973746174655F736574000303656E760661636365"
"70740004030201050503010002062B077F0141B088040B7F004180080B7F0041A2"
"080B7F004180080B7F0041B088040B7F0041000B7F0041010B07080104686F6F6B"
"00060ABF830001BB830002017F017E230041D0006B220124002001200036024C41"
"900841114180084110410010001A200141306A2200411410011A4101410110021A"
"200141286A41082000411410031A2001200131002F200131002842388620013100"
"294230867C200131002A4228867C200131002B4220867C200131002C4218867C20"
"0131002D4210867C200131002E4208867C7C3703202001410036021C0340419280"
"80807841C90110021A200128021C41C8014E4504402001200134021C2001290320"
"42C8017E7C370310200141106A220041082000410810041A2001200128021C4101"
"6A36021C0C010B0B2001200129032042017C3703202001200141286A220036020C"
"200128020C200129032042388842FF01833C0000200128020C2001290320423088"
"42FF01833C0001200128020C200129032042288842FF01833C0002200128020C20"
"0129032042208842FF01833C0003200128020C200129032042188842FF01833C00"
"04200128020C200129032042108842FF01833C0005200128020C20012903204208"
"8842FF01833C0006200128020C200129032042FF01833C00072000410820014130"
"6A411410041A4180084110421C1005200141D0006A24000B0B2801004180080B21"
"426173652E633A2043616C6C65642E0022426173652E633A2043616C6C65642E2"
"2";
// install the hook on alice
env(ripple::test::jtx::hook(alice, {{hso(hook, overrideFlag)}}, 0),
M("set fix_page_cap"),
HSFEE);
env.close();
env(invoke::invoke(alice),
M("test simple"),
fee(XRP(1)),
ter(tesSUCCESS));
env.close();
BEAST_EXPECT(
(*env.le(alice))[sfHookStateCount] == hasFix ? preHookCount + 200
: preHookCount + 64);
BEAST_EXPECT(
(*env.le(alice))[sfOwnerCount] == hasFix ? preHookCount + 202
: preHookCount + 66);
}
void void
testCreate(FeatureBitset features) testCreate(FeatureBitset features)
{ {
@@ -11761,6 +11971,7 @@ public:
testNSDelete(features); testNSDelete(features);
testNSDeletePartial(features); testNSDeletePartial(features);
testPageCap(features);
testWasm(features); testWasm(features);
test_accept(features); test_accept(features);
@@ -11862,6 +12073,8 @@ public:
testWithFeatures(sa - fixXahauV2); testWithFeatures(sa - fixXahauV2);
testWithFeatures(sa - fixXahauV1 - fixXahauV2); testWithFeatures(sa - fixXahauV1 - fixXahauV2);
testWithFeatures(sa - fixXahauV1 - fixXahauV2 - fixNSDelete); testWithFeatures(sa - fixXahauV1 - fixXahauV2 - fixNSDelete);
testWithFeatures(
sa - fixXahauV1 - fixXahauV2 - fixNSDelete - fixPageCap);
} }
private: private: