解决Solana链bot开发WSS RPC和Http RPC之间处理速度差距造成的信息堆积和时间延迟

简介

废话不多说,我是想开发一个solana链交易机器人。但是wss推送过来的信息很快,而http rpc处理这些信息的速度远远跟不上wss推送的速度。非要这么写的原因,是因为solana和erc20链通过wss推送的信息差异造成的。

erc20链(以太链、bsc等一众使用erc20底层的都是)会在wss推送中推送所有重要的信息,包括交易Tx,交易双方的地址,时间戳等等,所以可以只需要连接上wss就能获得所有重要信息;但solana不是,solana 推送的wss信息中,只包含了交易Tx和插槽什么的信息(我刚研究solana才几天,抱歉),总之它推送的信息中只有一个有用信息,就是交易Tx,你需要拿着这个交易Tx地址再用它的http rpc去获得其他信息。

我也试过不用它官方rpc,直接暴力requests 爬虫搞solscan浏览器,但是总被封IP,被封ip也不是不能解决,但是得花钱买ip,然后写个代理。本着能白嫖就白嫖的习惯,不得已只能换wss。😄

想破头搞了两天,终于用多线程和队列大大减少了时间延迟带来的问题。

最初的问题代码

最初的代码,使用异步wss接收信息,然后条件过滤后,使用solana http rpc再处理信息,虽然用了异步,但是http处理信息的速度远跟不上wss推送的速度。以下是代码:

# coding=utf-8
import asyncio
import configparser
import os
import random
import traceback
import aiohttp
import websockets
import json
import time
from write_buy_data import ReadHTTPRPC, ReadWSSRPC, CheckBotAddressIn
from utils import get_token_price
from coin_data import get_creation_timestamp
from example_buy import BuySolToken


# 计算代币涨幅
def checkPriceRiseRatio(tokenAddress):
    tokenPrice = get_token_price(tokenAddress)
    start_price = 0.0000000280

    # 涨幅 (最新价-初始价) / 初始价
    riseratio = (tokenPrice - start_price) / start_price

    return tokenPrice, riseratio


# 创建订阅请求的JSON结构
def create_subscription_request(wallet_address):
    return {
   
        "jsonrpc": "2.0",
        "id": 0,
        "method": "logsSubscribe",
        "params": [
            {
   "mentions": [wallet_address]},
            {
   "commitment": "confirmed"}
        ]
    }


# 异步处理每个钱包的订阅
async def subscribe_wallet_transactions(wallet_address, websocket):
    request = create_subscription_request(wallet_address)
    await websocket.send(json.dumps(request))
    print(f"已订阅PumpFun合约地址 {
     wallet_address} 的交易日志更新")


# 链上解析交易哈希获取关键数据
async def decodeTxHash(transaction_signature, SOLANA_HTTP_URL):
    headers = {
   
        "Content-Type": "application/json"
    }
    params = {
   
        "jsonrpc": "2.0",
        "id": 1,
        "method": "getTransaction",
        "params": [
            transaction_signature,
            {
   
                "encoding": "json",
                "commitment": "confirmed",
                "maxSupportedTransactionVersion": 0
            }
        ]
    }

    async with aiohttp.ClientSession() as session:
        # 设置超时:总超时为10秒,连接超时为5秒,响应超时为10秒
        timeout = aiohttp.ClientTimeout(total=5, connect=2, sock_read=3)
        try:
            async with session.post(SOLANA_HTTP_URL, headers=headers, data=json.dumps(params), timeout=timeout) as response:
                if response.status == 200:
                    transaction_info = await response.json()
                    # print(json.dumps(transaction_info))

                    blockTime = transaction_info["result"]["blockTime"]
                    # 获取代币地址
                    tokenAddress = transaction_info["result"]["meta"]['preTokenBalances'][0]['mint']
                    botAddress = transaction_info["result"]["meta"]['preTokenBalances'][1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爬吧爬吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值