Scaffold Kitty struct
Rust 中的结构是一个有用的构造,可帮助存储具有共同点的数据。出于我们的目的,我们的Kitty将携带多个属性,我们可以将其存储在单个结构中,而不是使用单独的存储项目。在尝试优化存储读取和写入时,这会派上用场,因此我们的runtime可以执行较少的读取/写入来更新多个值。
要包含哪些信息
让我们首先看看单个Kitty将携带哪些信息:
dna:用于识别小猫DNA的哈希值,对应于其独特的特征。DNA还用于繁殖新的小猫咪,并跟踪不同的小猫代。
price:这是一个balance,对应于购买Kitty所需的金额,并由其所有者设置。
gender:可以是Male 或Female 的枚举。
owner:指定单个所有者的帐户 ID。
结构所持有的类型
从上面看我们的结构的项目,我们可以推断出以下类型:
[u8; 16] dna- 使用 16 个字节来表示小猫的 DNA。
BalanceOf price- 使用 FRAME 的自定义类型Currencytrait.
性别 gender- 我们将创建!
首先,我们需要在声明结构之前添加自定义类型BalanceOf和AccountOf。将操作 #1 替换为以下代码段:
type AccountOf = ::AccountId;
type BalanceOf =
<<T as Config>::Currency as Currency<<T as frame_system::Config>::AccountId>>::Balance;
// Struct for holding Kitty information.
[derive(Clone, Encode, Decode, PartialEq, RuntimeDebug, TypeInfo, MaxEncodedLen)]
[scale_info(skip_type_params(T))]
[codec(mel_bound())]
pub struct Kitty<T: Config> {
pub dna: [u8; 16],
pub price: Option<BalanceOf<T>>,
pub gender: Gender,
pub owner: AccountOf<T>,
}
请注意我们如何使用derive宏来包含各种辅助traits用到我们的结构中。我们需要添加TypeInfo,以便让我们的结构访问此特征。在pallet顶部添加以下行:
use scale_info::TypeInfo;
对于Gender类型 ,我们需要构建自己的自定义枚举和帮助程序函数。
编写自定义类型Gender
我们刚刚创建了一个结构名为Gender,此类型将处理我们定义的Kitty 性别的枚举。要创建它,您将构建以下部分:
枚举声明,指定 Male和Female
为我们的 Kitty 结构实现一个帮助程序函数。
声明自定义枚举
将 ACTION 项 #2 替换为以下枚举声明:
[derive(Clone, Encode, Decode, PartialEq, RuntimeDebug, TypeInfo, MaxEncodedLen)]
[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub enum Gender {
Male,
Female,
}
注意derive宏必须在枚举声明之前使用。包裹着我们枚举的数据结构,需要与runtime中的其他类型进行交互。为了使用Serialize和Deserialize,需要将serde添加到pallets/kitties/Cargo.toml中。目前,我们知道如何创建自定义结构。但是,为Kitty结构提供一种分配性别的方法呢?为此,我们需要再学习一件事。
为我们的 Kitty 结构实现帮助程序函数
配置结构对于在结构中预定义值非常有用。例如,当设置与另一个函数返回的值相关的值时。在我们的例子中,我们有一个类似的情况,我们需要以一种根据Kitty的DNA设置的方式配置我们的Kitty的Gender。
我们只会在creating Kittes用到这个函数。我们将创建一个名为gen_gender的公共函数,该函数返回类型Gender并使用随机函数在Gender枚举值之间进行选择。
将 ACTION #4 替换为以下代码段:
fn gen_gender() -> Gender {
let random = T::KittyRandomness::random(&b"gender"[..]).0;
match random.as_ref()[0] % 2 {
0 => Gender::Male,
_ => Gender::Female,
}
}