唯一性、自定义类型和存储映射
接下来几个基础步骤,使用以下代码段更新您的pallet代码(如果您不想使用模板代码,请跳过此步骤):
![cfg_attr(not(feature = "std"), no_std)]
pub use pallet::*;
[frame_support::pallet]
pub mod pallet {
use frame_support::pallet_prelude::*;
use frame_system::pallet_prelude::*;
use frame_support::{
sp_runtime::traits::Hash,
traits::{ Randomness, Currency, tokens::ExistenceRequirement },
transactional
};
use sp_io::hashing::blake2_128;
#[cfg(feature = "std")]
use frame_support::serde::{Deserialize, Serialize};
// ACTION #1: Write a Struct to hold Kitty information.
// ACTION #2: Enum declaration for Gender.
// ACTION #3: Implementation to handle Gender type in Kitty struct.
#[pallet::pallet]
#[pallet::generate_store(pub(super) trait Store)]
pub struct Pallet<T>(_);
/// Configure the pallet by specifying the parameters and types it depends on.
#[pallet::config]
pub trait Config: frame_system::Config {
/// Because this pallet emits events, it depends on the runtime's definition of an event.
type Event: From<Event<Self>> + IsType<<Self as frame_system::Config>::Event>;
/// The Currency handler for the Kitties pallet.
type Currency: Currency<Self::AccountId>;
// ACTION #5: Specify the type for Randomness we want to specify for runtime.
// ACTION #9: Add MaxKittyOwned constant
}
// Errors.
#[pallet::error]
pub enum Error<T> {
// TODO Part III
}
// Events.
#[pallet::event]
#[pallet::generate_deposit(pub(super) fn deposit_event)]
pub enum Event<T: Config> {
// TODO Part III
}
#[pallet::storage]
#[pallet::getter(fn count_for_kitties)]
pub(super) type CountForKitties<T: Config> = StorageValue<_, u64, ValueQuery>;
// ACTION #7: Remaining storage items.
// TODO Part IV: Our pallet's genesis configuration.
#[pallet::call]
impl<T: Config> Pallet<T> {
// TODO Part III: create_kitty
// TODO Part IV: set_price
// TODO Part IV: transfer
// TODO Part IV: buy_kitty
// TODO Part IV: breed_kitty
}
//** Our helper functions.**//
impl<T: Config> Pallet<T> {
// ACTION #4: helper function for Kitty struct
// TODO Part III: helper functions for dispatchable functions
// ACTION #6: function to randomly generate DNA
// TODO Part III: mint
// TODO Part IV: transfer_kitty_to
}
}
除了此代码,我们还需要导入serde 。将其添加到pallet的 Cargo.toml 文件中,使用匹配的版本作为substrate upstream。
Scaffold Kitty struct
Rust 中的结构是一个有用的构造,可帮助存储具有共同点的数据。出于我们的目的,我们的Kitty将携带多个属性,我们可以将其存储在单个结构中,而不是使用单独的存储项目。在尝试优化存储读取和写入时,这会派上用场,因此我们的runtime可以执行较少的读取/写入来更新多个值。