本文将介绍 Solana 中与 Solidity 区块变量对应的概念。
本文将介绍 Solana 中与 Solidity 区块变量对应的概念。
Solidity 中常见的区块变量包括:
我们假设你已了解其作用,如需复习,可参考 Solidity 全局变量文档。
Solana 通过 Clock 系统变量 的 unix_timestamp 字段提供区块时间戳。
初始化 Anchor 项目:
anchor init sysvar
更新 lib.rs 中的 initialize 函数:
pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
let clock: Clock = Clock::get()?;
msg!(
"Block timestamp: {}",
// Get block.timestamp
clock.unix_timestamp,
);
Ok(())
}
说明:
使用 chrono 库计算星期几。更新 Cargo.toml:
[dependencies]
chrono = "0.4.31"
在 lib.rs 中导入并添加函数:
use anchor_lang::prelude::*;
use chrono::*;
declare_id!("5pgNWTorN1n9YBgGGmt7nWm8aebWWk4oFCJLR1CBe4vz");
#[program]
pub mod sysvar {
use super::*;
pub fn get_day_of_the_week(_ctx: Context<Initialize>) -> Result<()> {
let clock = Clock::get()?;
let time_stamp = clock.unix_timestamp;
let date_time = NaiveDateTime::from_timestamp_opt(time_stamp, 0).unwrap();
let day_of_the_week = date_time.weekday();
msg!("Week day is: {}", day_of_the_week);
Ok(())
}
}
#[derive(Accounts)]
pub struct Initialize {}
更新测试文件 tests/sysvar.ts:
it("Get day of the week", async () => {
const tx = await program.methods.getDayOfTheWeek().rpc();
console.log("Your transaction signature", tx);
});
运行 anchor test,日志示例:
Transaction executed in slot 8:
Signature: 4sUThuBBDnb5fU4UvwkeBsvXePgHPVDunK9kMmgL8PXmM8RLJUJP5z49PzAngmQWzC7j3FcCTWjkQ5dMdhRjzREq
Status: Ok
Log Messages:
Program 5pgNWTorN1n9YBgGGmt7nWm8aebWWk4oFCJLR1CBe4vz invoke [1]
Program log: Instruction: GetDayOfTheWeek
Program log: Week day is: Wed
Program 5pgNWTorN1n9YBgGGmt7nWm8aebWWk4oFCJLR1CBe4vz consumed 1463 of 200000 compute units
Program 5pgNWTorN1n9YBgGGmt7nWm8aebWWk4oFCJLR1CBe4vz success
Solana 使用“槽号(slot number)”而非直接的“区块号”。槽号与区块号相关但不完全相同,具体区别将在后续教程中讨论,暂不深入。
以太坊的 block.coinbase 表示矿工地址,而 Solana 使用 领导者计划(PoH + PoS 共识),无挖矿概念。目前无法直接获取领导者地址。...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!