diff --git a/src/ledger/NetworkConfig.cpp b/src/ledger/NetworkConfig.cpp index 9096814c9e..18bb8ebd1b 100644 --- a/src/ledger/NetworkConfig.cpp +++ b/src/ledger/NetworkConfig.cpp @@ -31,40 +31,55 @@ createConfigSettingEntry(ConfigSettingEntry const& configSetting, } ConfigSettingEntry -initialMaxContractSizeEntry() +initialMaxContractSizeEntry(Config const& cfg) { ConfigSettingEntry entry(CONFIG_SETTING_CONTRACT_MAX_SIZE_BYTES); entry.contractMaxSizeBytes() = InitialSorobanNetworkConfig::MAX_CONTRACT_SIZE; + if (cfg.TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE) + { + entry.contractMaxSizeBytes() = + TestOverrideSorobanNetworkConfig::MAX_CONTRACT_SIZE; + } return entry; } ConfigSettingEntry -initialMaxContractDataKeySizeEntry() +initialMaxContractDataKeySizeEntry(Config const& cfg) { ConfigSettingEntry entry(CONFIG_SETTING_CONTRACT_DATA_KEY_SIZE_BYTES); entry.contractDataKeySizeBytes() = InitialSorobanNetworkConfig::MAX_CONTRACT_DATA_KEY_SIZE_BYTES; + if (cfg.TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE) + { + entry.contractDataKeySizeBytes() = + TestOverrideSorobanNetworkConfig::MAX_CONTRACT_DATA_KEY_SIZE_BYTES; + } return entry; } ConfigSettingEntry -initialMaxContractDataEntrySizeEntry() +initialMaxContractDataEntrySizeEntry(Config const& cfg) { ConfigSettingEntry entry(CONFIG_SETTING_CONTRACT_DATA_ENTRY_SIZE_BYTES); entry.contractDataEntrySizeBytes() = InitialSorobanNetworkConfig::MAX_CONTRACT_DATA_ENTRY_SIZE_BYTES; + if (cfg.TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE) + { + entry.contractDataEntrySizeBytes() = TestOverrideSorobanNetworkConfig:: + MAX_CONTRACT_DATA_ENTRY_SIZE_BYTES; + } return entry; } ConfigSettingEntry -initialContractComputeSettingsEntry() +initialContractComputeSettingsEntry(Config const& cfg) { ConfigSettingEntry entry(CONFIG_SETTING_CONTRACT_COMPUTE_V0); auto& e = entry.contractCompute(); @@ -77,11 +92,20 @@ initialContractComputeSettingsEntry() InitialSorobanNetworkConfig::FEE_RATE_PER_INSTRUCTIONS_INCREMENT; e.txMemoryLimit = InitialSorobanNetworkConfig::MEMORY_LIMIT; + if (cfg.TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE) + { + e.ledgerMaxInstructions = + TestOverrideSorobanNetworkConfig::LEDGER_MAX_INSTRUCTIONS; + e.txMaxInstructions = + TestOverrideSorobanNetworkConfig::TX_MAX_INSTRUCTIONS; + e.txMemoryLimit = TestOverrideSorobanNetworkConfig::MEMORY_LIMIT; + } + return entry; } ConfigSettingEntry -initialContractLedgerAccessSettingsEntry() +initialContractLedgerAccessSettingsEntry(Config const& cfg) { ConfigSettingEntry entry(CONFIG_SETTING_CONTRACT_LEDGER_COST_V0); auto& e = entry.contractLedgerCost(); @@ -114,6 +138,25 @@ initialContractLedgerAccessSettingsEntry() e.bucketListWriteFeeGrowthFactor = InitialSorobanNetworkConfig::BUCKET_LIST_WRITE_FEE_GROWTH_FACTOR; + if (cfg.TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE) + { + e.ledgerMaxReadLedgerEntries = + TestOverrideSorobanNetworkConfig::LEDGER_MAX_READ_LEDGER_ENTRIES; + e.ledgerMaxReadBytes = + TestOverrideSorobanNetworkConfig::LEDGER_MAX_READ_BYTES; + e.ledgerMaxWriteLedgerEntries = + TestOverrideSorobanNetworkConfig::LEDGER_MAX_WRITE_LEDGER_ENTRIES; + e.ledgerMaxWriteBytes = + TestOverrideSorobanNetworkConfig::LEDGER_MAX_WRITE_BYTES; + e.txMaxReadLedgerEntries = + TestOverrideSorobanNetworkConfig::TX_MAX_READ_LEDGER_ENTRIES; + e.txMaxReadBytes = TestOverrideSorobanNetworkConfig::TX_MAX_READ_BYTES; + e.txMaxWriteLedgerEntries = + TestOverrideSorobanNetworkConfig::TX_MAX_WRITE_LEDGER_ENTRIES; + e.txMaxWriteBytes = + TestOverrideSorobanNetworkConfig::TX_MAX_WRITE_BYTES; + } + return entry; } @@ -129,7 +172,7 @@ initialContractHistoricalDataSettingsEntry() } ConfigSettingEntry -initialContractEventsSettingsEntry() +initialContractEventsSettingsEntry(Config const& cfg) { ConfigSettingEntry entry(CONFIG_SETTING_CONTRACT_EVENTS_V0); auto& e = entry.contractEvents(); @@ -139,11 +182,16 @@ initialContractEventsSettingsEntry() e.feeContractEvents1KB = InitialSorobanNetworkConfig::FEE_CONTRACT_EVENTS_SIZE_1KB; + if (cfg.TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE) + { + e.txMaxContractEventsSizeBytes = + TestOverrideSorobanNetworkConfig::TX_MAX_CONTRACT_EVENTS_SIZE_BYTES; + } return entry; } ConfigSettingEntry -initialContractBandwidthSettingsEntry() +initialContractBandwidthSettingsEntry(Config const& cfg) { ConfigSettingEntry entry(CONFIG_SETTING_CONTRACT_BANDWIDTH_V0); auto& e = entry.contractBandwidth(); @@ -154,15 +202,29 @@ initialContractBandwidthSettingsEntry() e.feeTxSize1KB = InitialSorobanNetworkConfig::FEE_TRANSACTION_SIZE_1KB; + if (cfg.TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE) + { + e.ledgerMaxTxsSizeBytes = TestOverrideSorobanNetworkConfig:: + LEDGER_MAX_TRANSACTION_SIZES_BYTES; + e.txMaxSizeBytes = TestOverrideSorobanNetworkConfig::TX_MAX_SIZE_BYTES; + } + return entry; } ConfigSettingEntry -initialContractExecutionLanesSettingsEntry() +initialContractExecutionLanesSettingsEntry(Config const& cfg) { ConfigSettingEntry entry(CONFIG_SETTING_CONTRACT_EXECUTION_LANES); auto& e = entry.contractExecutionLanes(); e.ledgerMaxTxCount = InitialSorobanNetworkConfig::LEDGER_MAX_TX_COUNT; + + if (cfg.TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE) + { + e.ledgerMaxTxCount = + TestOverrideSorobanNetworkConfig::LEDGER_MAX_TX_COUNT; + } + return entry; } @@ -309,6 +371,12 @@ initialStateExpirationSettings(Config const& cfg) InitialSorobanNetworkConfig::PERSISTENT_RENT_RATE_DENOMINATOR; entry.stateExpirationSettings().tempRentRateDenominator = InitialSorobanNetworkConfig::TEMP_RENT_RATE_DENOMINATOR; + + if (cfg.TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE) + { + entry.stateExpirationSettings().maxEntryExpiration = + TestOverrideSorobanNetworkConfig::MAXIMUM_ENTRY_LIFETIME; + } return entry; } @@ -590,19 +658,21 @@ SorobanNetworkConfig::createLedgerEntriesForV20(AbstractLedgerTxn& ltx, Application& app) { #ifdef ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION - createConfigSettingEntry(initialMaxContractSizeEntry(), ltx); - createConfigSettingEntry(initialMaxContractDataKeySizeEntry(), ltx); - createConfigSettingEntry(initialMaxContractDataEntrySizeEntry(), ltx); - createConfigSettingEntry(initialContractComputeSettingsEntry(), ltx); - createConfigSettingEntry(initialContractLedgerAccessSettingsEntry(), ltx); + auto const& cfg = app.getConfig(); + createConfigSettingEntry(initialMaxContractSizeEntry(cfg), ltx); + createConfigSettingEntry(initialMaxContractDataKeySizeEntry(cfg), ltx); + createConfigSettingEntry(initialMaxContractDataEntrySizeEntry(cfg), ltx); + createConfigSettingEntry(initialContractComputeSettingsEntry(cfg), ltx); + createConfigSettingEntry(initialContractLedgerAccessSettingsEntry(cfg), + ltx); createConfigSettingEntry(initialContractHistoricalDataSettingsEntry(), ltx); - createConfigSettingEntry(initialContractEventsSettingsEntry(), ltx); - createConfigSettingEntry(initialContractBandwidthSettingsEntry(), ltx); - createConfigSettingEntry(initialContractExecutionLanesSettingsEntry(), ltx); + createConfigSettingEntry(initialContractEventsSettingsEntry(cfg), ltx); + createConfigSettingEntry(initialContractBandwidthSettingsEntry(cfg), ltx); + createConfigSettingEntry(initialContractExecutionLanesSettingsEntry(cfg), + ltx); createConfigSettingEntry(initialCpuCostParamsEntry(), ltx); createConfigSettingEntry(initialMemCostParamsEntry(), ltx); - createConfigSettingEntry(initialStateExpirationSettings(app.getConfig()), - ltx); + createConfigSettingEntry(initialStateExpirationSettings(cfg), ltx); createConfigSettingEntry(initialBucketListSizeWindow(app), ltx); createConfigSettingEntry(initialEvictionIterator(), ltx); #endif diff --git a/src/ledger/NetworkConfig.h b/src/ledger/NetworkConfig.h index 2be0a69609..85bf200dec 100644 --- a/src/ledger/NetworkConfig.h +++ b/src/ledger/NetworkConfig.h @@ -110,7 +110,7 @@ struct InitialSorobanNetworkConfig static constexpr uint32_t TX_MAX_SIZE_BYTES = MinimumSorobanNetworkConfig::TX_MAX_SIZE_BYTES; static constexpr uint32_t LEDGER_MAX_TRANSACTION_SIZES_BYTES = - MinimumSorobanNetworkConfig::TX_MAX_SIZE_BYTES; + TX_MAX_SIZE_BYTES; static constexpr int64_t FEE_TRANSACTION_SIZE_1KB = 2'000; // Contract events settings @@ -143,6 +143,61 @@ struct InitialSorobanNetworkConfig static constexpr uint32_t LEDGER_MAX_TX_COUNT = 1; }; +// Defines the subset of the `InitialSorobanNetworkConfig` to be overridden for +// testing, enabled by `Config::TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE`. +struct TestOverrideSorobanNetworkConfig +{ + // Contract size settings + static constexpr uint32_t MAX_CONTRACT_SIZE = + InitialSorobanNetworkConfig::MAX_CONTRACT_SIZE * 32; + + // Contract data settings + static constexpr uint32_t MAX_CONTRACT_DATA_KEY_SIZE_BYTES = + InitialSorobanNetworkConfig::MAX_CONTRACT_DATA_KEY_SIZE_BYTES * 10; + static constexpr uint32_t MAX_CONTRACT_DATA_ENTRY_SIZE_BYTES = + InitialSorobanNetworkConfig::MAX_CONTRACT_DATA_ENTRY_SIZE_BYTES * 10; + + // Compute settings + static constexpr int64_t TX_MAX_INSTRUCTIONS = + InitialSorobanNetworkConfig::TX_MAX_INSTRUCTIONS * 50; + static constexpr int64_t LEDGER_MAX_INSTRUCTIONS = TX_MAX_INSTRUCTIONS; + static constexpr uint32_t MEMORY_LIMIT = + InitialSorobanNetworkConfig::MEMORY_LIMIT * 10; + + // Ledger access settings + static constexpr uint32_t TX_MAX_READ_LEDGER_ENTRIES = + InitialSorobanNetworkConfig::TX_MAX_READ_LEDGER_ENTRIES * 10; + static constexpr uint32_t TX_MAX_READ_BYTES = + InitialSorobanNetworkConfig::TX_MAX_READ_BYTES * 10; + static constexpr uint32_t TX_MAX_WRITE_LEDGER_ENTRIES = + InitialSorobanNetworkConfig::TX_MAX_WRITE_LEDGER_ENTRIES * 10; + static constexpr uint32_t TX_MAX_WRITE_BYTES = + InitialSorobanNetworkConfig::TX_MAX_WRITE_BYTES * 10; + static constexpr uint32_t LEDGER_MAX_READ_LEDGER_ENTRIES = + TX_MAX_READ_LEDGER_ENTRIES; + static constexpr uint32_t LEDGER_MAX_READ_BYTES = TX_MAX_READ_BYTES; + static constexpr uint32_t LEDGER_MAX_WRITE_LEDGER_ENTRIES = + TX_MAX_WRITE_LEDGER_ENTRIES; + static constexpr uint32_t LEDGER_MAX_WRITE_BYTES = TX_MAX_WRITE_BYTES; + + // Bandwidth settings + static constexpr uint32_t TX_MAX_SIZE_BYTES = + InitialSorobanNetworkConfig::TX_MAX_SIZE_BYTES * 5; + static constexpr uint32_t LEDGER_MAX_TRANSACTION_SIZES_BYTES = + TX_MAX_SIZE_BYTES; + + // Contract events settings + static constexpr uint32_t TX_MAX_CONTRACT_EVENTS_SIZE_BYTES = + InitialSorobanNetworkConfig::TX_MAX_CONTRACT_EVENTS_SIZE_BYTES * 20; + + // State expiration settings + static constexpr uint32_t MAXIMUM_ENTRY_LIFETIME = 6307200; // 1 year + + // General execution settings + static constexpr uint32_t LEDGER_MAX_TX_COUNT = + InitialSorobanNetworkConfig::LEDGER_MAX_TX_COUNT * 5; +}; + // Wrapper for the contract-related network configuration. class SorobanNetworkConfig { diff --git a/src/main/Config.cpp b/src/main/Config.cpp index bbd6f8efbd..de5a0cfe42 100644 --- a/src/main/Config.cpp +++ b/src/main/Config.cpp @@ -264,6 +264,7 @@ Config::Config() : NODE_SEED(SecretKey::random()) #ifdef ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = false; TESTING_MINIMUM_PERSISTENT_ENTRY_LIFETIME = 0; + TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE = false; #endif #ifdef BUILD_TESTS @@ -1473,6 +1474,17 @@ Config::processConfig(std::shared_ptr t) "Overriding MINIMUM_PERSISTENT_ENTRY_LIFETIME to {}", TESTING_MINIMUM_PERSISTENT_ENTRY_LIFETIME); } + else if (item.first == "TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE") + { + TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE = readBool(item); + + if (TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE) + { + LOG_WARNING(DEFAULT_LOG, + "Overriding Soroban limits with " + "TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE"); + } + } #endif else if (item.first == "ARTIFICIALLY_SLEEP_MAIN_THREAD_FOR_TESTING") { diff --git a/src/main/Config.h b/src/main/Config.h index 48d7b481bc..2852815e6b 100644 --- a/src/main/Config.h +++ b/src/main/Config.h @@ -576,6 +576,9 @@ class Config : public std::enable_shared_from_this // Override the initial hardcoded MINIMUM_PERSISTENT_ENTRY_LIFETIME // for testing. uint32_t TESTING_MINIMUM_PERSISTENT_ENTRY_LIFETIME; + + // Increase all initial max limits to higher values for testing + bool TESTING_SOROBAN_HIGH_LIMIT_OVERRIDE; #endif #ifdef BUILD_TESTS