Skip to content

Commit 00ecacc

Browse files
kkuehlzzander-xyz
authored andcommitted
[staking]: Reduce pagination on linked list getters from 100 to 50
This includes: * precompile_get_delegations() * precompile_get_delegators()
1 parent 46728f9 commit 00ecacc

File tree

4 files changed

+50
-27
lines changed

4 files changed

+50
-27
lines changed

category/execution/monad/staking/staking_contract.cpp

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -858,19 +858,19 @@ StakingContract::precompile_dispatch(byte_string_view &input)
858858
case PrecompileSelector::GET_DELEGATIONS:
859859
// [0,100,0,0,0,0,0]
860860
return {
861-
&StakingContract::precompile_get_delegations,
861+
&StakingContract::precompile_get_delegations<traits>,
862862
LINKED_LIST_GETTER_OP_COST};
863863
case PrecompileSelector::GET_DELEGATORS:
864864
// [0,100,0,0,0,0,0]
865865
return {
866-
&StakingContract::precompile_get_delegators,
866+
&StakingContract::precompile_get_delegators<traits>,
867867
LINKED_LIST_GETTER_OP_COST};
868868
default:
869869
return {&StakingContract::precompile_fallback, 40000};
870870
}
871871
}
872872

873-
EXPLICIT_MONAD_TRAITS_MEMBER(StakingContract::precompile_dispatch)
873+
EXPLICIT_MONAD_TRAITS_MEMBER(StakingContract::precompile_dispatch);
874874

875875
std::tuple<bool, u32_be, std::vector<u64_be>> StakingContract::get_valset(
876876
StorageArray<u64_be> const &valset, uint32_t const start_index,
@@ -985,8 +985,8 @@ Result<byte_string> StakingContract::get_valset(
985985
return StakingError::InternalError;
986986
}
987987

988-
auto const [done, next_index, valids] = get_valset(
989-
valset, start_index.native(), limits::paginated_results_size());
988+
auto const [done, next_index, valids] =
989+
get_valset(valset, start_index.native(), limits::array_pagination());
990990
AbiEncoder encoder;
991991
encoder.add_bool(done);
992992
encoder.add_uint(next_index);
@@ -1019,6 +1019,7 @@ Result<byte_string> StakingContract::precompile_get_execution_valset(
10191019
return get_valset(input, valset);
10201020
}
10211021

1022+
template <Traits traits>
10221023
Result<byte_string> StakingContract::precompile_get_delegations(
10231024
byte_string_view input, evmc_address const &,
10241025
evmc_uint256be const &msg_value)
@@ -1032,7 +1033,7 @@ Result<byte_string> StakingContract::precompile_get_delegations(
10321033
}
10331034

10341035
auto const [done, next_val_id, vals_page] = get_validators_for_delegator(
1035-
delegator, start_val_id, limits::paginated_results_size());
1036+
delegator, start_val_id, limits::linked_list_pagination<traits>());
10361037

10371038
AbiEncoder encoder;
10381039
encoder.add_bool(done);
@@ -1041,6 +1042,9 @@ Result<byte_string> StakingContract::precompile_get_delegations(
10411042
return encoder.encode_final();
10421043
}
10431044

1045+
EXPLICIT_MONAD_TRAITS_MEMBER(StakingContract::precompile_get_delegations);
1046+
1047+
template <Traits traits>
10441048
Result<byte_string> StakingContract::precompile_get_delegators(
10451049
byte_string_view input, evmc_address const &,
10461050
evmc_uint256be const &msg_value)
@@ -1055,7 +1059,9 @@ Result<byte_string> StakingContract::precompile_get_delegators(
10551059
}
10561060

10571061
auto const [done, next_del_addr, dels_page] = get_delegators_for_validator(
1058-
val_id, start_delegator_address, limits::paginated_results_size());
1062+
val_id,
1063+
start_delegator_address,
1064+
limits::linked_list_pagination<traits>());
10591065

10601066
AbiEncoder encoder;
10611067
encoder.add_bool(done);
@@ -1064,6 +1070,8 @@ Result<byte_string> StakingContract::precompile_get_delegators(
10641070
return encoder.encode_final();
10651071
}
10661072

1073+
EXPLICIT_MONAD_TRAITS_MEMBER(StakingContract::precompile_get_delegators);
1074+
10671075
Result<byte_string> StakingContract::precompile_get_epoch(
10681076
byte_string_view const, evmc_address const &,
10691077
evmc_uint256be const &msg_value)
@@ -1322,7 +1330,7 @@ Result<void> StakingContract::delegate(
13221330
return outcome::success();
13231331
}
13241332

1325-
EXPLICIT_MONAD_TRAITS_MEMBER(StakingContract::delegate)
1333+
EXPLICIT_MONAD_TRAITS_MEMBER(StakingContract::delegate);
13261334

13271335
template <Traits traits>
13281336
Result<byte_string> StakingContract::precompile_delegate(
@@ -1341,7 +1349,7 @@ Result<byte_string> StakingContract::precompile_delegate(
13411349
return byte_string{abi_encode_bool(true)};
13421350
}
13431351

1344-
EXPLICIT_MONAD_TRAITS_MEMBER(StakingContract::precompile_delegate)
1352+
EXPLICIT_MONAD_TRAITS_MEMBER(StakingContract::precompile_delegate);
13451353

13461354
template <Traits traits>
13471355
Result<byte_string> StakingContract::precompile_undelegate(
@@ -1434,7 +1442,7 @@ Result<byte_string> StakingContract::precompile_undelegate(
14341442
return byte_string{abi_encode_bool(true)};
14351443
}
14361444

1437-
EXPLICIT_MONAD_TRAITS_MEMBER(StakingContract::precompile_undelegate)
1445+
EXPLICIT_MONAD_TRAITS_MEMBER(StakingContract::precompile_undelegate);
14381446

14391447
// TODO: No compounds allowed if auth_address is under sufficent amount.
14401448
template <Traits traits>
@@ -1467,7 +1475,7 @@ Result<byte_string> StakingContract::precompile_compound(
14671475
return byte_string{abi_encode_bool(true)};
14681476
}
14691477

1470-
EXPLICIT_MONAD_TRAITS_MEMBER(StakingContract::precompile_compound)
1478+
EXPLICIT_MONAD_TRAITS_MEMBER(StakingContract::precompile_compound);
14711479

14721480
Result<byte_string> StakingContract::precompile_withdraw(
14731481
byte_string_view input, evmc_address const &msg_sender,
@@ -1731,7 +1739,7 @@ Result<void> StakingContract::syscall_reward(
17311739
return outcome::success();
17321740
}
17331741

1734-
EXPLICIT_MONAD_TRAITS_MEMBER(StakingContract::syscall_reward)
1742+
EXPLICIT_MONAD_TRAITS_MEMBER(StakingContract::syscall_reward);
17351743

17361744
Result<void> StakingContract::syscall_snapshot(
17371745
byte_string_view const input, uint256_t const &value)

category/execution/monad/staking/staking_contract.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,8 +575,10 @@ class StakingContract
575575
byte_string_view, evmc_address const &, evmc_uint256be const &);
576576
Result<byte_string> precompile_get_execution_valset(
577577
byte_string_view, evmc_address const &, evmc_uint256be const &);
578+
template <Traits traits>
578579
Result<byte_string> precompile_get_delegations(
579580
byte_string_view, evmc_address const &, evmc_uint256be const &);
581+
template <Traits traits>
580582
Result<byte_string> precompile_get_delegators(
581583
byte_string_view, evmc_address const &, evmc_uint256be const &);
582584
Result<byte_string> precompile_get_epoch(

category/execution/monad/staking/test_staking_contract.cpp

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,10 @@ struct StakeTraits : public MonadTraitsTest<MonadRevisionT>
9797
static constexpr uint256_t MAX_EXTERNAL_REWARD =
9898
limits::max_external_reward();
9999

100-
static constexpr uint64_t PAGINATED_RESULTS_SIZE =
101-
limits::paginated_results_size();
100+
static constexpr uint32_t ARRAY_PAGINATION = limits::array_pagination();
101+
102+
static constexpr uint32_t LINKED_LIST_PAGINATION =
103+
limits::linked_list_pagination<Trait>();
102104

103105
void SetUp() override
104106
{
@@ -713,10 +715,11 @@ TEST_F(StakeLatest, nonpayable_functions_revert)
713715
contract.precompile_get_execution_valset({}, {}, value).assume_error(),
714716
StakingError::ValueNonZero);
715717
EXPECT_EQ(
716-
contract.precompile_get_delegations({}, {}, value).assume_error(),
718+
contract.precompile_get_delegations<Trait>({}, {}, value)
719+
.assume_error(),
717720
StakingError::ValueNonZero);
718721
EXPECT_EQ(
719-
contract.precompile_get_delegators({}, {}, value).assume_error(),
722+
contract.precompile_get_delegators<Trait>({}, {}, value).assume_error(),
720723
StakingError::ValueNonZero);
721724
EXPECT_EQ(
722725
contract.precompile_get_epoch({}, {}, value).assume_error(),
@@ -4368,7 +4371,7 @@ TEST_F(StakeLatest, get_valset_paginated_reads)
43684371
auto paginated_res = contract.get_valset(
43694372
contract.vars.valset_execution,
43704373
next_index.native(),
4371-
PAGINATED_RESULTS_SIZE);
4374+
ARRAY_PAGINATION);
43724375
std::vector<u64_be> valset_page;
43734376
std::tie(done2, next_index, valset_page) = std::move(paginated_res);
43744377
valset_paginated.insert_range(valset_paginated.end(), valset_page);
@@ -4379,23 +4382,23 @@ TEST_F(StakeLatest, get_valset_paginated_reads)
43794382
EXPECT_TRUE(valset_paginated == valset_one_read);
43804383
}
43814384

4382-
TEST_F(StakeLatest, get_delegators_for_validator_paginated_reads)
4385+
TYPED_TEST(StakeAllRevisions, get_delegators_for_validator_paginated_reads)
43834386
{
43844387
auto const auth_address = 0xdeadbeef_address;
4385-
auto res = add_validator(auth_address, ACTIVE_VALIDATOR_STAKE);
4388+
auto res = this->add_validator(auth_address, this->ACTIVE_VALIDATOR_STAKE);
43864389
ASSERT_FALSE(res.has_error());
43874390
auto const val = res.value();
43884391

43894392
for (uint32_t i = 0; i < 999; ++i) {
43904393
// delegate twice to make sure dups are handled correctly
43914394
auto const del = Address{i + 1};
4392-
ASSERT_FALSE(delegate(val.id, del, 100_u256 * MON).has_error());
4393-
ASSERT_FALSE(delegate(val.id, del, 100_u256 * MON).has_error());
4395+
ASSERT_FALSE(this->delegate(val.id, del, 100_u256 * MON).has_error());
4396+
ASSERT_FALSE(this->delegate(val.id, del, 100_u256 * MON).has_error());
43944397
}
43954398

43964399
// read all the delegators
43974400
auto const [done1, _, delegators_one_read] =
4398-
contract.get_delegators_for_validator(
4401+
this->contract.get_delegators_for_validator(
43994402
val.id, Address{}, std::numeric_limits<uint32_t>::max());
44004403
EXPECT_TRUE(done1);
44014404
EXPECT_EQ(
@@ -4407,8 +4410,8 @@ TEST_F(StakeLatest, get_delegators_for_validator_paginated_reads)
44074410
Address next_delegator{};
44084411
std::vector<Address> delegators_paginated;
44094412
do {
4410-
auto paginated_res = contract.get_delegators_for_validator(
4411-
val.id, next_delegator, PAGINATED_RESULTS_SIZE);
4413+
auto paginated_res = this->contract.get_delegators_for_validator(
4414+
val.id, next_delegator, this->LINKED_LIST_PAGINATION);
44124415
std::vector<Address> delegators_page;
44134416
std::tie(done2, next_delegator, delegators_page) =
44144417
std::move(paginated_res);

category/execution/monad/staking/util/constants.hpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,23 @@ namespace limits
8585
return 200;
8686
}
8787

88-
// Results for get_valset, get_delegators_for_validator, and
89-
// get_validators_for_delegator are paginated
90-
constexpr uint64_t paginated_results_size()
88+
constexpr uint32_t array_pagination()
9189
{
9290
return 100;
9391
};
9492

93+
template <Traits traits>
94+
constexpr uint32_t linked_list_pagination()
95+
{
96+
if constexpr (traits::monad_rev() < MONAD_EIGHT) {
97+
return 100;
98+
}
99+
100+
// The relation to array pagination is each list node occupies two
101+
// slots.
102+
return 50;
103+
};
104+
95105
constexpr uint64_t withdrawal_delay()
96106
{
97107
return 1;

0 commit comments

Comments
 (0)