引言
在Solana生态系统的快速发展中,Sol跟单机器人已成为专业交易者和机构投资者的重要工具。本文将深入解析基于beyondjeet项目的Sol跟单系统完整技术实现,从Yellowstone gRPC实时数据流到多DEX交易执行的全流程架构设计。我们的sol跟单交易系统采用毫秒级响应技术(了解更多性能优化细节),支持Pump.fun、Raydium等6大主流DEX平台,是目前市场上最先进的sol自动跟单工具。
什么是Sol跟单机器人?
Sol跟单机器人是一款专为Solana生态设计的智能交易系统,通过实时监控聪明钱包的交易行为,自动执行sol跟单交易。我们的sol跟单系统采用Yellowstone gRPC技术,实现毫秒级响应,支持Pump.fun、Raydium等主流DEX平台。
Sol跟单机器人核心优势
- 🚀 毫秒级响应: 采用Yellowstone gRPC实现超低延迟的sol跟单交易
- 🎯 智能跟单: 自动识别聪明钱包,精准执行sol跟单策略
- 🛡️ 风险控制: 多重安全机制保障sol跟单资金安全
- 📊 多平台支持: 覆盖Solana生态主流交易平台
- 🔧 灵活配置: 可自定义sol跟单参数和交易策略
- 💡 智能路由: SWQOS服务质量优化交易执行
Sol跟单系统整体架构
Sol跟单机器人系统架构图
以下是我们Sol跟单机器人的完整系统架构图,展示了从外部服务到核心交易系统的全流程设计:
核心技术栈(基于beyondjeet项目)
- Yellowstone gRPC - 实时区块链数据流
- Redis数据库 - 配置和状态存储
- Go语言 - 高性能并发处理
- Web管理界面 - 可视化配置管理
- 多DEX支持 - Pump.fun、Raydium、Meteora等
- SWQOS路由 - 智能交易路由选择
- Nonce管理 - 交易并发优化
- Supervisor - 进程管理和监控
系统架构层次(beyondjeet实际架构)
Solana跟单机器人采用模块化分层架构设计,确保系统的可扩展性和稳定性:
- 外部服务层:Solana区块链、Yellowstone gRPC、Solana RPC、Redis数据库
- Web管理层:Web服务器、前端界面、REST API、认证系统
- 核心交易层:主程序、交易机器人Bot、流管理器、钱包监控器、交易队列
- 交易执行层:Pump.fun、Pump AMM、Raydium V4、Launchpad、CPMM、Meteora DBC
- 支持服务层:Nonce管理器、资产管理器、SWQOS服务质量、日志系统、配置管理
- 数据存储层:钱包数据、参数模板、黑名单、交易记录
Sol跟单机器人支持的交易平台
- Pump.fun - 主流meme币sol跟单交易平台
- Pump AMM - AMM自动做市商sol跟单
- Raydium V4 - V4协议sol跟单交易
- Launchpad - 新币发行sol跟单交易
- CPMM - 集中流动性sol跟单
- Meteora DBC - DBC协议sol跟单交易
Sol跟单机器人关键技术组件
| 模块 | 文件路径 | Sol跟单功能描述 |
|---|---|---|
| 主程序 | main.go |
Sol跟单系统启动和初始化 |
| 交易机器人 | bot/ |
Sol跟单核心交易逻辑 |
| 流管理器 | stream/manager.go |
Sol跟单gRPC数据流管理 |
| 钱包监控 | wallet/monitor.go |
Sol跟单钱包状态监控 |
| Web服务 | web/server.go |
Sol跟单HTTP API服务 |
Yellowstone gRPC订阅系统
Yellowstone是Solana生态中的高性能gRPC数据流服务,为跟单机器人提供实时的区块链数据订阅能力。
Yellowstone gRPC客户端结构(来自beyondjeet项目)
// yellowstone_geyser/geyser.go
type Client struct {
grpcConn *grpc.ClientConn
Ctx context.Context
Geyser yellowstone_geyser_pb.GeyserClient
ErrCh chan error
s *streamManager
}
type streamManager struct {
clients map[string]*StreamClient
mu sync.RWMutex
}
// New creates a new Client instance.
func New(ctx context.Context, grpcDialURL string, md metadata.MD) (*Client, error) {
ch := make(chan error)
conn, err := grpc_wee.CreateAndObserveGRPCConn(ctx, ch, grpcDialURL, md)
if err != nil {
return nil, err
}
geyserClient := yellowstone_geyser_pb.NewGeyserClient(conn)
if md != nil {
ctx = metadata.NewOutgoingContext(ctx, md)
}
return &Client{
grpcConn: conn,
Ctx: ctx,
Geyser: geyserClient,
ErrCh: ch,
s: &streamManager{
clients: make(map[string]*StreamClient),
mu: sync.RWMutex{},
},
}, nil
}
订阅配置优势
- 精确过滤:只订阅目标钱包相关的交易,减少数据传输量
- 实时性:毫秒级延迟,确保跟单时效性
- 可靠性:自动重连机制,保证服务连续性
流客户端订阅配置(来自beyondjeet项目)
// yellowstone_geyser/geyser.go
type StreamClient struct {
Ctx context.Context
geyser yellowstone_geyser_pb.Geyser_SubscribeClient
request *yellowstone_geyser_pb.SubscribeRequest
Ch chan *yellowstone_geyser_pb.SubscribeUpdate
ErrCh chan error
mu sync.RWMutex
}
// AddStreamClient creates a new Geyser subscribe stream client
func (c *Client) AddStreamClient(ctx context.Context, streamName string, commitmentLevel yellowstone_geyser_pb.CommitmentLevel, opts ...grpc.CallOption) error {
c.s.mu.Lock()
defer c.s.mu.Unlock()
if _, exists := c.s.clients[streamName]; exists {
return fmt.Errorf("client with name %s already exists", streamName)
}
stream, err := c.Geyser.Subscribe(ctx, opts...)
if err != nil {
return err
}
streamClient := &StreamClient{
Ctx: ctx,
geyser: stream,
request: &yellowstone_geyser_pb.SubscribeRequest{
Accounts: make(map[string]*yellowstone_geyser_pb.SubscribeRequestFilterAccounts),
Slots: make(map[string]*yellowstone_geyser_pb.SubscribeRequestFilterSlots),
Transactions: make(map[string]*yellowstone_geyser_pb.SubscribeRequestFilterTransactions),
TransactionsStatus: make(map[string]*yellowstone_geyser_pb.SubscribeRequestFilterTransactions),
Blocks: make(map[string]*yellowstone_geyser_pb.SubscribeRequestFilterBlocks),
BlocksMeta: make(map[string]*yellowstone_geyser_pb.SubscribeRequestFilterBlocksMeta),
Entry: make(map[string]*yellowstone_geyser_pb.SubscribeRequestFilterEntry),
AccountsDataSlice: make([]*yellowstone_geyser_pb.SubscribeRequestAccountsDataSlice, 0),
Commitment: &commitmentLevel,
},
Ch: make(chan *yellowstone_geyser_pb.SubscribeUpdate),
ErrCh: make(chan error),
mu: sync.RWMutex{},
}
c.s.clients[streamName] = streamClient
go streamClient.listen()
return nil
}
交易解析与过滤机制
交易解析是跟单机器人的核心功能,需要准确识别目标钱包的买卖操作并提取关键信息。
解析流程
- 交易接收:从Yellowstone接收实时交易数据
- 指令识别:通过discriminator识别买卖操作
- 账户解析:提取mint地址、用户地址等关键信息
- 金额计算:解析交易金额和滑点设置
- 策略匹配:判断是否符合跟单条件
Pump.fun常量配置(来自beyondjeet项目)
// core/constants.go - 系统账户常量
var (
RAYDIUM_CPMM_PROGRAM_ID = solana.MustPublicKeyFromBase58("CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C")
OKX_ROUTER_V2_PROGRAM_ID = solana.MustPublicKeyFromBase58("6m2CDdhRgxpH4WjvdzxAYbGxwdGUz5MziiL5jek2kBma")
RAYDIUM_LAUNCHPAD_PROGRAM_ID = solana.MustPublicKeyFromBase58("LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj")
PHOTON_ROUTER_PROGRAM_ID = solana.MustPublicKeyFromBase58("BSfD6SHZigAfDWSjzD5Q41jw8LmKwtmjskPH9XW1mrRW")
JUPITER_V6_PROGRAM_ID = solana.MustPublicKeyFromBase58("JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4")
RAYDIUM_V4_PROGRAM_ID = solana.MustPublicKeyFromBase58("675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8")
RAYDIUM_AMM_ROUTEING = solana.MustPublicKeyFromBase58("routeUGWgWzqBWFcrCfv8tritsqukccJPu3q5GPP3xS")
PUMP_PROGRAM_ID = solana.MustPublicKeyFromBase58("6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P")
AMM_PROGRAM_ID = solana.MustPublicKeyFromBase58("pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA")
AMM_GLOBAL_CONFIG_ACCOUNT = solana.MustPublicKeyFromBase58("ADyA8hdefvWN2dbGGWFotbzWxrAvLW83WG6QCVXvJKqw")
OPENBOOK_MARKET_PROGRAM_ID = solana.MustPublicKeyFromBase58("srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX")
METEORA_DBC_PROGRAM_ID = solana.MustPublicKeyFromBase58("dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN")
EVENT_AUTHORITY = solana.MustPublicKeyFromBase58("Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1")
GLOBAL_ACCOUNT = solana.MustPublicKeyFromBase58("4wTV1YmiEkRvAtNtsSGPtUrqRYQMe5SKy2uB4Jjaxnjf")
FEE_RECIPIENT = solana.MustPublicKeyFromBase58("62qc2CNXwrYqQScmEdiZFFAnJR262PxWEuNQtxfafNgV")
AMM_EVENT_AUTHORITY = solana.MustPublicKeyFromBase58("GS4CU59F31iL7aR2Q8zVS8DRrcRnXX1yjQ66TqNVQnaR")
PROTOCOL_FEE_RECIPIENT = solana.MustPublicKeyFromBase58("JCRGumoE9Qi5BBgULTgdgTLjSgkCMSbF62ZZfGs84JeU")
PROTOCOL_FEE_RECIPIENT_TOKEN_ACCOUNT = solana.MustPublicKeyFromBase58("DWpvfqzGWuVy9jVSKSShdM2733nrEsnnhsUStYbkj6Nn")
ACCOUNT_SPACE = uint64(165)
WSOL = solana.MustPublicKeyFromBase58("So11111111111111111111111111111111111111112")
)
解析注意事项
- 版本兼容:Pump.fun指令格式可能更新,需要及时适配
- 错误处理:交易失败时要正确处理,避免误判
- 性能优化:大量交易解析时要注意内存和CPU使用
自动交易执行引擎
交易执行引擎负责根据解析结果自动构建和发送跟单交易,是整个系统的执行核心。
机器人核心结构(来自beyondjeet项目)
// bot/structs.go - 机器人核心结构
type Bot struct {
Config *utils.Config
Trader *core.TraderImpl
rpcClient *rpc.Client
nonceClient *client.Client
sdkClient *sdk.TradeSubscriptionClient
feeMicroLamport uint64
enableJito bool
delaySecond int64
pendingCoins map[string]*Coin // coins which we will attempt to buy, but have yet to be purchased
pendingCoinsLock sync.Mutex
coinsToBuy chan *Coin
coinsToSell chan string
// skipATALookup skips looking up if the ATA exists. Useful for debugging & attempting to purchase coins we already have owned.
// in prod, should always be set to `true` since we should never have ATA for new coins.
SkipATALookup bool
Blockhash *solana.Hash
balanceNeeded uint64
// 卖出策略
sellStrategy SellStrategy
// 盈利目标监控器
profitMonitor *ProfitTargetMonitor
// OpenBook market states map, with baseMint as key
marketStates map[string]*MarketState
marketStatesLock sync.RWMutex
}
// NewBot creates a new bot struct that we use to buy & sell coins
func NewBot(config *utils.Config, sdkClient *sdk.TradeSubscriptionClient) (*Bot, error) {
// create trader
privateKey, err := solana.PrivateKeyFromBase58(config.PrivateKey)
if err != nil {
logger.Fatalf("Failed to parse private key: %v", err)
}
trader := core.NewTrader(config.RPCUrl, privateKey, config)
rpcClient := rpc.New(config.RPCUrl)
nonceClient := client.NewClient(config.RPCUrl)
// 设置全局配置,供卖出策略使用
SetConfig(config)
b := &Bot{
Config: config,
Trader: trader,
rpcClient: rpcClient,
nonceClient: nonceClient,
sdkClient: sdkClient,
// Convert BuyPriorityFee from SOL to lamports (1 SOL = 10^9 lamports)
feeMicroLamport: uint64(config.BuyPriorityFee * 1e9),
// Use Jito mode if enabled
enableJito: config.Jito.Enable,
// Use sell delay time
delaySecond: int64(config.SellDelayTime),
pendingCoins: make(map[string]*Coin),
pendingCoinsLock: sync.Mutex{},
coinsToBuy: make(chan *Coin),
coinsToSell: make(chan string),
// 初始化卖出策略
sellStrategy: NewMultiLevelSellStrategy(config.MultiSellLevels),
// 初始化OpenBook市场状态映射
marketStates: make(map[string]*MarketState),
marketStatesLock: sync.RWMutex{},
}
// 初始化盈利目标监控器(需要在Bot创建后初始化,因为需要传入bot实例)
b.profitMonitor = NewProfitTargetMonitor(&config.ProfitTargetMonitor, b)
b.fetchBlockhashLoop()
return b, nil
}
执行优化策略
速度优化
- 预计算交易模板
- 并发处理多个交易
- 优化RPC连接池
可靠性保障
- 交易状态确认机制
- 失败重试策略
- 资金安全检查
风险控制与监控
盈利目标监控系统(来自beyondjeet项目)
// bot/profit_target_monitor.go - 盈利目标监控系统
// ProfitTargetTask 盈利目标监控任务
type ProfitTargetTask struct {
MintAddress string
WalletAddress string
Platform string
BuyPrice float64
BuyAmount uint64
BuyTime time.Time
TargetProfit float64 // 目标盈利百分比
Timeout time.Duration
PartialSellPercent int
FullExitOnTimeout bool
CancelChan chan struct{}
Owner solana.PublicKey
Creator solana.PublicKey
}
// ProfitTargetMonitor 盈利目标监控器
type ProfitTargetMonitor struct {
tasks map[string]*ProfitTargetTask // key: mintAddress
config *utils.ProfitTargetMonitorConfig
bot *Bot
mutex sync.RWMutex
}
// NewProfitTargetMonitor 创建盈利目标监控器
func NewProfitTargetMonitor(config *utils.ProfitTargetMonitorConfig, bot *Bot) *ProfitTargetMonitor {
return &ProfitTargetMonitor{
tasks: make(map[string]*ProfitTargetTask),
config: config,
bot: bot,
}
}
// StartMonitoring 启动盈利目标监控
func (pm *ProfitTargetMonitor) StartMonitoring(task *ProfitTargetTask) {
if !pm.config.Enable {
logger.Debugf("盈利目标监控未启用,跳过监控: %s", task.MintAddress)
return
}
pm.mutex.Lock()
// 检查是否已存在监控任务
if existingTask, exists := pm.tasks[task.MintAddress]; exists {
logger.Warnf("代币 %s 已存在监控任务,取消旧任务", task.MintAddress)
close(existingTask.CancelChan)
}
pm.tasks[task.MintAddress] = task
pm.mutex.Unlock()
logger.Infof("启动盈利目标监控: 代币=%s, 买入价=%.8f, 目标盈利=%.2f%%, 超时=%ds",
task.MintAddress, task.BuyPrice, task.TargetProfit, int(task.Timeout.Seconds()))
// 启动监控goroutine
go pm.monitorTask(task)
}
风险控制机制
- 止盈策略:达到目标盈利自动卖出
- 止损保护:超时未达标执行部分或全部卖出
- 资金管理:限制单笔交易金额和总持仓
- 黑名单过滤:避免跟单高风险地址
性能优化策略
并发优化
- Goroutine池管理
- Channel缓冲优化
- 锁竞争减少
- 内存复用策略
网络优化
- 连接池复用
- 请求批量处理
- 超时控制
- 重试机制
交易执行流程(基于beyondjeet架构)
// 交易执行流程示意
1. Yellowstone gRPC 接收交易
↓
2. 解析交易类型
├── Pump.fun → PumpParse
├── Pump AMM → PumpAmmParse
├── Raydium V4 → RaydiumV4Parse
├── Launchpad → LaunchpadParse
├── CPMM → CpmmParse
└── Meteora DBC → MeteoraDbcParse
↓
3. 检查钱包监控
↓
4. 是否为监控钱包?
├── 是 → 获取参数模板
└── 否 → 忽略交易
↓
5. 验证交易条件
↓
6. 条件满足?
├── 是 → 执行跟单交易
└── 否 → 记录并跳过
↓
7. 发送到交易队列
↓
8. SWQOS 路由选择
↓
9. 执行区块链交易
↓
10. 更新交易状态
核心模块组件
核心交易模块
main.go- 系统启动和初始化bot/- 核心交易逻辑stream/manager.go- gRPC数据流管理wallet/monitor.go- 钱包状态监控
支持服务模块
noncecache/- 交易nonce优化asset/- 余额和持仓管理swqos/- 服务质量和路由web/server.go- HTTP API服务
部署与运维
部署注意事项
- 网络环境:确保与Solana RPC和Yellowstone的稳定连接
- 资源配置:合理分配CPU、内存和网络带宽
- 安全防护:私钥安全存储,API访问控制
- 监控告警:实时监控系统状态和交易结果
部署架构(基于beyondjeet生产环境)
生产环境部署架构:
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ 用户 │───▶│ Nginx反向代理 │───▶│ beyondjeet │
└─────────────────┘ └──────────────────┘ │ 应用 │
└─────────────────┘
│
┌─────────────────┐ │
│ Supervisor │◀────────────┘
│ 进程管理 │
└─────────────────┘
│
▼
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Redis数据库 │◀───│ beyondjeet │───▶│ gRPC节点服务 │
│ 配置存储 │ │ 核心应用 │ │ Yellowstone │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│ │
│ ▼
│ ┌─────────────────┐
│ │ Solana主网 │
│ │ 区块链网络 │
│ └─────────────────┘
▼
┌─────────────────┐
│ 多DEX交易平台 │
│ Pump/Raydium等 │
└─────────────────┘
安全特性:
• JWT Token认证机制
• IP白名单访问控制
• HTTPS加密传输
• 本地私钥存储
安全架构特点
- 认证与授权:JWT Token + API认证中间件
- 私钥管理:本地存储,私钥不上传到服务器
- 网络安全:全程HTTPS加密传输
- 访问控制:支持IP白名单限制启动
总结与展望
beyondjeet技术优势总结
毫秒级响应
Yellowstone gRPC实现超低延迟跟单交易
多重安全
JWT认证、IP白名单、本地私钥存储
多平台支持
支持6大主流DEX平台交易
智能管理
Web界面配置、Supervisor进程管理
beyondjeet性能优化特点
- 并发处理:Goroutine池并发处理多笔交易
- 异步通信:Channel异步消息传递机制
- 连接复用:Redis连接池和HTTP Keep-Alive
- 智能缓存:内存缓存热点数据,参数模板缓存
- 负载均衡:SWQOS智能路由选择最优节点
- 实时监控:gRPC流实时数据订阅
免责声明
本文仅供技术学习和研究目的,不构成投资建议。跟单交易存在风险,可能导致资金损失。 请在充分了解风险的前提下谨慎使用,并确保遵守当地法律法规。