使用Alchemy WebSocket获取指定钱包交易:过滤from字段无结果
问题分析与解决方案
核心问题排查
你遇到的from地址过滤无结果的情况,主要集中在订阅未启动、地址格式不匹配这两个常见问题上,以下是具体解决步骤:
1. 订阅函数未执行
你的代码仅定义了add订阅函数,但没有调用它,导致WebSocket监听根本没启动。需要在代码末尾手动调用add()来开启订阅。
2. 地址大小写/校验和不匹配
以太坊地址支持EIP-55校验和格式(大小写混合),直接用==做全等比较时,若目标地址与返回的from地址格式不一致(比如一个是全小写,一个是校验和格式),会导致匹配失败。
解决方法:用ethers的getAddress()方法标准化所有地址,统一格式后再比较:
// 先标准化目标钱包地址 const targetWallet = ethers.getAddress("替换成你的目标钱包地址"); // 在回调中标准化返回的from地址 const fromAddress = ethers.getAddress(tx.transaction.from); if (fromAddress === targetWallet) { console.log("捕获到目标交易哈希:", tx.transaction.hash); }
3. 调试验证建议
先在回调中打印所有返回的from地址和目标地址,确认格式差异:
(tx) => { console.log("返回的from地址:", tx.transaction.from); console.log("目标钱包地址:", "你的钱包地址"); // 后续匹配逻辑 }
修正后的完整代码
const { Alchemy, Network, AlchemySubscription } = require("alchemy-sdk") const {ethers} = require("ethers") require("dotenv").config() const ARBI_WS_KEY = process.env.ARBI_WS_KEY // 标准化目标钱包地址 const TARGET_WALLET = ethers.getAddress("替换成你的目标钱包地址"); const settings = { apiKey: ARBI_WS_KEY, network: Network.ARB_MAINNET, } const alchemy = new Alchemy(settings) const startSubscription = async () => { alchemy.ws.on( { method: AlchemySubscription.MINED_TRANSACTIONS, }, (tx) => { try { const fromAddress = ethers.getAddress(tx.transaction.from); if (fromAddress === TARGET_WALLET) { console.log("目标钱包发起的交易哈希:", tx.transaction.hash); } } catch (err) { console.error("地址解析错误:", err); } } ) } // 启动订阅 startSubscription();
内容的提问来源于stack exchange,提问作者0xDegen
相关产品推荐
相关产品推荐

