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

Metadata V16: Enrich metadata with associated types of config traits #4519

Closed
Tracked by #4520
lexnv opened this issue May 20, 2024 · 1 comment · Fixed by #5274
Closed
Tracked by #4520

Metadata V16: Enrich metadata with associated types of config traits #4519

lexnv opened this issue May 20, 2024 · 1 comment · Fixed by #5274
Assignees
Labels
I5-enhancement An additional feature request. T1-FRAME This PR/Issue is related to core FRAME, the framework.

Comments

@lexnv
Copy link
Contributor

lexnv commented May 20, 2024

Developers use associated types from pallet config traits to determine how to encode transactions (ie what hash is used by the node, the accountId, asset id etc). For example, subxt uses the following configs for Substrate and Polkadot to communicate with different chains.

This information can be exposed in the metadata V16, initially as unstable metadata (version u32::max).
Types included in the metadata must implement scale_info::TypeInfo.

Default to include associated types to metadata

By default, all associated types from config traits are captured in the metadata:

type Nonce: Parameter
+ Member
+ MaybeSerializeDeserialize
+ Debug
+ Default
+ MaybeDisplay
+ AtLeast32Bit
+ Copy
+ MaxEncodedLen;
/// The output of the `Hashing` function.
type Hash: Parameter
+ Member
+ MaybeSerializeDeserialize
+ Debug
+ MaybeDisplay
+ SimpleBitOps
+ Ord
+ Default
+ Copy
+ CheckEqual
+ sp_std::hash::Hash
+ AsRef<[u8]>
+ AsMut<[u8]>
+ MaxEncodedLen;
/// The hashing system (algorithm) being used in the runtime (e.g. Blake2).
type Hashing: Hash<Output = Self::Hash> + TypeInfo;
/// The user account identifier type for the runtime.
type AccountId: Parameter
+ Member
+ MaybeSerializeDeserialize
+ Debug
+ MaybeDisplay
+ Ord
+ MaxEncodedLen;

Opt-out of associated types from metadata

Developers that do not want to include types into the metadata can specify it by the following attribute (name tbd):

#[pallet::config(without_metadata)]
pub trait Config {
  type CustomParaType: ...
  
  type SecondType: ...
}

Selectively include associated types

There might be scenarios where only a single associated type is needed to express the pallet in the metadata.
One such case is the AssetId:

/// Identifier for the class of asset.
type AssetId: Member + Parameter + Clone + MaybeSerializeDeserialize + MaxEncodedLen;

#[pallet::config(without_metadata)]
pub trait Config {
  
  #[pallet::include_metadata]
  type AssetId: ...
  
  type SecondType: ...
}

In this example, the AssetId is selectively included in the metadata, where the SecondType is not included.

PoC to capture associated types: #4358
PoC in subx to use associated metadata types: paritytech/subxt#1566

cc @jsdw @niklasad1 @bkchr @paritytech/subxt-team

@lexnv lexnv added I5-enhancement An additional feature request. T1-FRAME This PR/Issue is related to core FRAME, the framework. labels May 20, 2024
@bkchr
Copy link
Member

bkchr commented May 23, 2024

Looks like a reasonable proposal to me!

@lexnv lexnv self-assigned this Aug 8, 2024
github-merge-queue bot pushed a commit that referenced this issue Oct 16, 2024
…fig traits (#5274)

This feature is part of the upcoming metadata V16. The associated types
of the `Config` trait that require the `TypeInfo` or `Parameter` bounds
are included in the metadata of the pallet. The metadata is not yet
exposed to the end-user, however the metadata intermediate
representation (IR) contains these types.

Developers can opt out of metadata collection of the associated types by
specifying `without_metadata` optional attribute to the
`#[pallet::config]`.

Furthermore, the `without_metadata` argument can be used in combination
with the newly added `#[pallet::include_metadata]` attribute to
selectively include only certain associated types in the metadata
collection.

### API Design

- There is nothing to collect from the associated types:

```rust
#[pallet::config]
pub trait Config: frame_system::Config {
		// Runtime events already propagated to the metadata.
		type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;

		// Constants are already propagated.
		#[pallet::constant]
		type MyGetParam2: Get<u32>;
	}
```

- Default automatic collection of associated types that require TypeInfo
or Parameter bounds:

```rust
	#[pallet::config]
	pub trait Config: frame_system::Config {
		// Runtime events already propagated to the metadata.
		type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;

		// Constants are already propagated.
		#[pallet::constant]
		type MyGetParam2: Get<u32>;

		// Associated type included by default, because it requires TypeInfo bound.
		/// Nonce doc.
		type Nonce: TypeInfo;

		// Associated type included by default, because it requires
		// Parameter bound (indirect TypeInfo).
		type AccountData: Parameter;

		// Associated type without metadata bounds, not included.
		type NotIncluded: From<u8>;
	}
```

- Disable automatic collection

```rust
// Associated types are not collected by default.
	#[pallet::config(without_metadata)]
	pub trait Config: frame_system::Config {
		// Runtime events already propagated to the metadata.
		type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;

		// Constants are already propagated.
		#[pallet::constant]
		type MyGetParam2: Get<u32>;

		// Explicitly include associated types.
		#[pallet::include_metadata]
		type Nonce: TypeInfo;

		type AccountData: Parameter;

		type NotIncluded: From<u8>;
	}
```

Builds on top of the PoC:
#4358
Closes: #4519

cc @paritytech/subxt-team

---------

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>
Co-authored-by: Bastian Köcher <git@kchr.de>
Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com>
Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
I5-enhancement An additional feature request. T1-FRAME This PR/Issue is related to core FRAME, the framework.
Projects
None yet
2 participants