Skip to content
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

XCM: fix for Transact v5->v4 decoding #6609

Closed
wants to merge 2 commits into from
Closed

Conversation

bkontur
Copy link
Contributor

@bkontur bkontur commented Nov 22, 2024

Closes: #6585
Relates to: #6228

@bkontur bkontur added R0-silent Changes should not be mentioned in any release notes T6-XCM This PR/Issue is related to XCM. labels Nov 22, 2024
@bkontur bkontur requested a review from a team as a code owner November 22, 2024 10:57
@paritytech-workflow-stopper
Copy link

All GitHub workflows were cancelled due to failure one of the required jobs.
Failed workflow url: https://github.com/paritytech/polkadot-sdk/actions/runs/11971274154
Failed job name: fmt

let require_weight_at_most = call.take_decoded()?.get_dispatch_info().call_weight;
let require_weight_at_most = call.take_decoded()
.map(|c| c.get_dispatch_info().call_weight)
.unwrap_or(Weight::MAX);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@franciscoaguirre I am not sure if MAX is ok, we could also go with MAX/2, MAX/4 ..., previously we had here:

// We use a big weight here but not `Weight::MAX` as a best effort.
const DEFAULT_WEIGHT_FOR_TRANSACT_CONVERSION: Weight = Weight::from_parts(10_000_000_000, 1_000_000);

at least MAX is working for #6585
I tested this with chopstics for https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fwestend-rpc.polkadot.io#/explorer/query/0x01cd07a4ede58f34d76422febdf1adc28669c1a2ed5fa5ccaa7d15a7d1bfb0a5

Probably Weight::MAX shouldn't be used, I am no sure, because of chains which have just XCMv4 processing:
https://github.com/paritytech/polkadot-sdk/blob/stable2409/polkadot/xcm/xcm-executor/src/lib.rs#L862-L871
https://github.com/paritytech/polkadot-sdk/blob/stable2409/polkadot/xcm/xcm-builder/src/weight.rs#L65

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if call.take_decoded()?.get_dispatch_info() only fails for calls of type (), then using MAX should be ok, in practice there should be no Transact instructions for any Xcm<()>. Any real Transact will have a call type different than (), no?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The issue is when we send it we'll end up telling the receiver to use MAX. I think MAX divided by some factor should be good. Or looking at the on-chain data and picking a value that is big enough for most transacts

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The problem is that the weight here in require_weight_at_most is what is actually initially charged for execution fees on older chains, so dryrunning an xcmv5 program says use these fees, then sending that program to an xcmv4 chain will have the call fail with not enough fees

(someone needs to double check this and confirm in code)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah we should go for a more backwards compatible solution

@bkontur
Copy link
Contributor Author

bkontur commented Nov 22, 2024

/cmd fmt

Copy link

Command "fmt" has started 🚀 See logs here

Copy link

Command "fmt" has finished ✅ See logs here

acatangiu
acatangiu previously approved these changes Nov 22, 2024
let require_weight_at_most = call.take_decoded()?.get_dispatch_info().call_weight;
let require_weight_at_most = call.take_decoded()
.map(|c| c.get_dispatch_info().call_weight)
.unwrap_or(Weight::MAX);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if call.take_decoded()?.get_dispatch_info() only fails for calls of type (), then using MAX should be ok, in practice there should be no Transact instructions for any Xcm<()>. Any real Transact will have a call type different than (), no?

@acatangiu acatangiu dismissed their stale review November 22, 2024 15:16

don't think it works actually

@bkontur
Copy link
Contributor Author

bkontur commented Nov 25, 2024

don't think it works actually

Yes, agree, it just allows to pass on the sending side (I tested with chopstics), at least we know that this conversion is the issue.
Closing this PR

@bkontur bkontur closed this Nov 25, 2024
@bkontur bkontur deleted the bko-transact-decode-fix branch November 25, 2024 10:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
R0-silent Changes should not be mentioned in any release notes T6-XCM This PR/Issue is related to XCM.
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

[xcm] Transact v4 vs v5 compatibility
4 participants