-
Notifications
You must be signed in to change notification settings - Fork 766
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Remove 0 as a special case in gas/storage meters #6890
base: master
Are you sure you want to change the base?
Conversation
376e944
to
4832380
Compare
Also, a limit of 0 when determining a nested call's metering limit would mean it was free to use all of the callee's resources. Now, a limit of 0 means that the nested call will have an empty storage meter.
In particular, this commit removes the usage of `0` as unlimited metering in the following tests: - `nonce` - `last_frame_output_works_on_instantiate` - `instantiation_from_contract` - `immutable_data_set_works_only_once` - `immutable_data_set_errors_with_empty_data` - `immutable_data_access_checks_work`
ed1f312
to
8e66f50
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The basic idea of the 63/64 rule looks correct to me but there are many failing tests. I left some nits.
substrate/frame/revive/src/gas.rs
Outdated
.min(self.gas_left); | ||
self.gas_left -= amount; | ||
GasMeter::new(amount) | ||
// The reduction to 63/64 is to emulate EIP-150 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be a doc-comment
debug_assert!(matches!(self.contract_state(), ContractState::Alive)); | ||
|
||
// Limit gas for nested call, per EIP-150. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This could go into the doc-comment (which is no no-longer correct I think)
This fixes, among other tests: * `tests::gas_consumed_is_linear_for_nested_calls` test * `tests::deposit_limit_in_nested_calls` * `tests::transient_storage_limit_in_call` * `tests::call_return_code` * `test::chain_extension_temp_storage_works` * `tests::origin_api_works` * `tests::read_only_call_works`
@xermicus the meters in |
Sorry if this wasn't clear: Only |
@athei Most of the previously failing tests were caused by the contract code of those tests using the now-removed '0 means "use all available gas"' semantic. After fixing this,
The contracts the above tests rely on have removed usages of 0 as "use all", so their failures are somewhere else. |
Command "fmt" has started 🚀 See logs here |
Command "fmt" has finished ✅ See logs here |
A deposit limit of 0 no longer is a special case, and is treated as no limit being available for use in a benchmarking function.
The only tests that still need to be addressed:
|
@athei One question: What is the meaning of This is causing |
The line you quoted is |
There, its meaning was "use all available gas", which needed to be updated to `Weight::MAX`.
Keep the "`0` as zero gas limit" changes.
For context, we agreed to roll back the EIP-150 changes because limiting the amount of gas that can be used depending on call depth breaks dry running: You can't just run the dry-run once with a lot of gas. The gas that was consumed in this run will not be enough if used as a gas limit. This is because not all of the available gas can be used if sub calls are involved. So this PR only removes the special casing of |
I don't get why the benchmarks are failing. |
@athei I can always run No significant code was added, only removed ( |
All GitHub workflows were cancelled due to failure one of the required jobs. |
/cmd bench --pallet pallet_revive |
Command "bench --pallet pallet_revive" has started 🚀 See logs here |
Command "bench --pallet pallet_revive" has failed ❌! See logs here Command output:❌ Failed benchmarks of runtimes/pallets: |
Closes #6846 .