怎樣配置一個(gè)runtime中的常量

在runtime中聲明一個(gè)常量值是定義固定值或定義根據(jù)某些因素動(dòng)態(tài)變化的值的有用工具佳遂。

接下來一起看看乞而,如何創(chuàng)建用于重置u32存儲(chǔ)值的pallet常量。這個(gè)值量没,我們稱之為SingleValue,也可以使用一個(gè)名為add_value的方法來修改突想。

配置pallet的類型殴蹄、事件和錯(cuò)誤

1.定義pallet中的常量

  • MaxAddend將是元數(shù)據(jù)中顯示的值。
  • ClearFrequency跟蹤塊編號(hào)并將用于重置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.聲明存儲(chǔ)項(xiàng)目和事件袭灯。

使用存儲(chǔ)屬性宏,聲明SingleValue每個(gè)塊周期都會(huì)修改的值绑嘹。

#[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. 添加處理操作溢出的錯(cuò)誤:

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

創(chuàng)建pallet方法和運(yùn)行時(shí)常量

1.配置on_finalize.

在塊執(zhí)行結(jié)束時(shí)運(yùn)行的 on_finalize 函數(shù)中的每個(gè) ClearFrequency 塊數(shù)將 SingleValue 設(shè)置為 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.創(chuàng)建一個(gè)允許用戶指定值的方法工腋。

只要每次調(diào)用增加的值小于 MaxAddend 值姨丈,add_value 方法就會(huì)增加 SingleValue畅卓。

對(duì)于此方法,必須遵循以下:

  • 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 的運(yùn)行時(shí)實(shí)現(xiàn)聲明值:

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())
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市歼争,隨后出現(xiàn)的幾起案子拜马,更是在濱河造成了極大的恐慌,老刑警劉巖沐绒,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俩莽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡乔遮,警方通過查閱死者的電腦和手機(jī)豹绪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來申眼,“玉大人瞒津,你說我怎么就攤上這事±ㄊ” “怎么了巷蚪?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)濒翻。 經(jīng)常有香客問我屁柏,道長(zhǎng),這世上最難降的妖魔是什么有送? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任淌喻,我火速辦了婚禮,結(jié)果婚禮上雀摘,老公的妹妹穿的比我還像新娘裸删。我一直安慰自己,他們只是感情好阵赠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布涯塔。 她就那樣靜靜地躺著,像睡著了一般清蚀。 火紅的嫁衣襯著肌膚如雪匕荸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天枷邪,我揣著相機(jī)與錄音榛搔,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛践惑,可吹牛的內(nèi)容都是我干的绑洛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼童本,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼真屯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起穷娱,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤绑蔫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后泵额,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體配深,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年嫁盲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了篓叶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡羞秤,死狀恐怖缸托,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘾蛋,我是刑警寧澤俐镐,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站哺哼,受9級(jí)特大地震影響佩抹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜取董,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一棍苹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茵汰,春花似錦枢里、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至画侣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堡妒,已是汗流浹背配乱。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搬泥。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓桑寨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親忿檩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尉尾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 第二部分 自動(dòng)內(nèi)存管理機(jī)制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運(yùn)行數(shù)據(jù)區(qū)域 程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,138評(píng)論 0 2
  • 轉(zhuǎn)自 www.reibang.com/p/bd1bfc0c34b8 作為一個(gè)程序員,在找工作的過程中,都會(huì)遇到筆試...
    灬黑客灬閱讀 4,414評(píng)論 1 118
  • 作為一個(gè)程序員,在找工作的過程中,都會(huì)遇到筆試,而很多筆試?yán)锩娑及╦ava,尤其是作為一個(gè)Android開發(fā)工程...
    仇諾伊閱讀 7,972評(píng)論 15 295
  • 抽象,繼承,封裝,多態(tài) 下面將一一解釋.抽象是將一類對(duì)象的共同特征總結(jié)出來構(gòu)造類的過程.包括數(shù)據(jù)抽象和行為抽象兩部...
    高珊珊aim閱讀 957評(píng)論 0 0
  • Java 面試中的重要話題 除了你看到的驚人的問題數(shù)量,我也盡量保證質(zhì)量燥透。我不止一次分享各個(gè)重要主題中的問題沙咏,也確...
    hahaYXXXJ閱讀 2,705評(píng)論 0 38