I连接到Solana Websocket,并订阅Raydium分散交易所帐户(https://raydium.io/swap/)的程序数据以收听交易交易。 当前状态 我成功连接...

问题描述 投票:0回答:0
电流状态

我成功地连接了,但是我找不到有关如何将UIACCOUNTDATA二进制转换为可读物品的uiAccountdata二进制文件的资源。我认为缺少的是雷迪姆“交换”的避难所。 const RAYDIUM_WALLET_ADDRESS: &str = "CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C"; const SOLANA_WS_MAINNET: &str = "wss://api.mainnet-beta.solana.com"; const HELIUS_WS_MAINNET: &str = "wss://mainnet.helius-rpc.com"; const HELIUS_API_KEY: &str = "HELIUS_API_KEY"; #[derive(Debug, Serialize, Deserialize)] pub struct RaydiumSwap { pub instruction: u8, pub amount_in: u64, pub min_amount_out: u64, } #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { dotenv::dotenv().ok(); let raydium_pubkey = Pubkey::from_str_const(RAYDIUM_WALLET_ADDRESS); let helius_api_key = std::env::var(HELIUS_API_KEY).expect("HELIUS_API_KEY must be set"); tokio::spawn(async move { println!("Connecting to Helius Solana Mainnet"); let solana = PubsubClient::new(&format!("{}?api-key={}", HELIUS_WS_MAINNET, helius_api_key)) .await .expect("Cannot connect to Helius Solana Mainnet"); print!("Connected to Helius Solana Mainnet"); let rpc_account_info_config = RpcAccountInfoConfig { commitment: Some(CommitmentConfig::confirmed()), encoding: Some(UiAccountEncoding::Base64), data_slice: None, min_context_slot: None, }; let rpc_program_accounts_config = RpcProgramAccountsConfig { filters: None, account_config: rpc_account_info_config, with_context: None, sort_results: None, }; let subscription = solana .program_subscribe(&raydium_pubkey, Some(rpc_program_accounts_config)) .await .expect("Cannot subscribe to account"); println!("Subscribed to account"); let (mut account_stream, _unsubscribe) = subscription; while let Some(response) = account_stream.next().await { deserialize_raydium_swap(response); } }); loop {} Ok(()) } fn deserialize_raydium_swap(response: Response<RpcKeyedAccount>) { if let UiAccountData::Binary(binary_str, _) = response.value.account.data { // Step 1: Decode the base64 string into bytes let decoded_bytes = BASE64_STANDARD.decode(binary_str).expect("Failed to decode base64"); let raydium_swap: RaydiumSwap = bincode::deserialize(&decoded_bytes).expect("Failed to deserialize data"); println!("{:?}", raydium_swap); } else { println!("The provided data is not of Binary type"); } } response

如果我打印出

response

,看起来像这样:

Response {
    context: RpcResponseContext {
        slot: 322346382,
        api_version: None,
    },
    value: RpcKeyedAccount {
        pubkey: "6T5HPoskH55fa61GNXP4SSNSMQcmyeAo2h41TMjJ1Jct",
        account: UiAccount {
            lamports: 5324400,
            data: Binary(
                "9+3j9dfD3kazIT+6i/nIf6keR4GWKMOD4AvqfpjHoD4DuhBpz8P286cm3/If6FlkWTnsnxfd7RQupsSdPfJu9q5y6dmi83wZt4D+mYqLzfRAnwhRaEX6FLFVTiffWIsc/Rl8DBS2uCMBZSyXTmO8C3qn9v67NXreXSsZlvfMU/ygJ4R+enAqiaGpU9alUOF7CYe8A7MbBqBR5xw305nbKGfZK67PDo3xBpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAHA+v6YxhTMcFzuNvBHHMaY2JcB8bpPm0fSdv/8nEQMSQbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKk+iWorY4q5NIXH6uKU+mthvYnZavGm2oz7Q13SFAmrDv0ACQkJCI1SqZKsAAAaq/0BAAAAAD1hvckyBwAAnZGtAQAAAAAuM64n4AYAAGUFuWcAAAAA6gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
                Base64,
            ),
            owner: "CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C",
            executable: false,
            rent_epoch: 18446744073709551615,
            space: Some(
                637,
            ),
        },
    },
}

结论

因此,似乎我首先必须

base64

解码
response.value.account.data

,然后将其划分为struct。 但是,我正在努力找出如何做到这一点。当数据被化时,我认为我将能够通过它过滤它,以处理交易交易。
请建议,谢谢。

P.S.

我正在使用Helius Websockets Server(需要API键),因为Solana Mainnet的外观对我来说不稳定并且很慢。

你曾经弄清楚解决方案吗?
    

rust deserialization solana
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.