Substrate 中的时间戳算法
Timestamp Arithmetic in Substrate
我可以在 substrate runtime 模块中获取当前时间戳作为 <timestamp::Module<T>>::get()
。
如何用它进行基本算术运算(加法、减法)?
decl_module! {
pub struct Module<T: Trait> for enum Call where origin: T::Origin {
fn deposit_event<T>() = default;
pub fn func1(origin) -> Result {
let now = <timestamp::Module<T>>::get();
const DURATION = 60 * 5;
// what is the proper way of performing the following operation?
// let future = now + DURATION;
// At some point in future, can I perform the following comparison?
if now > future {
// ... some code
}
}
}
}
进一步的问题:
这提出了一个我不确定 Rust / Rust 文档的问题。类型 T::Moment
has to have trait SimpleArithmetic
,这反过来要求类型具有特征 TryInto<u32>
.
所以这应该有效,
let tmp: u32 = DURATION + now.try_into()?;
但实际返回:
error[E0277]: cannot add `()` to `u32`
| no implementation for `u32 + ()`
|
= help: the trait `core::ops::Add<()>` is not implemented for `u32`
error[E0271]: type mismatch resolving `<() as core::convert::TryFrom<<T as srml_timestamp::Trait>::Moment>>::Error == &str`
| note: expected type `core::convert::Infallible`
= found type `&str`
进一步的问题 - 2
基本上,我经历了。你能 post 举个例子,如何从 Timestamp
转换为 u32
/u64
,以及如何从 u32
/u64
转换为 Timestamp
, 需要额外引入哪些模块?
谢谢。
我不知道如何使用 into()
、try_into()
、from()
、try_from()
。
但是根据 Shawn 示例和 Bryan 所说要避免的内容,我可以通过以下方式轻松地将时间戳转换为 u64:now.as_()
.
如果有人可以使用 into()
、from()
或其变体向我展示答案,我将很乐意更新此线程并将其标记为正确答案。
我可以在 substrate runtime 模块中获取当前时间戳作为 <timestamp::Module<T>>::get()
。
如何用它进行基本算术运算(加法、减法)?
decl_module! {
pub struct Module<T: Trait> for enum Call where origin: T::Origin {
fn deposit_event<T>() = default;
pub fn func1(origin) -> Result {
let now = <timestamp::Module<T>>::get();
const DURATION = 60 * 5;
// what is the proper way of performing the following operation?
// let future = now + DURATION;
// At some point in future, can I perform the following comparison?
if now > future {
// ... some code
}
}
}
}
进一步的问题:
这提出了一个我不确定 Rust / Rust 文档的问题。类型 T::Moment
has to have trait SimpleArithmetic
,这反过来要求类型具有特征 TryInto<u32>
.
所以这应该有效,
let tmp: u32 = DURATION + now.try_into()?;
但实际返回:
error[E0277]: cannot add `()` to `u32`
| no implementation for `u32 + ()`
|
= help: the trait `core::ops::Add<()>` is not implemented for `u32`
error[E0271]: type mismatch resolving `<() as core::convert::TryFrom<<T as srml_timestamp::Trait>::Moment>>::Error == &str`
| note: expected type `core::convert::Infallible`
= found type `&str`
进一步的问题 - 2
基本上,我经历了Timestamp
转换为 u32
/u64
,以及如何从 u32
/u64
转换为 Timestamp
, 需要额外引入哪些模块?
谢谢。
我不知道如何使用 into()
、try_into()
、from()
、try_from()
。
但是根据 Shawn 示例和 Bryan 所说要避免的内容,我可以通过以下方式轻松地将时间戳转换为 u64:now.as_()
.
如果有人可以使用 into()
、from()
或其变体向我展示答案,我将很乐意更新此线程并将其标记为正确答案。