跳转到主要内容
本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
Raydium 不发布官方 Python SDK。这里的模式由三个维护良好的社区库组成:solders(Rust 绑定的 Solana 基元)、solana-py(RPC 客户端)和 anchorpy(从 IDL 生成的 Anchor 风格指令构建器)。这种组合涵盖了 TS SDK 的所有功能,只是不那么精细。

环境

截至本文撰写时可协同工作的版本:
anchorpy 会定期落后于 anchor-lang 的版本;对于最近部署的 Raydium 程序,在提交前应验证 IDL 在你固定的 anchorpy 版本下能够编译。

连接和密钥对

AsyncClient 是异步变体;同步的 Client 可用于快速脚本,但异步更适合发送多个请求的场景。

读取池状态

大多数生产用途从 Raydium 的 REST API 读取已解码的池状态(参见 sdk-api/rest-api),而不是手动解码链上数据——这样做更简单,延迟对大多数用例都是可接受的。
对于需要最低可能延迟的机器人,直接解码链上字节:
完整布局在 src/raydium/cpmm/layout.ts(TS 源码)中;根据需要将其移植到 constructanchorpy 可以在给定 IDL 的情况下自动完成此操作——见下文。

构建和发送交换

为简起见,使用 Raydium 的服务器构建交易端点。服务器返回签名就绪的交易;你只需添加自己的签名:
这是构建可工作机器人的最快方式。服务器报价很快过期(约 30 秒);不要缓存。

通过 anchorpy 在客户端构建交换

当你需要更低的延迟或无法访问 Raydium API 时(受制裁地区、离线设置):
PDA 推导(观察状态、池权限)遵循与 CPMM 章节相同的公式。anchorpy 不会自动推导它们。

典型机器人架构

常见的 Python Raydium 机器人结构:
生产环境关键决策:
  • RPC 提供商。 公开主网 RPC 会积极限流。使用专用提供商(Helius、QuickNode、Triton)以应对持续流量。
  • WebSocket 用于池状态。 client.account_subscribe(pool_id) 在每个状态变化时推送更新。比轮询紧凑得多。
  • 优先费提供商。 Helius 有 getPriorityFeeEstimate 端点;Triton 有自己的。根据目标程序上最近费用的第 75 个百分位数来调整你的费用。
  • 用于 MEV 敏感交易的捆绑。 如果你无法容忍三明治风险,通过 Jito 的区块引擎路由。Python 库:jito-sdk-python(第三方,质量参差不齐)。

读取农场状态

anchorpy.account["X"].decode(bytes) 给出与 IDL 结构匹配的原生 Python 对象。

陷阱

1. 小数处理

Python 的原生 float 是 IEEE-754 双精度浮点;9 位小数代币中的金额(1 SOL = 1e9 单位)保持准确,但比率和乘积会丧失精度。使用 intsolders 为所有金额字段返回 int),并对任何价格算术通过 decimal.Decimal 路由。

2. 基于插槽与基于时间戳的推理

某些农场版本使用插槽计数器;LaunchLab 使用时间戳。solana-py 在 RPC 响应中返回 slot,但将插槽转换为时间戳会有损失(因领导者日程而异)。如果你需要挂钟时间,显式调用 get_block_time(slot)

3. 连接池耗尽

AsyncClient 默认为每个请求打开一个 HTTP 连接。在高负载下,重用 httpx.AsyncClient 会话并设置适当的 limits=httpx.Limits(max_connections=100)

4. 交易大小限制

Python 构建的交易不会比 TS 构建的交易更小——1232 字节限制同样适用。对于通过超过 2 个池的任何路由,使用 V0 交易(地址查找表)。

指针

来源: