获取当前时间戳

Get Current TimeStamp

我正在使用 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'

这是预期的行为。在链上,您无权访问系统时间,只能访问 运行 时间公开的实用程序,因此 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

找到安装说明