【问题标题】:Get Current TimeStamp获取当前时间戳
【发布时间】:2021-12-04 08:17:24
【问题描述】:

我正在使用 rust 语言编写 Solana 合同,并面临一个严重问题。

为了获取当前的 Unix 时间戳,我使用了SystemTime,如下所示。

let current_timestamp: i64 = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .unwrap()
        .as_secs() as i64;

顺便说一句,客户要求不要使用SystemTime,因为它浪费了太多的计算单元。
对于这个问题,我使用了BpfClock,但是没有通过单元测试。

let clock = BpfClock::get()?;
let current_timestamp: i64 = clock.unix_timestamp;

单元测试结果如下错误信息:

thread 'processor::tests::test_withdraw' panicked at 'called `Result::unwrap()` on an `Err` value: UnsupportedSysvar'

【问题讨论】:

  • bfpclock 从何而来?
  • “顺便说一句,客户端要求不要使用 SystemTime,因为它浪费了太多的计算单元。”纳尼?
  • @Netwave Bfpclock 与 solana_program 中的 Clock 相同。

标签: rust timestamp clock solana


【解决方案1】:

这是预期的行为。在链上,您无法访问系统时间,只能访问运行时公开的实用程序,因此SystemTime::now() 将在链上完全失败。您可以在https://docs.solana.com/developing/on-chain-programs/developing-rust#restrictions

阅读有关这些限制的更多信息

要访问时钟,您做的是正确的事情,但您必须在某种类似运行时的环境中运行才能使其工作。这可以完全在链上或通过solana_program_test,它可以访问诸如Clock 之类的实用程序。你可以在https://github.com/solana-labs/solana-program-library/tree/master/examples/rust/sysvar看到一个使用链上时钟的工作示例

确保使用 Solana CLI 中的 cargo test-bpf 运行测试——您可以在 https://docs.solana.com/cli/install-solana-cli-tools 找到安装说明

【讨论】:

  • 乔恩·辛克。非常感谢您的回答。这对我很有帮助。能否请您告诉我是否可以使用 Clock::clone() 作为时钟 obj?
  • 是的,它完全受支持,所以去吧!
猜你喜欢
  • 2011-12-26
  • 2012-03-04
  • 2011-02-16
  • 1970-01-01
  • 2013-03-10
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
相关资源
最近更新 更多