#indexer #transaction #account #index #blockchain #solana #instructions

solana-indexer

Solana区块链上账户交易的索引库

21个版本 (6个重大更新)

0.7.3 2023年2月10日
0.7.2-rc2022年12月16日
0.6.3 2022年11月30日
0.1.2 2022年7月4日

#34#indexer

Download history 4/week @ 2024-04-02 1/week @ 2024-04-09

63 每月下载次数

MIT 许可证

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