首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >衬底框架V2如何使用pallet_timestamp

衬底框架V2如何使用pallet_timestamp
EN

Stack Overflow用户
提问于 2021-07-05 21:30:32
回答 1查看 580关注 0票数 0

遵循基板教程并声明托盘配置,如托盘lib.rs中所示

代码语言:javascript
复制
use pallet_timestamp as timestamp;
代码语言:javascript
复制
    #[pallet::config]
    pub trait Config: frame_system::Config + pallet_timestamp::Config{
        type Event: From<Event<Self>> + IsType<<Self as frame_system::Config>::Event>;
    }

Caego.toml中的配置

代码语言:javascript
复制
pallet-timestamp = { version = '3.0', default-features = false}

std = [
    'codec/std',
    'frame-support/std',
    'frame-system/std',
    'sp-runtime/std',
    'pallet-timestamp/std',
    'log/std',
]

我需要使用pallet_timestamp获得时间戳

代码语言:javascript
复制
#[pallet::call]
impl<T: Config> Pallet<T> {

        #[pallet::weight(0)]
        pub fn update_recoed(origin: OriginFor<T>, record: Vec<u8>) -> DispatchResultWithPostInfo {
            let pallet_time = <timestamp::Module<T>>::get(); // Error
            Ok(().into())
        }
}

如何访问基板托盘V2中的时间?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-05 22:10:47

与其像你所展示的那样直接使用托盘,不如使用托盘和托盘松耦合所提供的两个特性之一。

我提到的两个特征可以在pallet_timestamp 源代码中找到

代码语言:javascript
复制
impl<T: Config> Time for Pallet<T> {
    type Moment = T::Moment;

    /// Before the first set of now with inherent the value returned is zero.
    fn now() -> Self::Moment {
        Self::now()
    }
}

/// Before the timestamp inherent is applied, it returns the time of previous block.
///
/// On genesis the time returned is not valid.
impl<T: Config> UnixTime for Pallet<T> {
    fn now() -> core::time::Duration {
        // now is duration since unix epoch in millisecond as documented in
        // `sp_timestamp::InherentDataProvider`.
        let now = Self::now();
        sp_std::if_std! {
            if now == T::Moment::zero() {
                log::error!(
                    target: "runtime::timestamp",
                    "`pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0",
                );
            }
        }
        core::time::Duration::from_millis(now.saturated_into::<u64>())
    }
}

要使用这一点,您应该在新的托盘中执行以下操作:

  1. 更新您的配置,使其具有新的配置,该配置使用了以下特性之一。您不需要将托盘紧密地连接到pallet_timestamp
代码语言:javascript
复制
use frame_support::traits::UnixTime;

#[pallet::config]
pub trait Config: frame_system::Config {
    type Event: From<Event<Self>> + IsType<<Self as frame_system::Config>::Event>;
    type TimeProvider: UnixTime;
}
  1. 然后,在托盘的任何地方,您都可以调用T::TimeProvider::now(),以毫秒为单位将unix时间作为u64返回。
代码语言:javascript
复制
let time: u64 = T::TimeProvider::now().as_secs();
  1. 为此,您需要将pallet_timstamp托盘插入到"TimeProvider“中。当您impl您的my_pallet::Config时,您可以通过配置它来做到这一点。
代码语言:javascript
复制
impl my_pallet::Config for Runtime {
    type Event = Event;
    type TimeProvider = pallet_timestamp::Pallet<Runtime>;
    // Or more easily just `Timestamp` assuming you used that name in `construct_runtime!`
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68262293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档