Substrate Mutate 在更新成员时抛出错误
Substrate Mutate throws an error when updating a member
我有一个基板托盘实现如下
#[pallet::storage]
#[pallet::getter(fn get_payload)]
pub(super) type Payload<T: Config> = StorageMap<
_,
Blake2_128Concat,
Vec<u8>,
Messages<T>
>;
#[derive(Clone, Decode, Encode, Eq, PartialEq, Debug)]
pub struct Messages<T: Config> {
pub meta: Option<Vec<u8>>,
pub header: Option<Vec<u8>>,
}
#[pallet::weight(0)]
pub fn update(
origin: OriginFor<T>,
key: Vec<u8>,
header: Vec<u8>,
) -> DispatchResultWithPostInfo {
let origin_account = ensure_signed(origin)?;
let mut payload = Payload::<T>::get(key.clone());
match payload {
Some(mut val) => {
println!("{:?}",val.header);
<Payload<T>>::mutate(val, val.header=header)
},
None => println!("Not found")
}
并且在更新函数中,当我尝试 mutate
它抛出以下错误
the trait `EncodeLike<Vec<u8>>` is not implemented for `Messages<T>`
对应于派生自Encode
和Decode
的Messages
的结构。文档不清楚如何解决这个问题。如何解决这个问题?
错误消息是正确的,Messages<T>
没有像 Vec<u8>
那样编码,而在您尝试使用 Mesages<T>
的地方它只需要像 [=11] 这样编码的东西=].
在<Payload<T>>::mutate
调用中:第一个参数必须是像Vec<u8>
这样编码的东西,而你给了一个Messages<T
类型的变量,这是一个错误。相反,您可能想写 <Payload<T>>::mutate(key.clone, ..)
我有一个基板托盘实现如下
#[pallet::storage]
#[pallet::getter(fn get_payload)]
pub(super) type Payload<T: Config> = StorageMap<
_,
Blake2_128Concat,
Vec<u8>,
Messages<T>
>;
#[derive(Clone, Decode, Encode, Eq, PartialEq, Debug)]
pub struct Messages<T: Config> {
pub meta: Option<Vec<u8>>,
pub header: Option<Vec<u8>>,
}
#[pallet::weight(0)]
pub fn update(
origin: OriginFor<T>,
key: Vec<u8>,
header: Vec<u8>,
) -> DispatchResultWithPostInfo {
let origin_account = ensure_signed(origin)?;
let mut payload = Payload::<T>::get(key.clone());
match payload {
Some(mut val) => {
println!("{:?}",val.header);
<Payload<T>>::mutate(val, val.header=header)
},
None => println!("Not found")
}
并且在更新函数中,当我尝试 mutate
它抛出以下错误
the trait `EncodeLike<Vec<u8>>` is not implemented for `Messages<T>`
对应于派生自Encode
和Decode
的Messages
的结构。文档不清楚如何解决这个问题。如何解决这个问题?
错误消息是正确的,Messages<T>
没有像 Vec<u8>
那样编码,而在您尝试使用 Mesages<T>
的地方它只需要像 [=11] 这样编码的东西=].
在<Payload<T>>::mutate
调用中:第一个参数必须是像Vec<u8>
这样编码的东西,而你给了一个Messages<T
类型的变量,这是一个错误。相反,您可能想写 <Payload<T>>::mutate(key.clone, ..)