137 lines
4.3 KiB
Rust
137 lines
4.3 KiB
Rust
//! Information about the network’s clock, ticks, slots, etc.
|
||
//!
|
||
//! The _clock sysvar_ provides access to the [`Clock`] type, which includes the
|
||
//! current slot, the current epoch, and the approximate real-world time of the
|
||
//! slot.
|
||
//!
|
||
//! [`Clock`] implements [`Sysvar::get`] and can be loaded efficiently without
|
||
//! passing the sysvar account ID to the program.
|
||
//!
|
||
//! See also the Solana [documentation on the clock sysvar][sdoc].
|
||
//!
|
||
//! [sdoc]: https://docs.solana.com/developing/runtime-facilities/sysvars#clock
|
||
//!
|
||
//! # Examples
|
||
//!
|
||
//! Accessing via on-chain program directly:
|
||
//!
|
||
//! ```no_run
|
||
//! # use solana_program::{
|
||
//! # account_info::{AccountInfo, next_account_info},
|
||
//! # entrypoint::ProgramResult,
|
||
//! # msg,
|
||
//! # pubkey::Pubkey,
|
||
//! # sysvar::clock::{self, Clock},
|
||
//! # sysvar::Sysvar,
|
||
//! # };
|
||
//! # use solana_program::program_error::ProgramError;
|
||
//! #
|
||
//! fn process_instruction(
|
||
//! program_id: &Pubkey,
|
||
//! accounts: &[AccountInfo],
|
||
//! instruction_data: &[u8],
|
||
//! ) -> ProgramResult {
|
||
//!
|
||
//! let clock = Clock::get()?;
|
||
//! msg!("clock: {:#?}", clock);
|
||
//!
|
||
//! Ok(())
|
||
//! }
|
||
//! #
|
||
//! # use solana_program::sysvar::SysvarId;
|
||
//! # let p = Clock::id();
|
||
//! # let l = &mut 1169280;
|
||
//! # let d = &mut vec![240, 153, 233, 7, 0, 0, 0, 0, 11, 115, 118, 98, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 0, 0, 121, 50, 119, 98, 0, 0, 0, 0];
|
||
//! # let a = AccountInfo::new(&p, false, false, l, d, &p, false, 0);
|
||
//! # let accounts = &[a.clone(), a];
|
||
//! # process_instruction(
|
||
//! # &Pubkey::new_unique(),
|
||
//! # accounts,
|
||
//! # &[],
|
||
//! # )?;
|
||
//! # Ok::<(), ProgramError>(())
|
||
//! ```
|
||
//!
|
||
//! Accessing via on-chain program's account parameters:
|
||
//!
|
||
//! ```
|
||
//! # use solana_program::{
|
||
//! # account_info::{AccountInfo, next_account_info},
|
||
//! # entrypoint::ProgramResult,
|
||
//! # msg,
|
||
//! # pubkey::Pubkey,
|
||
//! # sysvar::clock::{self, Clock},
|
||
//! # sysvar::Sysvar,
|
||
//! # };
|
||
//! # use solana_program::program_error::ProgramError;
|
||
//! #
|
||
//! fn process_instruction(
|
||
//! program_id: &Pubkey,
|
||
//! accounts: &[AccountInfo],
|
||
//! instruction_data: &[u8],
|
||
//! ) -> ProgramResult {
|
||
//! let account_info_iter = &mut accounts.iter();
|
||
//! let clock_account_info = next_account_info(account_info_iter)?;
|
||
//!
|
||
//! assert!(clock::check_id(clock_account_info.key));
|
||
//!
|
||
//! let clock = Clock::from_account_info(clock_account_info)?;
|
||
//! msg!("clock: {:#?}", clock);
|
||
//!
|
||
//! Ok(())
|
||
//! }
|
||
//! #
|
||
//! # use solana_program::sysvar::SysvarId;
|
||
//! # let p = Clock::id();
|
||
//! # let l = &mut 1169280;
|
||
//! # let d = &mut vec![240, 153, 233, 7, 0, 0, 0, 0, 11, 115, 118, 98, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 0, 0, 121, 50, 119, 98, 0, 0, 0, 0];
|
||
//! # let a = AccountInfo::new(&p, false, false, l, d, &p, false, 0);
|
||
//! # let accounts = &[a.clone(), a];
|
||
//! # process_instruction(
|
||
//! # &Pubkey::new_unique(),
|
||
//! # accounts,
|
||
//! # &[],
|
||
//! # )?;
|
||
//! # Ok::<(), ProgramError>(())
|
||
//! ```
|
||
//!
|
||
//! Accessing via the RPC client:
|
||
//!
|
||
//! ```
|
||
//! # use solana_program::example_mocks::solana_sdk;
|
||
//! # use solana_program::example_mocks::solana_rpc_client;
|
||
//! # use solana_sdk::account::Account;
|
||
//! # use solana_rpc_client::rpc_client::RpcClient;
|
||
//! # use solana_sdk::sysvar::clock::{self, Clock};
|
||
//! # use anyhow::Result;
|
||
//! #
|
||
//! fn print_sysvar_clock(client: &RpcClient) -> Result<()> {
|
||
//! # client.set_get_account_response(clock::ID, Account {
|
||
//! # lamports: 1169280,
|
||
//! # data: vec![240, 153, 233, 7, 0, 0, 0, 0, 11, 115, 118, 98, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 0, 0, 121, 50, 119, 98, 0, 0, 0, 0],
|
||
//! # owner: solana_sdk::system_program::ID,
|
||
//! # executable: false,
|
||
//! # rent_epoch: 307,
|
||
//! # });
|
||
//! #
|
||
//! let clock = client.get_account(&clock::ID)?;
|
||
//! let data: Clock = bincode::deserialize(&clock.data)?;
|
||
//!
|
||
//! Ok(())
|
||
//! }
|
||
//! #
|
||
//! # let client = RpcClient::new(String::new());
|
||
//! # print_sysvar_clock(&client)?;
|
||
//! #
|
||
//! # Ok::<(), anyhow::Error>(())
|
||
//! ```
|
||
|
||
pub use crate::clock::Clock;
|
||
use crate::{impl_sysvar_get, program_error::ProgramError, sysvar::Sysvar};
|
||
|
||
crate::declare_sysvar_id!("SysvarC1ock11111111111111111111111111111111", Clock);
|
||
|
||
impl Sysvar for Clock {
|
||
impl_sysvar_get!(sol_get_clock_sysvar);
|
||
}
|