怎样配置一个runtime中的常量

在runtime中声明一个常量值是定义固定值或定义根据某些因素动态变化的值的有用工具。

接下来一起看看,如何创建用于重置u32存储值的pallet常量。这个值,我们称之为SingleValue,也可以使用一个名为add_value的方法来修改。

配置pallet的类型、事件和错误

1.定义pallet中的常量

  • MaxAddend将是元数据中显示的值。
  • ClearFrequency跟踪块编号并将用于重置SingleValue
#[pallet::config]
pub trait Config: frame_system::Config {
    type Event: From<Event<Self>> + IsType<<Self as frame_system::Config>::Event>;

    #[pallet::constant] // put the constant in metadata
    /// Maximum amount added per invocation.
    type MaxAddend: Get<u32>;

    /// Frequency with which the stored value is deleted.
    type ClearFrequency: Get<Self::BlockNumber>;
}

2.声明存储项目和事件。

使用存储属性宏,声明SingleValue每个块周期都会修改的值。

#[pallet::storage]
#[pallet::getter(fn single_value)]
pub(super) type SingleValue<T: Config> = StorageValue<_, u32, ValueQuery>;

3.定义pallet的事件。

#[pallet::event]
#[pallet::generate_deposit(pub(super) fn deposit_event)]
pub enum Event<T: Config> {
    /// The value has been added to. The parameters are
    /// (initial amount, amount added, final amount).
    Added(u32, u32, u32),
    /// The value has been cleared. The parameter is the value before clearing.
    Cleared(u32)
}

4. 添加处理操作溢出的错误:

#[pallet::error]
pub enum Error<T> {
    /// An operation would lead to an overflow.
    Overflow
}

创建pallet方法和运行时常量

1.配置on_finalize.

在块执行结束时运行的 on_finalize 函数中的每个 ClearFrequency 块数将 SingleValue 设置为 0。 在 #[pallet::hooks] 属性下指定此逻辑

#[pallet::hooks]
impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {
    fn on_finalize(n: T::BlockNumber) {
        if (n % T::ClearFrequency::get()).is_zero() {
            let current_value = <SingleValue<T>>::get();
            <SingleValue<T>>::put(0u32);
            Self::deposit_event(Event::Cleared(current_value));
        }
    }
}

2.创建一个允许用户指定值的方法。

只要每次调用增加的值小于 MaxAddend 值,add_value 方法就会增加 SingleValue

对于此方法,必须遵循以下:

  • Include checks.
  • Keep track of the previous value.
  • Check for overflow.
  • Update SingleValue.
// Extrinsics callable from outside the runtime.
#[pallet::call]
impl<T: Config> Pallet<T> {
    #[pallet::weight(1_000)]
    fn add_value(
        origin: OriginFor<T>,
        val_to_add: u32
    ) -> DispatchResultWithPostInfo {
        let _ = ensure_signed(origin)?;
        ensure!(val_to_add <= T::MaxAddend::get(), "value must be <= maximum add amount constant");
        // previous value got
        let c_val = SingleValue::<T>::get();
        // checks for overflow when new value added
        let result = c_val.checked_add(val_to_add).ok_or(Error::<T>::Overflow)?;
        <SingleValue<T>>::put(result);
        Self::deposit_event(Event::Added(c_val, val_to_add, result));
        Ok(().into())
    }
}

3.为runtime提供常量值。

runtime/src/lib.rs 中,为您的托盘的 MaxAddendClearFrequency 的运行时实现声明值:

parameter_types! {
    pub const MaxAddend: u32 = 1738;
    pub const ClearFrequency: u32 = 10;
}

impl constant_config::Config for Runtime {
    type Event = Event;
    type MaxAddend = MaxAddend;
    type ClearFrequency = ClearFrequency;
}

例子

#![cfg_attr(not(feature = "std"), no_std)]

pub use pallet::*;

#[frame_support::pallet]
pub mod pallet {
    use frame_support::{dispatch::DispatchResultWithPostInfo, pallet_prelude::*};
    use frame_system::pallet_prelude::*;
    use frame_support::sp_runtime::traits::Zero;

    #[pallet::config]
    pub trait Config: frame_system::Config {
        type Event: From<Event<Self>> + IsType<<Self as frame_system::Config>::Event>;

        #[pallet::constant] // put the constant in metadata
        /// Maximum amount added per invocation.
        type MaxAddend: Get<u32>;

        /// Frequency with which the stored value is deleted.
        type ClearFrequency: Get<Self::BlockNumber>;
    }

    #[pallet::pallet]
    #[pallet::generate_store(pub(super) trait Store)]
    pub struct Pallet<T>(_);

    #[pallet::storage]
    #[pallet::getter(fn single_value)]
    pub(super) type SingleValue<T: Config> = StorageValue<_, u32, ValueQuery>;

    #[pallet::event]
    #[pallet::generate_deposit(pub(super) fn deposit_event)]

    pub enum Event<T: Config> {
        /// The value has ben added to. The parameters are
        /// (initial amount, amount added, final amount).
        Added(u32, u32, u32),
        /// The value has been cleared. The parameter is the value before clearing.
        Cleared(u32)
    }

    #[pallet::error]
    pub enum Error<T> {
        /// An operation would lead to an overflow.
        Overflow
    }

    #[pallet::hooks]
    impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {

        fn on_finalize(n: T::BlockNumber) {
            if (n % T::ClearFrequency::get()).is_zero() {
                let current_value = <SingleValue<T>>::get();
                <SingleValue<T>>::put(0u32);
                Self::deposit_event(Event::Cleared(current_value));
            }
        }
    }

    // Extrinsics callable from outside the runtime.
    #[pallet::call]
    impl<T: Config> Pallet<T> {
    #[pallet::weight(1_000)]

    fn add_value(
        origin: OriginFor<T>,
        val_to_add: u32
        ) -> DispatchResultWithPostInfo {
            let _ = ensure_signed(origin)?;

            ensure!(val_to_add <= T::MaxAddend::get(), "value must be <= maximum add amount constant");

            // previous value got
            let c_val = SingleValue::<T>::get();

            // checks for overflow when new value added
            let result = c_val.checked_add(val_to_add).ok_or(Error::<T>::Overflow)?;

            <SingleValue<T>>::put(result);
            Self::deposit_event(Event::Added(c_val, val_to_add, result));
            Ok(().into())
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 第二部分 自动内存管理机制 第二章 java内存异常与内存溢出异常 运行数据区域 程序计数器:当前线程所执行的字节...
    小明oh阅读 1,126评论 0 2
  • 转自 www.jianshu.com/p/bd1bfc0c34b8 作为一个程序员,在找工作的过程中,都会遇到笔试...
    灬黑客灬阅读 4,408评论 1 118
  • 作为一个程序员,在找工作的过程中,都会遇到笔试,而很多笔试里面都包括java,尤其是作为一个Android开发工程...
    仇诺伊阅读 7,965评论 15 295
  • 抽象,继承,封装,多态 下面将一一解释.抽象是将一类对象的共同特征总结出来构造类的过程.包括数据抽象和行为抽象两部...
    高珊珊aim阅读 955评论 0 0
  • Java 面试中的重要话题 除了你看到的惊人的问题数量,我也尽量保证质量。我不止一次分享各个重要主题中的问题,也确...
    hahaYXXXJ阅读 2,702评论 0 38