You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chainlink Solana SDK异步获取链下数据时onRound事件未触发求助

核心问题分析

onRound事件仅在新的价格轮次被提交到链上时才会触发,若订阅期间恰好没有新的价格更新,就会触发超时。另外,SDK的事件监听依赖对链上日志的正确解析——虽然你能通过onLogs收到原始日志,但SDK内部可能需要额外配置或主动触发才能正确捕获轮次数据。

解决方案

1. 主动获取当前最新轮次数据

不要仅依赖事件订阅,在订阅事件的同时主动查询当前最新价格轮次,即使没有新更新,也能立即拿到当前价格:

async getTokenPriceFromFeed(): Promise<number> {
    const provider = anchor.AnchorProvider.env();
    anchor.setProvider(provider);

    const dataFeed = await OCR2Feed.load(this.PROGRAM_ID, provider);

    // 先主动获取当前最新轮次
    try {
        const latestRound = await dataFeed.getLatestRoundData(this.FEED_ADDRESS);
        const price = latestRound.answer.toNumber();
        console.log("✅ 获取到当前最新价格:", price);
        return price;
    } catch (err) {
        console.error("获取当前轮次失败:", err);
    }

    // 同时订阅新轮次更新作为 fallback
    return new Promise<number>((resolve, reject) => {
        const timeout = setTimeout(() => {
            console.warn("⏰ 超时:未收到新的Chainlink价格更新");
            reject(new Error("10秒内未收到新的价格数据"));
        }, 10000);

        const listener = dataFeed.onRound(this.FEED_ADDRESS, (event) => {
            const price = event.answer.toNumber();
            console.log("✅ 收到新的Chainlink价格:", price);
            clearTimeout(timeout);
            dataFeed.removeListener(listener);
            resolve(price);
        });
    });
}

2. 验证日志解析逻辑

既然你能通过provider.connection.onLogs收到日志,可手动解析日志内容,确认SDK是否能正确识别轮次事件:

  • 打印log的完整内容,检查是否包含Chainlink OCR2的轮次更新标识
  • 对比@chainlink/solana-sdk源码中OCR2Feed类的日志解析逻辑,确认你的馈送地址生成的日志格式符合SDK预期

3. 检查SDK版本兼容性

你使用的@chainlink/solana-sdk@0.2.2可能存在已知的事件监听问题,尝试升级到最新稳定版,或回退到经过验证的版本,同时确保与Anchor版本兼容。

关键注意事项

  • onRound是增量更新监听,仅响应新轮次,不是获取历史或当前价格的方式
  • 生产环境中,建议同时结合主动查询和事件订阅,保证数据的实时性与可靠性
  • 若始终无法触发onRound,可直接基于onLogs手动解析价格数据,绕过SDK的事件封装

内容的提问来源于stack exchange,提问作者Chung Từ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:12:15