2 个版本

0.0.2 2023 年 1 月 28 日
0.0.1 2023 年 1 月 22 日

#19#反序列化

MIT 许可证

105KB
2K SLoC

chainsaw Build+Test

使用其 progam IDL 反序列化 Solana 账户。

目录 DocToc 生成

安装

cargo add sol-chainsaw

示例

let opts = SerializationOpts {
    pubkey_as_base58: true,
    n64_as_string: false,
    n128_as_string: true,
};

let mut chainsaw = ChainsawDeserializer::new(&opts);

// 1. Add IDLS

// Candy Machine IDL
let cndy_program_id = "cndy3Z4yapfJBmL3ShUp5exZKqR3z33thTzeNMm2gRZ";
{
    let idl_json = read_idl_json(&cndy_program_id);
    chainsaw
        .add_idl_json(cndy_program_id.to_string(), &idl_json, IdlProvider::Anchor)
        .expect("failed adding IDL JSON");
}
//  Staking Program IDL
let stake_program_id = "StakeSSzfxn391k3LvdKbZP5WVwWd6AsY1DNiXHjQfK";
{
    let idl_json = read_idl_json(&stake_program_id);
    chainsaw
        .add_idl_json(stake_program_id.to_string(), &idl_json, IdlProvider::Anchor)
        .expect("failed adding IDL JSON");
}

// 2. Read Accounts Data

// Stake Account
let stake_acc_data = read_account(
    &stake_program_id,
    "EscrowHistory",
    "5AEHnKRonYWeXWQTCqbfaEY6jHy38ifutWsriVsxsgbL",
);

// Candy Machine Account
let cndy_acc_data = read_account(
    &cndy_program_id,
    "CollectionPDA",
    "4gt6YPtgZp2MYJUP7cAH8E3UiL6mUruYaPprEiyJytQ4",
);

// 3. Deserialize Accounts

// Stake Account
{
    let mut acc_json = String::new();
    chainsaw
        .deserialize_account(
            &stake_program_id,
            &mut stake_acc_data.as_slice(),
            &mut acc_json,
        )
        .expect("failed to deserialize account");
    assert!(acc_json.contains("{\"escrow\":\"4uj6fRJzqoNRPktmYqGX1nBkjAJBsimJ4ug77S3Tzj7y\""));
}

// Candy Machine Account
{
    let mut acc_json = String::new();
    chainsaw
        .deserialize_account(
            &cndy_program_id,
            &mut cndy_acc_data.as_slice(),
            &mut acc_json,
        )
        .expect("failed to deserialize account");
    assert_eq!(acc_json, "{\"mint\":\"BrqNo3sQFTaq9JevoWYhgagJEjE3MmTgYonfaHV5Mf3E\",\"candyMachine\":\"DpBwktkJsEPTtsRpD8kCFGwEUjwTkXARSGSTQ7MJr4kE\"}");
}

请参阅 ./examples/multiple_idls_and_accounts.rs 以获取完整示例。

运行方式: cargo run --example multiple_idls_and_accounts

网络功能

为了使从链上检索 IDLs 更容易,包含了一个 idl 客户端实现,但仅在启用 network 功能时启用。

let idl_client = IdlClient::for_anchor_on_mainnet();
let program_idl = idl_client.fetch(program_id)?;

更多详细示例请参阅 tests/task_update_idls.rs

开发

测试任务

通过 ./Makefile 包含了与测试相关的各种任务。它们是 tests 文件夹的一部分,但受功能限制。因此,要激活它们,需要启用特定功能。

要运行这些任务时使用自定义 RPC 集群,请通过 RPC_URL 环境变量提供它,例如。

export RPC_URL="https://solana-mainnet.g.alchemy.com/v2/<mykey>"

更新 IDLs

./tests/data/programs_with_idl.json 中包含已在链上上传 IDL 的程序 ID。

这些 IDL 存储在 ./fixtures/idls 中,以供集成测试使用。

  • idl_update:将 IDL 更新为链上当前的内容

从链上获取测试数据

  • fetch_account:从链上获取特定的账户(需要 ADDRESS 环境变量)并将其存储在临时文件中
  • fetch_accounts_for_program:从链上更新特定程序的账户(需要 PROGRAM_ID 环境变量)
  • fetch_accounts_for_all_programs:更新链上所有已知程序的账户信息(需要COUNT环境变量来指定每个账户类型要获取的账户数量)

处理账户反序列化

为了隔离特定账户使用时反序列化问题,请使用以下任务之一,并提供所需的环境变量。

  • deserialize_account_type_address_for_program:反序列化程序PROGRAM_ID的账户类型ACCOUNT_TYPE在地址ADDRESS的账户
  • deserialize_account_type_for_program:反序列化程序PROGRAM_ID和账户类型ACCOUNT_TYPE的所有账户
  • deserialize_accounts_for_program:反序列化程序PROGRAM_ID的所有账户

示例:

export PROGRAM_ID=1USDCmv8QmvZ9JaL7bmevGsNHn7ez8TNahJzCN551sb 
export ACCOUNT_TYPE=DepositReceipt
make deserialize_account_type_address_for_program ADDRESS=AyMxDEJPvJv6XQaFK9ZZ9XxDxHuVB8d7NUxP8TfLX45K
export PROGRAM_ID=1USDCmv8QmvZ9JaL7bmevGsNHn7ez8TNahJzCN551sb 
make deserialize_account_type_for_program ACCOUNT_TYPE=Realm
export PROGRAM_ID=1USDCmv8QmvZ9JaL7bmevGsNHn7ez8TNahJzCN551sb 
make deserialize_accounts_for_program

许可证

MIT

依赖项

~19–39MB
~721K SLoC