Skip to content

Commit c3e8039

Browse files
authored
fixXahauGenesisOwnerCount (#666)
1 parent d9e7b50 commit c3e8039

File tree

4 files changed

+65
-26
lines changed

4 files changed

+65
-26
lines changed

src/ripple/app/tx/impl/Change.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <ripple/app/misc/AmendmentTable.h>
2626
#include <ripple/app/misc/NetworkOPs.h>
2727
#include <ripple/app/tx/impl/Change.h>
28+
#include <ripple/app/tx/impl/SetHook.h>
2829
#include <ripple/app/tx/impl/SetSignerList.h>
2930
#include <ripple/app/tx/impl/XahauGenesis.h>
3031
#include <ripple/basics/Log.h>
@@ -584,10 +585,6 @@ Change::activateXahauGenesis()
584585
SetSignerList::removeFromLedger(ctx_.app, sb, accid, j_);
585586

586587
// Step 4: install genesis hooks
587-
sle->setFieldU32(
588-
sfOwnerCount, sle->getFieldU32(sfOwnerCount) + genesis_hooks.size());
589-
sb.update(sle);
590-
591588
if (sb.exists(keylet::hook(accid)))
592589
{
593590
JLOG(j_.warn()) << "featureXahauGenesis genesis account already has "
@@ -598,6 +595,7 @@ Change::activateXahauGenesis()
598595
{
599596
ripple::STArray hooks{sfHooks, static_cast<int>(genesis_hooks.size())};
600597
int hookCount = 0;
598+
uint32_t hookReserve = 0;
601599

602600
for (auto const& [hookOn, wasmBytes, params] : genesis_hooks)
603601
{
@@ -703,8 +701,14 @@ Change::activateXahauGenesis()
703701
}
704702

705703
hooks.push_back(hookObj);
704+
705+
hookReserve += SetHook::computeHookReserve(hookObj);
706706
}
707707

708+
sle->setFieldU32(
709+
sfOwnerCount, sle->getFieldU32(sfOwnerCount) + hookReserve);
710+
sb.update(sle);
711+
708712
auto sle = std::make_shared<SLE>(keylet::hook(accid));
709713
sle->setFieldArray(sfHooks, hooks);
710714
sle->setAccountID(sfAccount, accid);
@@ -745,6 +749,8 @@ Change::activateXahauGenesis()
745749
ripple::STArray hooks{sfHooks, 1};
746750
STObject hookObj{sfHook};
747751
hookObj.setFieldH256(sfHookHash, governHash);
752+
753+
uint32_t hookReserve = 0;
748754
// parameters
749755
{
750756
std::vector<STObject> vec;
@@ -760,6 +766,7 @@ Change::activateXahauGenesis()
760766
sfHookParameters, STArray(vec, sfHookParameters));
761767
}
762768

769+
hookReserve += SetHook::computeHookReserve(hookObj);
763770
hooks.push_back(hookObj);
764771

765772
auto sle = std::make_shared<SLE>(hookKL);
@@ -786,7 +793,8 @@ Change::activateXahauGenesis()
786793

787794
sle->setAccountID(sfRegularKey, noAccount());
788795
sle->setFieldU32(sfFlags, lsfDisableMaster);
789-
sle->setFieldU32(sfOwnerCount, sle->getFieldU32(sfOwnerCount) + 1);
796+
sle->setFieldU32(
797+
sfOwnerCount, sle->getFieldU32(sfOwnerCount) + hookReserve);
790798
sb.update(sle);
791799
}
792800
}

src/ripple/app/tx/impl/SetHook.cpp

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1221,6 +1221,29 @@ updateHookParameters(
12211221
return tesSUCCESS;
12221222
}
12231223

1224+
/**
1225+
* Compute the reserve required for a hook object.
1226+
* @param hookObj The hook object to compute the reserve for.(not Transaction
1227+
* field, use the Hook object inside the ltHook object.)
1228+
* @return The reserve required for the hook object.
1229+
*/
1230+
uint32_t
1231+
SetHook::computeHookReserve(STObject const& hookObj)
1232+
{
1233+
if (!hookObj.isFieldPresent(sfHookHash))
1234+
return 0;
1235+
1236+
int reserve{1};
1237+
1238+
if (hookObj.isFieldPresent(sfHookParameters))
1239+
reserve += hookObj.getFieldArray(sfHookParameters).size();
1240+
1241+
if (hookObj.isFieldPresent(sfHookGrants))
1242+
reserve += hookObj.getFieldArray(sfHookGrants).size();
1243+
1244+
return reserve;
1245+
};
1246+
12241247
struct KeyletComparator
12251248
{
12261249
bool
@@ -1972,28 +1995,14 @@ SetHook::setHook()
19721995
int oldHookReserve = 0;
19731996
int newHookReserve = 0;
19741997

1975-
auto const computeHookReserve = [](STObject const& hookObj) -> int {
1976-
if (!hookObj.isFieldPresent(sfHookHash))
1977-
return 0;
1978-
1979-
int reserve{1};
1980-
1981-
if (hookObj.isFieldPresent(sfHookParameters))
1982-
reserve += hookObj.getFieldArray(sfHookParameters).size();
1983-
1984-
if (hookObj.isFieldPresent(sfHookGrants))
1985-
reserve += hookObj.getFieldArray(sfHookGrants).size();
1986-
1987-
return reserve;
1988-
};
1989-
19901998
for (int i = 0; i < hook::maxHookChainLength(); ++i)
19911999
{
19922000
if (oldHooks && i < oldHookCount)
1993-
oldHookReserve += computeHookReserve(((*oldHooks).get())[i]);
2001+
oldHookReserve +=
2002+
SetHook::computeHookReserve(((*oldHooks).get())[i]);
19942003

19952004
if (i < newHooks.size())
1996-
newHookReserve += computeHookReserve(newHooks[i]);
2005+
newHookReserve += SetHook::computeHookReserve(newHooks[i]);
19972006
}
19982007

19992008
reserveDelta = newHookReserve - oldHookReserve;

src/ripple/app/tx/impl/SetHook.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ class SetHook : public Transactor
9191
static HookSetValidation
9292
validateHookSetEntry(SetHookCtx& ctx, STObject const& hookSetObj);
9393

94+
static uint32_t
95+
computeHookReserve(STObject const& hookObj);
96+
9497
private:
9598
TER
9699
setHook();

src/test/app/XahauGenesis_test.cpp

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,9 @@ struct XahauGenesis_test : public beast::unit_test::suite
139139
false, // means the calling test already burned some of the genesis
140140
bool skipTests = false,
141141
bool const testFlag = false,
142-
bool const badNetID = false)
142+
bool const badNetID = false,
143+
uint32_t const expectedOwnerCount =
144+
10 /** testFlag ? 10 : 14 (default) */)
143145
{
144146
using namespace jtx;
145147

@@ -247,7 +249,10 @@ struct XahauGenesis_test : public beast::unit_test::suite
247249
BEAST_EXPECT(
248250
genesisAccRoot->getFieldAmount(sfBalance) ==
249251
XahauGenesis::GenesisAmount);
250-
BEAST_EXPECT(genesisAccRoot->getFieldU32(sfOwnerCount) == 2);
252+
BEAST_EXPECT(
253+
genesisAccRoot->getFieldU32(sfOwnerCount) == !testFlag
254+
? expectedOwnerCount
255+
: 14);
251256

252257
// ensure the definitions are correctly set
253258
{
@@ -583,7 +588,14 @@ struct XahauGenesis_test : public beast::unit_test::suite
583588
toBase58(t), membersStr);
584589
}
585590

586-
activate(__LINE__, env, true, false, true);
591+
activate(
592+
__LINE__,
593+
env,
594+
true,
595+
false,
596+
true,
597+
{},
598+
3 /* IRR,IRD,IMC */ + members.size() + tables.size());
587599

588600
env.close();
589601
env.close();
@@ -2235,13 +2247,18 @@ struct XahauGenesis_test : public beast::unit_test::suite
22352247
BEAST_EXPECT(!!hookLE);
22362248
uint256 const ns = beast::zero;
22372249
uint8_t mc = 0;
2250+
uint8_t paramsCount = 0;
2251+
22382252
if (hookLE)
22392253
{
22402254
auto const hooksArray = hookLE->getFieldArray(sfHooks);
22412255
BEAST_EXPECT(
22422256
hooksArray.size() == 1 &&
22432257
hooksArray[0].getFieldH256(sfHookHash) == governHookHash);
22442258

2259+
paramsCount =
2260+
hooksArray[0].getFieldArray(sfHookParameters).size();
2261+
22452262
for (Account const* m : members)
22462263
{
22472264
auto const mVec = vecFromAcc(*m);
@@ -2308,7 +2325,9 @@ struct XahauGenesis_test : public beast::unit_test::suite
23082325
BEAST_EXPECT(!!root);
23092326
if (root)
23102327
{
2311-
BEAST_EXPECT(root->getFieldU32(sfOwnerCount) == mc * 2 + 2);
2328+
BEAST_EXPECT(
2329+
root->getFieldU32(sfOwnerCount) ==
2330+
mc * 2 + 2 + paramsCount);
23122331
BEAST_EXPECT(root->getFieldU32(sfFlags) & lsfDisableMaster);
23132332
BEAST_EXPECT(root->getAccountID(sfRegularKey) == noAccount());
23142333
}

0 commit comments

Comments
 (0)