获取当前时间戳

3

我正在使用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来自哪里? - Netwave
1
顺便说一下,客户要求不使用SystemTime,因为它浪费了太多的计算资源。什么? - Stargateur
@Netwave Bfpclock与solana_program中的Clock是相同的。 - Gnoose
1个回答

3
这是预期的行为。在链上,您无法访问系统时间,只能使用运行时公开的实用程序,因此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上查看在链上使用Clock的工作示例。
请务必使用Solana CLI中的cargo test-bpf运行测试--您可以在https://docs.solana.com/cli/install-solana-cli-tools找到安装说明。

Jon Cinque。 非常感谢您的回答。对我来说非常有帮助。请问我是否可以使用Clock::clone()作为时钟对象? - Gnoose
是的,它完全被支持,所以去做吧! - Jon C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接