#account #namespaces #index #indexing #virtual #solana #on-chain

indexor

用于在链上索引 Solana 账户的虚拟命名空间

6 个版本 (破坏性更新)

0.5.0 2021 年 12 月 12 日
0.4.0 2021 年 12 月 11 日
0.3.0 2021 年 12 月 10 日
0.2.1 2021 年 12 月 10 日
0.1.0 2021 年 12 月 9 日

#37#on-chain

MIT 许可协议

7KB
182 代码行

🔢 Indexor

Indexor 创建用于在链上索引 Solana 账户的虚拟命名空间。这些索引是 键值存储 (KVS),可以用于将账户地址映射到更可预测的名称。Indexor 支持使用序列命名空间(0,1,2,3...像数组一样)或自由形式命名空间("foo","bar","baz"...像哈希表一样)来创建索引。此外,它还支持一个用于从地址到索引中名称的恒时 "反向查找" 搜索的算法。

如果您发现错误或想进行改进,请加入 Faktor Discord 并打个招呼!我们是一群在 Solana 上构建 公钥基础设施 (PKI)支付系统 的人。

⚙️ 工作原理

TODO 编写此部分

👉 入门

集成和构建

要集成 Indexor 程序,请将其添加到您的依赖项中(有关示例代码片段,请参阅 CPI 示例

# Cargo.toml

[dependencies]
indexor = { version = "0.5.0", features = ["cpi"] }

破解

要下载并使用代码,请克隆存储库

# Terminal

git clone git@github.com:faktorfi/indexor.git
cd indexor
yarn
anchor build
anchor test

🦀 CPI 示例

本节中的代码片段是为需要创建和管理自己的链上索引的 Solana 程序而设计的。这些示例假设程序有一个单例 "程序权威账户" 用于代表程序签署指令。

创建索引

此示例指令 create_my_index 显示了一个程序在自定义命名空间中创建了一个自由形式索引。由于程序使用其权威账户(一个 PDA)签署了 create_index 指令,因此 Indexor 将权威标记为索引的所有者——保证只有程序权威可以写入索引。

// create_my_index.rs

use {
    crate::state::*,
    anchor_lang::{prelude::*, solana_program::system_program},
    indexor::{
        cpi::{accounts::CreateIndex, create_index},
        program::Indexor,
        state::Index,
    },
};

#[derive(Accounts)]
#[instruction(namespace: String, bump: u8)]
pub struct CreateMyIndex<'info> {
    #[account(mut, seeds = [SEED_AUTHORITY], bump = authority.bump)]
    pub authority: Account<'info, Authority>,

    #[account(mut)]
    pub index: Account<'info, Index>,

    #[account(address = indexor::ID)]
    pub indexor_program: Program<'info, Indexor>,

    #[account(mut)]
    pub signer: Signer<'info>,

    #[account(address = system_program::ID)]
    pub system_program: Program<'info, System>,
}

pub fn handler(ctx: Context<CreateMyIndex>, namespace: String, bump: u8) -> ProgramResult {
    // Get accounts.
    let authority = &ctx.accounts.authority;
    let index = &ctx.accounts.index;
    let indexor_program = &ctx.accounts.indexor_program;
    let system_program = &ctx.accounts.system_program;

    // Initialize index account.
    create_index(
        CpiContext::new_with_signer(
            indexor_program.to_account_info(),
            CreateIndex {
                index: index.to_account_info(),
                signer: authority.to_account_info(),
                system_program: system_program.to_account_info(),
            },
            &[&[SEED_AUTHORITY, &[authority.bump]]],
        ),
        namespace,
        false,
        bump,
    )
}

依赖项

~17–26MB
~437K SLoC