revive: cap remaining_gas to u64::MAX in substrate_execution #10924
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
see paritytech/contract-issues#256
Problem
When calculating resource limits for nested calls through
substrate_execution::new_nested_meter, the ratio-based scaling fails whendeposit_leftis very large (e.g.,u128::MAXdefault for unlimited deposit).The calculation flow:
remaining_gas = weight_gas + deposit_gas→ huge number (deposit dominates at ~10^38)requested_gas = u64::MAX(~10^19)ratio = requested_gas / remaining_gas≈ 0.0000000000000027nested_weight_limit = ratio × weight_left≈ 0Solution
Cap
remaining_gastou64::MAXsince Ethereum gas is a u64 value. This ensures the ratio is 1.0 when a contract requests all gas, giving the nested call the full remaining weight.Test plan