1 个不稳定版本
0.1.0 | 2024年3月10日 |
---|
20 在 #switchboard
120KB
2.5K SLoC
switchboard-solana
一个与 Solana 上的 Switchboard 账户交互的 Rust 库。
类型文档:docs.rs/switchboard-solana
Solana SDK:github.com/switchboard-xyz/solana-sdk
Switchboard 文档:docs.switchboard.xyz
安装
在您的项目目录中运行以下 Cargo 命令
cargo add switchboard-solana
或将以下行添加到您的 Cargo.toml 文件中
[dependencies]
switchboard-solana = "0.29"
注意:次要版本对应于 anchor-lang 依赖项。此 crate 的 0.29.*
版本使用 anchor-lang 0.29.0
,而此 crate 的 0.27.*
版本使用 anchor-lang 0.27.0
。我们目前支持 Anchor 29、28 和 27。
账户
此 SDK 为 Oracle 程序提供以下账户定义
此 SDK 为 Attestation 程序提供以下账户定义
Usage
函数
在允许您的程序修改其状态之前,您需要验证您函数的 enclave_signer。
use switchboard_solana::FunctionAccountData;
#[derive(Accounts)]
pub struct SaveDataInstruction<'info> {
// ... your required accounts to modify your program's state
// We use this to derive and verify the functions enclave state
#[account(
constraint =
function.load()?.validate(
&enclave_signer.to_account_info()
)?
)]
pub function: AccountLoader<'info, FunctionAccountData>,
pub enclave_signer: Signer<'info>,
}
Aggregator
读取最新结果
use anchor_lang::solana_program::clock;
use std::convert::TryInto;
use switchboard_solana::{AggregatorAccountData, SwitchboardDecimal, SWITCHBOARD_PROGRAM_ID};
// check feed owner
let owner = *aggregator.owner;
if owner != SWITCHBOARD_PROGRAM_ID {
return Err(error!(ErrorCode::InvalidSwitchboardAccount));
}
// deserialize account info
let feed = ctx.accounts.aggregator.load()?;
// OR
let feed = AggregatorAccountData::new(feed_account_info)?;
// get result
let decimal: f64 = feed.get_result()?.try_into()?;
// check if feed has been updated in the last 5 minutes
feed.check_staleness(clock::Clock::get().unwrap().unix_timestamp, 300)?;
// check if feed exceeds a confidence interval of +/i $0.80
feed.check_confidence_interval(SwitchboardDecimal::from_f64(0.80))?;
读取聚合器历史记录
注意:在使用之前,聚合器必须初始化历史缓冲区。
use switchboard_solana::AggregatorHistoryBuffer;
use std::convert::TryInto;
let history_buffer = AggregatorHistoryBuffer::new(history_account_info)?;
let current_timestamp = Clock::get()?.unix_timestamp;
let one_hour_ago: f64 = history_buffer.lower_bound(current_timestamp - 3600).unwrap().try_into()?;
VRF 账户
读取 VRF 结果
use switchboard_solana::VrfAccountData;
// deserialize the account info
let vrf = ctx.accounts.vrf.load()?;
// OR
let vrf = VrfAccountData::new(vrf_account_info)?;
// read the result
let result_buffer = vrf.get_result()?;
let value: &[u128] = bytemuck::cast_slice(&result_buffer[..]);
let result = value[0] % 256000 as u128;
请求随机性 CPI
pub use switchboard_solana::{VrfAccountData, VrfRequestRandomness};
let switchboard_program = ctx.accounts.switchboard_program.to_account_info();
let vrf_request_randomness = VrfRequestRandomness {
authority: ctx.accounts.state.to_account_info(),
vrf: ctx.accounts.vrf.to_account_info(),
oracle_queue: ctx.accounts.oracle_queue.to_account_info(),
queue_authority: ctx.accounts.queue_authority.to_account_info(),
data_buffer: ctx.accounts.data_buffer.to_account_info(),
permission: ctx.accounts.permission.to_account_info(),
escrow: ctx.accounts.escrow.clone(),
payer_wallet: ctx.accounts.payer_wallet.clone(),
payer_authority: ctx.accounts.payer_authority.to_account_info(),
recent_blockhashes: ctx.accounts.recent_blockhashes.to_account_info(),
program_state: ctx.accounts.program_state.to_account_info(),
token_program: ctx.accounts.token_program.to_account_info(),
};
let vrf_key = ctx.accounts.vrf.key.clone();
let authority_key = ctx.accounts.authority.key.clone();
let state_seeds: &[&[&[u8]]] = &[&[
&STATE_SEED,
vrf_key.as_ref(),
authority_key.as_ref(),
&[bump],
]];
msg!("requesting randomness");
vrf_request_randomness.invoke_signed(
switchboard_program,
params.switchboard_state_bump,
params.permission_bump,
state_seeds,
)?;
依赖关系
~24–44MB
~816K SLoC