#poseidon #solana #account #compile #friendly #cache #instructions

poseidon-client

一个简单易用的 Solana 客户端,编译速度快且缓存友好

10 个不稳定版本 (3 个重大更新)

0.6.2 2022 年 8 月 13 日
0.6.1 2022 年 8 月 12 日
0.5.4 2022 年 8 月 12 日
0.5.0 2022 年 7 月 14 日
0.3.0 2022 年 5 月 25 日

#9 in #poseidon

每月 27 次下载

Apache-2.0

70KB
1.5K SLoC

波塞冬 - 波塞尼亚海之神 😂

poseidon-client 是一个简单的 Solana 客户端库,旨在快速编译和缓存友好。

目前,并非所有 RPC 方法都已实现。如果您正在寻找功能丰富的 Solana RPC 库,请查看 Solana Anchor 库或官方 Solana SDK 和 Solana-client。

当前功能支持包括

  • getLatestBlockhash

  • createAccountWithSeed

  • Message

  • Instruction

  • Transaction

  • getMinimumBalanceForRentExemption

  • sendTransaction

使用方法

首先,生成一个 Ed25519 公钥和私钥对或导入一个。使用 ed25519_dalek 包生成或导入 ed25519_dalek::Keypair

添加依赖

文件:/Cargo.toml

[dependencies]
rand = "0.7"
ed25519-dalek = "*" # add latest version
poseidon-client = "*" # add latest version

或简单使用 cargo-edit

$ cargo add rand --vers 0.7

$ cargo add ed25519-dalek

$ cargo add poseidon
生成一个新的密钥对
use rand::rngs::OsRng;
use ed25519_dalek::Keypair;

let mut csprng = OsRng{};
let keypair: Keypair = Keypair::generate(&mut csprng);
或从字节导入 ed25519_dalek::Keypair,如果您已经有了其中一个
use ed25519_dalek::Keypair;

// Example of the 64 bytes of both the secret key (32bytes) and
// public key (32bytes) respectively
let bytes = [0u8; 64];
let keypair: Keypair = Keypair::from_bytes(&bytes)?;

注意:请注意,保护密钥对的私钥超出了本包的范围。请小心!!!

创建用于序列化和反序列化程序存储 PDA 账户的数据结构
use borsh::{BorshDeserialize, BorshSerialize};

#[derive(Debug, BorshSerialize, BorshDeserialize)]
pub struct PoseidonTestStore {
    username: String,
}
获取支付 2 年存储成本的最低租金
use poseidon_client::GetMinimumBalanceForRentExemption;

let two_year_rent =
            GetMinimumBalanceForRentExemption::process::<PoseidonTestStore>().await?;
创建程序派生账户
use poseidon_client::{SYSTEM_PROGRAM_ID, PoseidonTestStore, PdaBuilder};

// Decide on the seed to create the PDA account for the program
let seed  = "EXAMPLE_HELLO";

// Instantiate the PDA account builder
let mut pda = PdaBuilder::new();
let pda_public_key = pda
    .add_from(keypair.public.to_bytes())
    .add_base(keypair.public.to_bytes())
    .add_lamports(two_year_rent.result)
    .add_seed(seed)
    .add_space(core::mem::size_of::<PoseidonTestStore>() as u64)
    .add_owner(SYSTEM_PROGRAM_ID)
    .derive_public_key()?;

// Call `build()` to create the `SystemInstruction::CreateAccountWithSeed`
let pda_instruction = pda.build()?;
构建消息
use poseidon_client::MessageBuilder;

let mut message_builder = MessageBuilder::new();
message_builder
    .add_instruction(pda_instruction)
    .add_payer(public_key_bytes)
    .build();

let mut message = Message::new();
message.build(message_builder)?;
获取最新区块哈希
use poseidon_client::GetLatestBlockhash;

let blockhash = GetLatestBlockhash::as_bytes(Commitment::Finalized).await?;
创建事务
use ed25519_dalek::Signer;
use poseidon_client::Transaction;

// First update the `recent_blockhash` field of the `Message` with 
// a recent blockhash so that transactions will not fail.
// A Solana `recent_blockhash` only lasts for about `2 minutes` in order to
//prevent replay attacks
message.add_recent_blockhash(blockhash);

// Use the keypair to sign a message
let signature = keypair.sign(&message.to_bytes()?);

// Instantiate a new transaction with the `Message`
let mut transaction = Transaction::new(message);
// Add the signature of the message
transaction.add_signature(signature.to_bytes());
向 Solana RPC 节点发送事务
use poseidon_client::{RpcClient, TxSendOutcome};

let mut rpc = RpcClient::new();
let send_tx_response = rpc.prepare_transaction(&transaction)?.send().await?;
let send_tx_outcome = TxSendOutcome::parse_tx(send_tx_response);
使用其哈希值获取事务
use poseidon_client::GetTransaction;

let base58_signature = "44stjcK4f7RC7KNCorh9gzhQagpYoT9Tq775UFtYbn5gepRocHEeXrtG2JmzgTYKCx83pfBhWHiwLa6sC7f8Ruft";
let tx_resp = GetTransaction::process(sign).await?;

许可协议

本库采用 MITApache-2.0 许可协议,所有贡献都采用相同的许可证。

行为准则

在做出贡献时,请遵守 Rust 行为准则

依赖项

~18–30MB
~545K SLoC