简介
废话不多说,我是想开发一个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]