Skip to content

Commit b5a5ac4

Browse files
gui1117bkchr
andauthored
Make TransactionExtension tuple of tuple transparent for implication (#7028)
Currently `(A, B, C)` and `((A, B), C)` change the order of implications in the transaction extension pipeline. This order is not accessible in the metadata, because the metadata is just a vector of transaction extension, the nested structure is not visible. This PR make the implementation for tuple of `TransactionExtension` better for tuple of tuple. `(A, B, C)` and `((A, B), C)` don't change the implication for the validation A. This is a breaking change but only when using the trait `TransactionExtension` the code implementing the trait is not breaking (surprising rust behavior but fine). --------- Co-authored-by: command-bot <> Co-authored-by: Bastian Köcher <[email protected]>
1 parent 0b4f131 commit b5a5ac4

7 files changed

Lines changed: 279 additions & 24 deletions

File tree

prdoc/pr_7028.prdoc

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
title: 'Fix implication order in implementation of `TransactionExtension` for tuple'
2+
doc:
3+
- audience:
4+
- Runtime Dev
5+
- Runtime User
6+
description: |-
7+
Before this PR, the implications were different in the pipeline `(A, B, C)` and `((A, B), C)`.
8+
This PR fixes this behavior and make nested tuple transparant, the implication order of tuple of
9+
tuple is now the same as in a single tuple.
10+
11+
For runtime users this mean that the implication can be breaking depending on the pipeline used
12+
in the runtime.
13+
14+
For runtime developers this breaks usage of `TransactionExtension::validate`.
15+
When calling `TransactionExtension::validate` the implication must now implement `Implication`
16+
trait, you can use `TxBaseImplication` to wrap the type and use it as the base implication.
17+
E.g. instead of `&(extension_version, call),` you can write `&TxBaseImplication((extension_version, call))`.
18+
19+
crates:
20+
- name: sp-runtime
21+
bump: major
22+
- name: pallet-skip-feeless-payment
23+
bump: major
24+
- name: frame-system
25+
bump: major

substrate/frame/system/src/extensions/check_non_zero_sender.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ mod tests {
8686
use crate::mock::{new_test_ext, Test, CALL};
8787
use frame_support::{assert_ok, dispatch::DispatchInfo};
8888
use sp_runtime::{
89-
traits::{AsTransactionAuthorizedOrigin, DispatchTransaction},
89+
traits::{AsTransactionAuthorizedOrigin, DispatchTransaction, TxBaseImplication},
9090
transaction_validity::{TransactionSource::External, TransactionValidityError},
9191
};
9292

@@ -118,7 +118,7 @@ mod tests {
118118
let info = DispatchInfo::default();
119119
let len = 0_usize;
120120
let (_, _, origin) = CheckNonZeroSender::<Test>::new()
121-
.validate(None.into(), CALL, &info, len, (), CALL, External)
121+
.validate(None.into(), CALL, &info, len, (), &TxBaseImplication(CALL), External)
122122
.unwrap();
123123
assert!(!origin.is_transaction_authorized());
124124
})

substrate/frame/system/src/extensions/check_nonce.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ mod tests {
186186
assert_ok, assert_storage_noop, dispatch::GetDispatchInfo, traits::OriginTrait,
187187
};
188188
use sp_runtime::{
189-
traits::{AsTransactionAuthorizedOrigin, DispatchTransaction},
189+
traits::{AsTransactionAuthorizedOrigin, DispatchTransaction, TxBaseImplication},
190190
transaction_validity::TransactionSource::External,
191191
};
192192

@@ -335,7 +335,7 @@ mod tests {
335335
let info = DispatchInfo::default();
336336
let len = 0_usize;
337337
let (_, val, origin) = CheckNonce::<Test>(1u64.into())
338-
.validate(None.into(), CALL, &info, len, (), CALL, External)
338+
.validate(None.into(), CALL, &info, len, (), &TxBaseImplication(CALL), External)
339339
.unwrap();
340340
assert!(!origin.is_transaction_authorized());
341341
assert_ok!(CheckNonce::<Test>(1u64.into()).prepare(val, &origin, CALL, &info, len));
@@ -359,7 +359,7 @@ mod tests {
359359
let len = 0_usize;
360360
// run the validation step
361361
let (_, val, origin) = CheckNonce::<Test>(1u64.into())
362-
.validate(Some(1).into(), CALL, &info, len, (), CALL, External)
362+
.validate(Some(1).into(), CALL, &info, len, (), &TxBaseImplication(CALL), External)
363363
.unwrap();
364364
// mutate `AccountData` for the caller
365365
crate::Account::<Test>::mutate(1, |info| {

substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ use frame_support::{
4646
use scale_info::{StaticTypeInfo, TypeInfo};
4747
use sp_runtime::{
4848
traits::{
49-
DispatchInfoOf, DispatchOriginOf, PostDispatchInfoOf, TransactionExtension, ValidateResult,
49+
DispatchInfoOf, DispatchOriginOf, Implication, PostDispatchInfoOf, TransactionExtension,
50+
ValidateResult,
5051
},
5152
transaction_validity::TransactionValidityError,
5253
};
@@ -147,7 +148,7 @@ where
147148
info: &DispatchInfoOf<T::RuntimeCall>,
148149
len: usize,
149150
self_implicit: S::Implicit,
150-
inherited_implication: &impl Encode,
151+
inherited_implication: &impl Implication,
151152
source: TransactionSource,
152153
) -> ValidateResult<Self::Val, T::RuntimeCall> {
153154
if call.is_feeless(&origin) {

substrate/primitives/runtime/src/traits/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ use std::str::FromStr;
5555

5656
pub mod transaction_extension;
5757
pub use transaction_extension::{
58-
DispatchTransaction, TransactionExtension, TransactionExtensionMetadata, ValidateResult,
58+
DispatchTransaction, Implication, ImplicationParts, TransactionExtension,
59+
TransactionExtensionMetadata, TxBaseImplication, ValidateResult,
5960
};
6061

6162
/// A lazy value.

substrate/primitives/runtime/src/traits/transaction_extension/dispatch_transaction.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ where
111111
info,
112112
len,
113113
self.implicit()?,
114-
&(extension_version, call),
114+
&TxBaseImplication((extension_version, call)),
115115
source,
116116
) {
117117
// After validation, some origin must have been authorized.

0 commit comments

Comments
 (0)