-
Notifications
You must be signed in to change notification settings - Fork 710
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
Implement cumulus StorageWeightReclaim as wrapping transaction extension + frame system ReclaimWeight #6140
base: master
Are you sure you want to change the base?
Conversation
I would say it depends. When you are required to put |
Going through the pipeline should be cheap anyway. It's just extensions which are pretty light and the "wasted" work for overweight transactions should be done off-chain when validators are building their blocks. Because the weight check isn't hardcoded and users can build whatever extension they like to handle it, we need to have some sort of convention when we introduce other weight related logic. I skimmed through the PR and I like the approach, but I won't formally approve because I didn't review thoroughly. |
Maybe it is time to split this transaction extension into EDIT: or we can do the EDIT: or we can use a storage to store the weight refunded by EDIT: I decided to with a new storage Later we can introduce another |
|
@georgepisaltu concerns should be addressed now, also I missed one change in the old transaction extension. @skunert you might be interested by this PR |
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.
Good to merge from my POV 😉 when the last comment is addressed.
Clone(bound = "S: Clone"), | ||
Eq(bound = "S: Eq"), | ||
PartialEq(bound = "S: PartialEq"), | ||
Default(bound = "S: Default") |
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.
I think CloneNoBound
etc would also work? There should be NoBound
variants for all of these in frame-support.
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.
if we use CloneNoBound
we need to implement Clone
unconditionally, that mean we would need to bound Clone
to the generic S
, the wrapped set of transaction extension.
In the case of Clone
it is fine. but maybe it is getting a bit controversial to assume S
must always bound Eq
or Default
.
That is why I used derivative, I don't want to force S
to bound Eq
, but at the same time I want to derive Eq
when S
is Eq
. But also because of T
I can't use the standard Eq
derive macro.
Maybe overkill but seems ok to me.
}; | ||
|
||
// The consumed proof size as measured by the host. | ||
let measured_proof_size = post_dispatch_proof_size.saturating_sub(pre_dispatch_proof_size); |
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.
Not sure i understand this line. Shouldnt the post_dispatch always be less or equal to the pre because our benchmarking over-estimates?
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.
In the case of weights it is true but here we are talking about something different:
post_dispatch_proof_size
is the proof size measured in the node after the dispatch of the transaction.
pre_dispatch_proof_size
is the proof size measured in the node before the dispatch of the transaction.
The proof size is increasing as the executions goes, so we do the substration.
I renamed the varialbe to proof_size_after_dispatch
and proof_size_before_dispatch
for less confusion with weight info in d70e552
|
||
let accurate_weight = benchmarked_actual_weight.set_proof_size(measured_proof_size); | ||
frame_system::BlockWeight::<T>::mutate(|current_weight| { | ||
let already_reclaimed = frame_system::ExtrinsicWeightReclaimed::<T>::get(); |
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.
I think it could be worth it to put this into a function in frame-system
?
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.
It is a bit equivalent to me. People are also moving away from getter in general.
Co-authored-by: Oliver Tale-Yazdi <[email protected]>
…ize-reclaim-more-accurate
CI is passing, some continuous integration tests are failing, but nothing indicates it is because of the PR, and there is an issue with semver test itself I think paritytech/parity-publish#42 |
(rebasing of #5234)
Issues:
CheckWeight
.Done:
a new storage
ExtrinsicWeightReclaimed
in frame-system. Any logic which attempts to do some reclaim must use this storage to avoid double reclaim.a new function
reclaim_weight
in frame-system pallet: info and post info in arguments, read the already reclaimed weight, calculate the new unused weight from info and post info. do the more accurate reclaim if higher.CheckWeight
is unchanged and still reclaim the weight in post dispatchReclaimWeight
is a new transaction extension in frame system. For solo chains it must be used last in the transactino extension pipeline. It does the final most accurate reclaimStorageWeightReclaim
is moved from cumulus primitives into its own pallet (in order to define benchmark) and is changed into a wrapping transaction extension.It does the recording of proof size and does the reclaim using this recording and the info and post info. So parachains don't need to use
ReclaimWeight
. But also if they use it, there is no bug.