本文介绍了如何通过Webhook和WebSocket两种方式监控流动性池,重点在于如何设置Cloudflare Worker和Helius API,以及如何处理流动性池事件的通知。文章结构清晰,步骤详尽,涵盖了必要的代码示例和配置指南,适合对DeFi和流动性监控有深入了解的读者。
在传统金融中,买方和卖方通过集中市场为资产提供流动性。而去中心化金融(DeFi)则使用流动性池。流动性池是智能合约,允许用户在去中心化交易所和其他DeFi平台上买卖加密货币。通过监控流动性池,你可以跟踪特定资产的表现,并做出有关何时买入、卖出或交换的明智决策。监控新流动性池的创建也能帮助你发现最近推出的代币。
本文将介绍两种监控流动性池的方法:webhook和websocket。我们还将学习如何设置一个webhook和websocket来监听流动性池中发生的事件。在深入了解平台工作原理之前,你需要一个Helius API密钥。通过Helius仪表盘获取一个非常简单。使用你的GitHub、Solana钱包或Google帐户注册,然后导航到左侧边栏的API密钥部分。
要通过Webhook构建,我们需要遵循三个高层步骤。首先,我们将设置Cloudflare Worker。其次,我们将设置一个Helius webhook并添加Cloudflare Worker的URL。每当在流动性池中监听到交易时,webhook将触发Worker。最后,我们将编辑Worker的代码以处理此通知并记录响应。
我们将设置一个由我们的webhook触发的Worker。我们将向Worker添加代码,以处理来自webhook的触发。Cloudflare Workers让我们能够部署无服务器代码。登录或注册Cloudflare网站,并在主页的左侧面板中选择Workers & Pages。
点击创建 应用按钮。
接下来,点击创建Worker。
现在,点击部署。
Worker已成功部署。请复制Worker链接,因为我们将在设置webhook时使用它。
我们将监控Raydium,第一个建立在Solana上的AMM,利用完全去中心化的中央限价订单簿。中央限价订单簿是一种在股权世界中标准的交易执行方法,它根据价格和时间优先级匹配所有买价和卖价。去中心化中央限价订单簿(CLOB)是一个在分布式节点网络而非中央实体上运行的交易系统。
我们将使用Helius创建一个webhook。Webhooks允许你监听链上事件,并在这些事件发生时触发特定的操作。我们将配置webhook以监听特定交易类型在给定Raydium流动性池中的出现。Helius目前支持以下Raydium交易类型:
"RAYDIUM": [\
"WITHDRAW_LIQUIDITY"\
"ADD_LIQUIDITY"\
"CREATE_POOL"\
"SWAP"\
]
Webhooks可以通过Helius仪表盘或API参考创建。要通过仪表盘创建一个,进入左侧面板中的Webhooks部分,然后点击新建Webhook。
然后,通过提供以下详细信息配置webhook:
675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8
。如果需要,你还可以添加多个账户地址。你也可以包括你资产的地址以监控它们。一旦你点击确认,你的webhook将通知我们的Cloudflare Worker。
下一步是编写适当的代码来处理通知。
我们需要安装Wrangler CLI以将我们的代码添加到Worker,以便在被触发时能够正确处理数据。
登录到你的Cloudflare帐户,以便Wrangler能将你的脚本部署到Cloudflare。
打开命令提示符/终端并输入以下内容:
wrangler login
当Wrangler自动打开你的浏览器以显示Cloudflare的同意屏幕时,点击允许按钮。这将向Wrangler发送APIToken。
从Cloudflare仪表盘创建的Worker初始化一个新项目:
wrangler init --from-dash <worker-name>
检查度量部分以找到Worker的名称:
上述命令将创建一个包含Worker配置和代码的文件夹。接下来,请将src/index.js中的代码替换为下面提供的代码。务必添加你的API密钥。我们建议采用以下最佳实践来保护你的API密钥。
现在,我们将在我们的Worker中使用以下代码:
const HELIUS_API_KEY = API_KEY;
const HELIUS_RPC_URL = `https://mainnet.helius-rpc.com/?api-key=${HELIUS_API_KEY}`;
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
if (request.method === 'POST') {
const requestBody = await request.json();
console.log(requestBody[0].description);
return new Response('记录了POST请求体。', { status: 200 });
} else {
return new Response('方法不允许。', { status: 405 });
}
}
在这段代码中,我们只是记录了通知的描述。响应通知具有解析的交易格式。请注意,不提供财务数据,如价格信息。你可以使用像Jupiter和Birdeye这样的平台来获取财务信息。
将你的项目部署到Cloudflare的全球网络:
wrangler publish
代码成功发布后,让我们检查日志。
返回到Cloudflare网站并进入日志部分:
点击开始日志流按钮。
由于Raydium处理的交易量很大,日志会很多。稍后可以随意过滤日志以查找所需的交易通知。
你可以通过展开收到的日志,在" message
"下查看记录的数据。
Websockets是一种通信协议,允许客户端和服务器之间实时数据交换。这与传统方法不同,传统方法中客户端发送请求并等待服务器响应。使用websockets,连接保持打开状态,可以持续交换数据。我们将使用websockets来监控Raydium流动性池。
为了在我们的项目中实现更快的响应速度,我们将使用geyser增强的transactionSubscribe方法,该方法作为测试功能可用。请注意,此方法仅适用于企业或专业计划。Geyser增强的websockets比标准的RPC websocket方法更快。要开始,先创建一个基本的JavaScript项目,并创建一个名为websocket-test的新文件夹。然后,我们需要创建一个package.json文件。
{
"name": "websocket-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"错误: 没有指定测试\" && exit 1",
"start": "ts-node src/index.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@types/bn.js": "^5.1.0",
"ts-node": "^10.7.0",
"typescript": "^4.6.3"
},
"dependencies": {
"@solana/web3.js": "^1.41.3",
"dotenv": "^16.0.0"
}
}
创建一个名为src的文件夹,并添加一个名为index.js的文件。
将以下代码复制并粘贴到文件中,将<your-api-key>
替换为你自己的Helius API密钥。
const WebSocket = require('ws');
// 向WebSocket服务器发送请求的函数
function sendRequest(ws) {
const request = {
jsonrpc: "2.0",
id: 420,
method: "transactionSubscribe",
params: [{\
failed: false,\
accountInclude: ["675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8"]\
},\
{\
commitment: "processed",\
encoding: "base64",\
transactionDetails: "full",\
showRewards: true,\
maxSupportedTransactionVersion: 0\
}\
]
};
ws.send(JSON.stringify(request));
}
function websocketHandler() {
// 创建WebSocket连接
let ws = new WebSocket('wss://atlas-mainnet.helius-rpc.com?api-key=<your-api-key>');
// 定义WebSocket事件处理程序
ws.on('open', function open() {
console.log('WebSocket已打开');
sendRequest(ws); // 一旦WebSocket打开,发送请求
});
ws.on('message', function incoming(data) {
const messageStr = data.toString('utf8');
console.log('接收:', messageStr);
});
ws.on('error', function error(err) {
console.error('WebSocket错误:', err);
});
ws.on('close', function close() {
console.log('WebSocket已关闭');
// 连接关闭,丢弃旧的websocket并在5秒后创建一个新的
ws = null
setTimeout(startWebsocket, 5000)
});
}
websocketHandler();
我们在请求的accountInclude
数组参数中添加了Raydium的AMM程序地址675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8
。你可以添加适当的参数以获取所需数据。
代码连接到一个websocket并在控制台中记录完整的响应。在大约5分钟的非活动状态后,websocket关闭。为了防止这种情况,onClose
处理程序中添加了重连逻辑。
在命令提示符/终端中运行此命令:
npm install && npm start
你将开始在控制台中看到类似的日志:
就是这样!设置一个webhook来监控流动性池非常简单。或者,你也可以使用geyser增强的websocket方法以获得更快的响应速度。一旦你完成设置,就可以构建一个合适的前端来展示数据。你可以使用带有geyser RPC插件的专用节点,以获得更快速的专用连接。如果你遇到任何问题或需要帮助,请随时在Discord上联系我们!
请确保在下面输入你的电子邮件地址,这样你就不会错过关于Solana新动态的任何更新。准备深入了解吗?今天就探索Helius博客上的最新文章,继续你的Solana之旅。
- 原文链接: helius.dev/blog/how-to-m...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!