如何使用 MEV 保护在 Base 上构建 Telegram 交易机器人

本文介绍了如何使用 QuickNode 的 Base DeFi Power Bundle 构建一个具有 MEV 保护的 Telegram 交易机器人。

概述

DeFi 交易机器人是简化用户体验的强大工具,但它们面临着重大的挑战,包括抢跑攻击、因不准确的 gas 定价导致的交易失败以及跨去中心化交易所 (DEX) 的低效路由。为 DeFi 构建安全、用户友好且高性能的 Telegram 交易机器人需要强大的基础设施来有效处理这些问题。

QuickNode 的 Base DeFi Power Bundle 提供了一套强大的附加组件,用于解决 Base Mainnet 上 DeFi 开发中的关键痛点。这些附加组件使开发人员能够创建一个具有高级功能的 Telegram 交易机器人,例如 MEV 保护、优化的 gas 估算和无缝的跨 DEX 交易。该捆绑包包括:

  • 实时 Gas 预测:使用 Sentio Gas Price API 进行准确的 gas 费用估算,以防止交易失败。
  • MEV 保护和 Gas 退款:防止抢跑和三明治攻击,同时回收未使用的 gas 以提高成本效益。
  • 跨 DEX 交换聚合:OpenOcean API,用于在 Base Mainnet DEX(如 Uniswap、SushiSwap 和 Aerodrome)上实现最佳交换路径。
  • 通过 Blockbook 提供的余额和历史 API:访问钱包余额和历史数据。

在本指南中,你将学习如何构建一个 Telegram 交易机器人,该机器人使用这些附加组件在 Base 主网上安全有效地交易 ERC-20 代币。该机器人提供以下功能:

  • 钱包管理:在 Telegram 中安全地创建或导入钱包,并进行加密的私钥存储。
  • 代币交易:使用受 MEV 保护的交易以 ETH 买卖 ERC-20 代币,以实现公平执行。
  • ETH 存款和取款:将 ETH 存入机器人的钱包或提取到外部地址。
  • 余额和历史数据:查看实时 ETH 和 ERC-20 代币余额,以及具有法币等价价值(例如,美元)的历史趋势。
  • 可自定义的设置:调整滑点容差和 gas 优先级(低、中、高)以优化交易成本和速度。
  • 私钥导出:在用户确认后安全地导出私钥,以实现完全控制。

最终产品应如下所示:

Telegram Trading Bot with MEV-Protected Features

我们将引导你了解应用程序的工作原理、每个附加组件的使用方式以及如何自行设置和测试它。

如何在 BASE 上创建 Telegram 交易机器人 在 YouTube 上观看

你将做什么

  • 在 Base 上构建一个可用于生产的 Telegram 交易机器人
  • 使用 SQLite 安全地存储加密的用户钱包数据
  • 在本地或 Telegram 中测试机器人并与之交互

你将需要什么

机器人架构和关键组件

在深入研究代码之前,让我们先探讨一下这个 Telegram 机器人的架构方式,以及它如何利用 QuickNode 的 Base DeFi Bundle 以及本地存储来提供安全、实时的交易功能。

此图显示了用户如何与机器人交互,以及机器人如何使用本地服务(如用于安全存储的 SQLite)和外部 API 来完成命令。

Telegram Bot Diagram 1

单击以查看详细图表

Telegram Bot Diagram 2

数据库

该机器人使用本地 SQLite 数据库(通过 better-sqlite3)安全地存储用户数据,并确保跨会话的持久性。它既轻量级又强大,使机器人可以立即访问用户设置、钱包信息和交换历史记录。

这是它跟踪的内容:

目的
users 存储 Telegram 用户元数据(ID、用户名、姓名、时间戳)
wallets 存储加密的私钥和地址
settings 跟踪用户偏好,如滑点和 gas 优先级
transactions 记录交换历史记录:来自/发送到代币、使用的 gas、状态等

每个私钥都使用 .env 文件中定义的密钥通过 AES-256-CBC 进行加密,从而确保存储钱包的强大安全性。用户可以创建、导入和导出钱包,并且他们的配置在会话中保持不变。

架构和逻辑位于 src/lib/database.ts 中,并且表会在首次运行时自动初始化。

命令组

命令被组织成功能类别:

  • 钱包命令:处理钱包创建、管理和密钥导入/导出
  • 余额命令:提供代币余额信息和交易历史记录
  • 交易命令:通过交换促进代币的买卖
  • 存款/取款:管理资金的链上/链下转移
  • 配置:控制用户设置和首选项

核心库

应用程序逻辑封装在专门的库中:

  • token-wallet.ts:管理钱包创建、密钥存储和交易签名
  • database.ts:为用户数据和设置提供安全存储
  • encryption.ts:处理敏感钱包信息的安全加密
  • history.ts:跟踪和记录余额更改和交易历史记录
  • swap.ts:与交换服务集成并处理 gas 估算

Base DeFi Power Bundle 附加组件

Gas 估算 API

Sentio 的 Gas 估算 API 基于 mempool 模拟提供实时 gas 费用预测,比标准 eth_gasPrice 调用更准确。此 API 返回基于置信度的费用估算,使机器人能够向用户建议低、中或高 gas 选项,类似于 MetaMask 等钱包。

它是如何工作的

API 调用 ( sentio_gasPrice) 返回一个 JSON 响应,其中包含不同置信度级别(例如,90%、95%、99%)的 gas 价格估算。

机器人将这些映射到用户友好的选项:

  • :90% 置信度(更便宜、更慢)。
  • :95% 置信度(平衡)。
  • :99% 置信度(更快、更昂贵)。

当用户发起交易(例如,/buy)时,机器人会根据配置的优先级(低、中或高)获取 gas 价格,并将其包含在交换报价中。这确保用户具有可预测的费用,尤其是在网络拥塞期间。

实施

src/lib/swap.ts 中,机器人查询 API 以获取 gas 价格:

export async function getGasEstimates(): Promise<BlockPrices> {
  try {
    const response = await axios.post(
      QUICKNODE_RPC_URL,
      {
        jsonrpc: "2.0",
        method: "sentio_gasPrice",
        params: { chainId: BASE_CHAIN_ID },
        id: 1,
      },
      {
        headers: { "Content-Type": "application/json" },
      }
    );

    const data = response.data;

    if (data.error) {
      throw new Error(`Error fetching gas price: ${data.error.message}`);
    }

    return data as BlockPrices;
  } catch (error) {
    console.error("Error fetching gas price:", error);
    return { blockPrices: [] };
  }
}

OpenOcean v4 Lightning Swap API

OpenOcean v4 Lightning Swap API 通过聚合多个去中心化交易所 (DEX)(如 Uniswap、SushiSwap 和 Aerodrome)的流动性,可以在 Base Mainnet 上实现快速准确的代币交换。

它是如何工作的
  • 报价检索/quote 端点提供交换预览,包括最佳交换路径、预期输出金额和估计的 gas 成本。这会显示给用户以供确认。
  • 交换执行:在用户确认后,/swap 端点返回一个预签名交易负载,机器人会对其进行签名并提交到区块链。
  • 滑点保护:API 包括内置的滑点保护,可以通过滑点参数进行配置,以确保交易在可接受的价格范围内执行。

当用户发起交易(例如,/buy/sell)时:

  1. 机器人调用 getQuote 以获取指定代币对和金额的报价,使用当前的 gas 价格。
  2. 报价会呈现给用户,显示预期的输出金额。
  3. 用户确认交易,机器人调用 getSwap 以执行交换,使用报价和用户提供的 gas 价格。
  4. 机器人使用 MEV 保护 RPC 对交易进行签名并提交到区块链。

这种集成简化了流动性聚合,并确保高效、用户友好的交易。

实施

src/lib/swap.ts 中,机器人使用 OpenOcean API 来获取交换报价并执行交易:

  • 报价
  • 交换
export async function getQuote(
  inTokenAddress: string,
  outTokenAddress: string,
  amount: string,
  gasPrice: string
): Promise<QuoteResponse> {
  try {
    // Construct URL - QUICKNODE_RPC_URL has `/` at the end in default
    let url = `${QUICKNODE_RPC_URL}addon/${ADDON_ID}/v4/${CHAIN}/quote?inTokenAddress=${inTokenAddress}&outTokenAddress=${outTokenAddress}&amount=${amount}`;

    if (gasPrice) {
      url += `&gasPrice=${gasPrice}`;
    }

    // Fetch quote
    const response = await axios.get(url);

    const data = response.data;

    if (isErrorResponse(data)) {
      throw new Error(`OpenOcean API error: ${data.error}`);
    }

    return data;
  } catch (error) {
    console.error(
      "Failed to get quote:",
      error instanceof Error ? error.message : String(error)
    );
    throw error;
  }
}

MEV 保护和 Gas 恢复

Merkle 提供的 MEV 保护和 Gas 恢复附加组件 可以保护交易免受抢跑和三明治攻击,同时通过在交换失败或消耗的 gas 少于估计值时恢复未使用的 gas 来优化 gas 使用量。

当机器人通过 viem 调用 sendTransaction 时,它会在后台使用 eth_sendRawTransaction。启用该附加组件后,这些交易会自动路由到 Merkle 的私有中继,从而保护它们免受抢跑和三明治攻击。除了使用 QuickNode RPC 端点之外,无需其他配置。

/**
 * Create a wallet client for the given private key
 */
function createClient(account: Account): WalletClient {
  return createWalletClient({
    account,
    chain: base,
    transport: http(QUICKNODE_RPC_URL),
  });
}

Base Blockbook JSON-RPC

Blockbook JSON-RPC API 提供了对 Base Mainnet 上指定日期的钱包余额历史记录、当前代币余额以及法币等价值的访问。

它是如何工作的
  • 余额历史记录 ( bb_getBalanceHistory):检索指定地址在给定时间范围内的 ETH 余额趋势。它包括法币价格(例如,美元)并支持可自定义的时间分组(例如,每小时)。

当用户运行 /history 时,机器人会调用 getBalanceHistory 以获取并显示 ETH 余额趋势(例如,每日、每周或每月)在文本表中,包括美元等值。

  • 代币余额 ( bb_getAddress):返回当前的 ETH 和 ERC-20 代币余额,以及按区块高度排序的交易历史记录。机器人可以过滤结果以仅显示通过机器人交易的代币。

/balance 命令触发 getEthBalancegetTokenBalance 以向用户显示 ETH 和 ERC-20 代币余额。机器人可以选择过滤输出以高亮显示通过机器人交易的代币。

项目设置

要开始在 Base Mainnet 上构建 Telegram 交易机器人,你需要配置你的开发环境并安装所需的依赖项。本节将指导你完成克隆存储库、设置环境变量以及准备 QuickNode 和 Telegram 所需的凭据。

免责声明

本指南中提供的代码仅用于教育目的,未经审核。未经彻底的测试、审核和安全审查,不应在生产环境中使用它们。

步骤 1:克隆存储库

git clone https://github.com/quiknode-labs/qn-guide-examples.git
cd qn-guide-examples/base/telegram-trading-bot

步骤 2:安装依赖项

选择你喜欢的包管理器来安装项目依赖项:

npm install
## or
yarn install
## or
pnpm install
## or
bun install

此命令安装 package.json 中列出的所有必需包。

步骤 3:配置 Telegram 机器人

你需要一个 Telegram 机器人Token才能与用户交互。按照以下步骤创建新机器人:

  • 打开 Telegram 并搜索 @BotFather。
  • 发送 /newbot 命令并按照提示命名你的机器人。
  • 保存 BotFather 提供的机器人Token。

步骤 4:设置 QuickNode Base Mainnet 端点

  1. QuickNode 注册并创建一个 Base Mainnet 端点。
  2. 在你的端点中启用 Base DeFi Power Bundle 附加组件包。这将启用机器人所需的所有附加组件(Gas 估算 API、Lightning - OpenOcean v4 Swap API、MEV 保护和 Gas 恢复、Blockbook JSON-RPC)。
  3. 保存你的端点 URL。

步骤 5:生成钱包加密密钥

该机器人使用 AES-256-CBC 加密安全地存储加密的用户钱包。你必须在环境变量中提供一个 32 字符的密钥。你可以使用任何方法生成随机字符串,例如:

openssl rand -base64 32

重要:此密钥用于加密和解密用户的私钥。没有它,或者如果它丢失了,则无法解密存储的钱包。安全地存储它,并且永远不要与任何人分享。

步骤 6:配置环境变量

复制示例环境文件以创建你自己的:

cp .env.example .env

然后,使用你的凭据和设置编辑 .env 文件:

TELEGRAM_BOT_TOKEN=your_telegram_bot_token
QUICKNODE_RPC=your_quicknode_endpoint
WALLET_ENCRYPTION_KEY=your_random_32_char_string
DB_PATH=./db.sqlite
CHAIN_ID=8453
DEFAULT_SLIPPAGE=1
DEFAULT_GAS_PRIORITY=medium

your_telegram_bot_tokenyour_quicknode_endpointyour_random_32_char_string 替换为你从前面的步骤中获得的相应值。此外,如果你想自定义机器人的行为,可以修改默认值。

测试并运行 Telegram 交易机器人

设置你的环境并安装依赖项后,你就可以在本地启动 Telegram 交易机器人并在 Base Mainnet 上测试其功能了。

启动机器人

运行以下命令以在开发模式下启动机器人:

npm run dev
## or
pnpm dev
## or
yarn dev
## or
bun dev

预期输出:

🤖 Starting Base MEV-Protected Telegram Trading Bot...
✅ Bot started successfully!
ℹ️  Press Ctrl+C to stop the bot

如果你看到此输出,则机器人正在运行并准备好接受 Telegram 命令。如果机器人启动失败,请检查你的 .env 文件中是否存在缺失或不正确的值,并验证是否已安装依赖项。

如果在启动机器人时遇到 Error: Could not locate the bindings file. 错误,请参阅以下部分以获取可能的解决方案。

单击以展开可能的解决方案

这表明 better-sqlite3 本机绑定未能正确构建,通常是由于 Node.js 版本不匹配或依赖项编译不完整。

推荐修复:手动重建

从源代码重建本机绑定:

cd node_modules/better-sqlite3
npm run build-release
## or
pnpm run build-release
ls build  # Verify that a .node file (e.g., better_sqlite3.node) appears
cd ../..

此命令会为你的系统的 Node.js 版本编译绑定,从而解决该错误。

替代修复:

清理并重新安装依赖项: 如果重建失败,请清除 node_modules 目录并重新安装:

rm -rf node_modules package-lock.json
npm install

## Or, if using pnpm:
rm -rf node_modules pnpm-lock.yaml
pnpm install

检查 Node.js 版本:确保你使用的是 Node.js 20.x 或更高版本,因为 better-sqlite3 可能不支持较旧的版本。

在 Telegram 中进行测试

在本地运行机器人的情况下,你可以通过 Telegram 与其交互以测试其核心功能。

找到你的机器人:

打开 Telegram 并使用通过 @BotFather 设置的用户名(例如,@YourTradingBot)搜索你的机器人。 单击“开始”或发送 /start 来开始对话。

Telegram Bot Start Screen

测试命令
  • /start:显示欢迎消息并提示创建或导入钱包。
  • /create:生成一个新钱包并显示地址和私钥。
  • /import:使用提供的私钥导入现有钱包。
  • /wallet:显示当前钱包的地址。
  • /balance:显示 ETH 和 ERC-20 代币余额。
  • /history:检索余额趋势(例如,每日或每周)。
  • /buy:使用 ETH 发起代币购买,从 OpenOcean 获取报价。
  • /sell:出售代币以换取 ETH,需要用户确认。
  • /settings:调整 gas 优先级(低、中、高)或滑点容差。
预期行为:
  • 机器人会及时响应命令,引导用户完成钱包设置、余额检查和交易。
  • 交换命令(/buy,/sell)显示报价,并在执行前需要确认。
  • 通过 QuickNode 的 MEV 保护端点提交交易。
  • 余额和历史命令提供清晰、格式化的输出。
测试技巧:
  • 使用少量 Base Mainnet ETH 的测试钱包以确保安全。
  • 在不同的网络条件下进行测试,以观察 gas 估算的准确性。
  • 尝试不同的代币地址以观察交换行为。

如果机器人按预期响应,那么恭喜!🎉 你已成功在 Base Mainnet 上部署了安全、受 MEV 保护的交易助手。

下一步

在机器人成功运行并在本地测试后,你可以增强其功能,部署它以供更广泛的使用,并为其开发做出贡献:

探索 QuickNode 附加组件和产品

  • 更深入地研究 Base DeFi Power Bundle 的组件,例如用于高级兑换路由的 OpenOcean 和用于更丰富分析的 Blockbook。
  • 尝试其他 QuickNode 产品,例如 Streams 或其他 marketplace 附加组件。例如,Streams 可以通过跟踪 Base Mainnet 上顶级交易者的交易来启用复制交易功能。

增强机器人功能

  • 实施多钱包管理,允许用户在机器人内的多个钱包之间切换。
  • 添加一个 /trade 命令,用于高级交易选项,例如限价单或批量交换。
  • 使用 OpenOcean 的报价 API 集成实时价格跟踪,以显示代币价格。
  • 通过整理一个列表,为 /buy/sell 建议支持流行的 Base Mainnet 代币。

部署到生产环境

  • 在 Fly.io、Railway 或 Render 等云平台上托管机器人,以实现 24/7 可用性。
  • 在生产环境中保护 .env 文件和数据库,使用环境变量管理和加密存储。
  • 使用 pm2 等进程管理器来确保机器人可靠运行。

为开源存储库做出贡献

机器人的代码是 QuickNode 的指南示例 存储库中的开源项目的一部分。通过以下方式做出贡献:

  • 为错误修复、新功能或文档改进提交拉取请求。
  • 通过 GitHub Issues 报告问题或建议增强功能。
  • 分享你的自定义功能,例如新命令或集成,以使社区受益。
  • 与存储库互动有助于改进机器人并促进 DeFi 开发人员之间的协作。

优化和监控

  • 使用 QuickNode 的仪表板来跟踪 RPC 使用情况并优化附加组件性能。
  • 记录交易结果以分析交换成功率、gas 效率和用户行为。
  • 根据网络条件和用户首选项调整默认设置(例如,DEFAULT_GAS_PRIORITY、DEFAULT_SLIPPAGE)。

通过探索 QuickNode 的生态系统、为开源社区做出贡献以及添加高级功能,你可以将此机器人转变为根据你的需求量身定制的强大 DeFi 工具。

结论

该项目演示了 QuickNode 的 Base DeFi Power Bundle 的强大功能,使你能够以最少的基

  • 原文链接: quicknode.com/guides/def...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。