【发布时间】:2022-06-08 07:16:47
【问题描述】:
我是 Substrate 和区块链开发的新手。目前,我正在使用 Substrate with ink! 编写智能合约!我已经定义了一个自定义类型(代码中的struct Person)并在合约的存储中创建了这种类型的向量。
然后我创建合约函数来处理该向量数据。但是代码无法编译。 get_person_list() 函数存在错误。第一个是\'the trait bound ink_storage::Vec<Person>: WrapperTypeEncode is not satisfied\'。
但是,如果我去掉这个函数,代码就可以编译成功了。我该如何解决这个编译错误?谢谢。
#![cfg_attr(not(feature = \"std\"), no_std)]
use ink_lang as ink;
#[ink::contract]
mod test {
use ink_prelude::string::String;
use ink_storage::collections::Vec;
use ink_storage::traits::{
SpreadLayout,
PackedLayout,
};
use scale::{Encode, Decode};
#[derive(Debug, Clone, Encode, Decode, SpreadLayout, PackedLayout)]
#[cfg_attr(feature = \"std\", derive(scale_info::TypeInfo))]
pub struct Person {
name: String,
age: u32,
}
#[ink(storage)]
pub struct Test {
person_list: Vec<Person>,
}
impl Test {
#[ink(constructor)]
pub fn new() -> Self {
Self { person_list: Vec::new() }
}
#[ink(message)]
pub fn add_person(&mut self, name: String, age: u32) {
self.person_list.push(Person { name, age });
}
#[ink(message)]
pub fn get_person(&self, index: u32) -> Option<Person> {
self.person_list.get(index).cloned()
}
#[ink(message)]
pub fn person_list_count(&self) -> u32 {
self.person_list.len() as u32
}
#[ink(message)]
pub fn get_person_list(&self) -> Vec<Person> {
self.person_list.clone()
}
}
}
标签: substrate