21个版本 (6个重大更新)
0.7.3 | 2023年2月10日 |
---|---|
0.7.2-rc | 2022年12月16日 |
0.6.3 | 2022年11月30日 |
0.1.2 | 2022年7月4日 |
#34 在 #indexer
63 每月下载次数
75KB
2K SLoC
Solana索引器
此包提供了一个用于智能合约的事务索引框架。为了能够使用此客户端,您需要使用Postgres数据库。框架将被导入到一个空的索引器项目中,指令的合约逻辑将由框架消费者定义。
用法
将其添加到您的Cargo.toml中
[dependencies]
solana-indexer = "0.7"
在启动之前需要设置索引器配置。在INDEXER_CFG环境变量中定义配置文件。要在启动时运行数据库迁移,请定义配置中的'migrate'字段或在INDEXER_MIGRATE环境变量中设置以下值之一:"1"、"true"、"TRUE"、"y"。配置文件必须包含字段
[indexer_settings] # Configuration parameters for indexing engine
program_id # The public key of the account containing a program
connection_str # An HTTP URL of working environment
timestamp_interval # An interval between indexer calls
rpc_timeout # Connection timeout in seconds for RPC client (optional)
migrate # Boolean flag to run database migration on star (optional)
[fetching_settings] # Configuration of the fetching process (OPTIONAL)
rpc_request_timeout # Maximum allowed duration of a RPC call in milliseconds (default - 100)
retry_limit # Maximum allowed number of retries (default - 10)
transaction_batch_size # Amount of transaction that can be fetched in one time (default - 20)
[db_settings] # Database configuration pameters
host
port
username
password
database_name
require_ssl
代码示例
pub use {
async_trait::async_trait,
solana_indexer::{
CallbackError, CallbackResult, Indexer, IndexerEngine, IndexingResult, Instruction,
InstructionCallback, InstructionExecutor,
},
std::fmt::Display,
std::process,
std::sync::Arc,
thiserror::Error,
};
#[derive(Error, Debug)]
pub enum CustomError {
#[error("Custom")]
Custom,
}
fn unwrap_or_exit<T>(res: IndexingResult<T>) -> T {
match res {
Ok(value) => value,
Err(_err) => {
/* Error handling */
process::exit(1);
}
}
}
#[derive(Default)]
pub struct ProcessingStruct;
#[async_trait]
impl InstructionCallback for ProcessingStruct {
async fn process_instruction(&mut self, instruction: &Instruction) -> CallbackResult<()> {
/* Callback body */
if instruction.program_id == "" {
// You can use your custom error as cb result
return Err(CallbackError::from_err(CustomError::Custom));
} else if instruction.program_id == "123" {
// Also you can generate error from string to use it as cb result
return Err(CallbackError::from("Callback error"));
}
Ok(())
}
}
async fn run() {
let mut solana_indexer = Indexer::build().await.unwrap();
let executor = ProcessingStruct::default();
solana_indexer.set_executor(InstructionExecutor::from_executor(executor));
unwrap_or_exit(solana_indexer.start_indexing().await);
}
测试
在开始 cargo test
之前,您必须运行一个本地Postgres DB实例。示例
docker run --rm -p 5432:5432 -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=indexer postgres
许可证
Solana索引器根据MIT许可证分发。
依赖项
~78MB
~1.5M SLoC