ClawTipper:基于LLM与区块链的自动化开源贡献打赏机器人实战
1. 项目概述与核心价值最近在折腾一个挺有意思的东西一个叫 ClawTipper 的自动化打赏机器人。简单来说它解决了一个开源社区里老生常谈但又很实际的问题如何公平、自动地为有价值的代码贡献比如合并的 Pull Request发放真金白银的奖励而不是仅仅停留在口头感谢或“精神鼓励”上。这个项目的核心就是把一套明确的经济规则写进代码里让它变成一个自主运行的“财务代理”自动评估、决策并完成链上支付。想象一下你维护着一个开源项目每天都有开发者提交代码。有些改动是简单的错别字修正有些则是重构了核心模块带来了巨大的性能提升。传统的“一刀切”奖励方式显然不合理但人工审核每一笔打赏又极其耗时。ClawTipper 的诞生就是为了填补这个空白。它通过连接 GitHub、调用大语言模型LLM进行评估并最终通过 Tether 的 WDKWeb3 开发者工具包在 Polygon 链上支付 USDT整个过程无需人工干预。更重要的是它的钱包是自托管的所有支付决策都受到预设策略的严格约束比如单笔打赏上限、每日支出比例、投资回报率门槛等确保资金使用既慷慨又理性。这个项目非常适合开源项目的维护者、DAO去中心化自治组织的运营者或者任何希望建立一套透明、可编程的贡献激励体系的人。即使你对区块链开发不熟悉但如果你对自动化、GitHub 工作流和智能合约应用感兴趣也能从中获得很多启发。接下来我会带你深入拆解它的架构、实现细节并分享我在部署和调试过程中踩过的坑和总结的经验。2. 架构设计与核心组件解析ClawTipper 的架构清晰地将功能模块分成了三个主要部分展示层Web 应用、代理层核心业务逻辑和外部服务层。这种分离使得系统易于理解、维护和扩展。2.1 三层架构详解展示层 (Presentation Layer -clawtipper-web/)这是一个基于 Next.js 14 构建的现代 Web 应用主要提供两个功能活动流仪表盘和交易查看器。它通过两个主要的 API 端点与后端数据交互/api/activity: 用于获取代理执行的历史活动日志。这里有个关键点在 Vercel 等无服务器平台上应用无法直接访问运行在另一台服务器或本地的代理日志文件。因此它依赖于一个外部的、可通过 HTTPS 访问的transactions.json文件的原始链接例如一个 GitHub Gist 的 raw URL这个链接由环境变量ACTIVITY_SOURCE_URL指定。/api/txs: 这是一个可选功能用于展示链上交易的详细信息。它需要配置WDK_INDEXER_API_KEY来调用 Tether WDK 的索引器 API从而获取更丰富的链上数据比如交易状态、Gas 消耗等并以更友好的卡片形式展示而不仅仅是一个 Polygonscan 链接。代理层 (Agent Layer -clawtipper/)这是整个系统的“大脑”和“执行手臂”一个 Node.js 服务。它的工作流可以概括为“获取-评估-决策-执行-记录”入口与调度 (index.js/auto-runner.js):index.js是处理单次任务的命令行入口可以针对一个特定的 PR URL 执行评估和打赏。auto-runner.js则是一个可选的后台轮询服务它会定期例如每小时检查指定仓库是否有新的 PR 被合并并自动触发处理流程。这对于实现完全无人值守的自动化至关重要。GitHub 集成 (GH): 负责与 GitHub REST API 通信使用GITHUB_TOKEN进行认证获取指定 PR 的详细信息包括标题、描述、代码差异、提交者、合并时间等。这些是后续评估的原始材料。LLM 评估 (EVAL): 这是项目的“裁判”。它使用 Google 的 Gemini API模型可配置如gemini-1.5-flash将上一步获取的 PR 信息连同预设的评估提示词一起发送给大模型。提示词会要求模型根据代码变更的复杂度、重要性、创新性等维度进行评分并给出一个建议的打赏金额。模型的输出会被解析作为打赏决策的重要输入。策略引擎 (POLICY): 这是项目的“财务总监”和“风控官”。它接收 LLM 的建议但拥有最终否决权。它会根据.env中配置的一系列硬性规则进行校验例如AGENT_MIN_BALANCE: 钱包最小余额低于此值则拒绝所有支付。MAX_TIP_USD: 单笔打赏的绝对上限美元。DAILY_CAP_PERCENT: 每日最多可支出钱包总余额的百分比。MIN_ROI: 最小投资回报率阈值这是一个更高级的概念可能用于衡量打赏带来的潜在价值如社区活跃度提升、Bug 减少等需要自定义度量指标。此外它还会执行一些基础校验比如检查贡献者地址是否有效、PR 描述是否包含地址等。只有通过所有策略检查的请求才会进入支付环节。支付执行 (WDK): 这是与区块链交互的核心模块。它使用 Tether WDK 来管理一个自托管的 EVM 兼容钱包通过助记词生成并与 Polygon 网络的 RPC 节点通信。当收到支付指令时它会构造一笔 USDTERC-20 代币转账交易签名并广播到网络。WDK 封装了与合约交互的复杂性使得发送代币像调用普通 API 一样简单。日志记录 (LOG): 所有重要的操作尤其是打赏交易无论成功与否都会以结构化的 JSON 格式记录到本地的logs/transactions.json文件中。这份日志是系统审计和 Web 仪表盘数据来源的基础。Telegram 控制 (TG): 这是一个非常实用的可选模块。通过集成 Telegram Bot API运营者可以远程监控和控制代理。例如接收新打赏的通知、查询钱包余额和状态、暂停/恢复自动轮询、查看最新日志等大大提升了运维的便捷性。外部服务层 (External Services)这是代理所依赖的所有第三方服务GitHub API: 提供代码仓库和 PR 数据。Google Gemini API: 提供 LLM 评估能力。Polygon RPC: 提供与 Polygon 区块链网络的连接用于查询状态和发送交易。USDT 合约: Polygon 链上的 USDT 代币智能合约地址。WDK Indexer API (可选): 提供链上交易的高级查询功能。Telegram Bot API (可选): 提供机器人通信能力。注意架构的灵活性。这个架构的一个优点是模块化。例如如果你不喜欢 Gemini完全可以替换成 OpenAI 的 GPT 或本地的开源模型只需修改EVAL模块。同样支付模块理论上也可以适配其他链或支付协议只要它们有相应的 SDK 和 WDK 类似的功能。2.2 核心工作流程与数据流整个系统的数据流遵循一个清晰的管道触发: 由auto-runner定时触发或由人工通过node index.js PR_URL命令触发。数据获取: 代理通过 GitHub API 获取目标 PR 的完整数据。智能评估: PR 数据被送入 Gemini 模型模型根据预设规则输出评估报告和建议金额。策略风控: 建议金额进入策略引擎依次进行余额检查、单笔上限检查、日支出限额检查、ROI 检查等。任何一环失败流程终止并记录拒绝原因。链上执行: 通过所有检查后代理使用 WDK 构造 USDT 转账交易发送至 Polygon 网络。确认与记录: 代理等待交易被网络确认矿工打包获取交易哈希tx hash和最终状态然后将这笔交易的详细信息哈希、金额、接收者、状态、时间戳等追加到本地的transactions.json日志文件中。状态同步: Web 应用定期或通过轮询从ACTIVITY_SOURCE_URL指定的位置如一个 GitHub Gist读取更新后的transactions.json文件在仪表盘上展示最新的活动流。如果配置了 Indexer API则可以进一步展示链上详情。通知: 如果启用了 Telegram运营者会实时收到关键事件的通知。3. 环境配置与核心模块实操要点要让 ClawTipper 跑起来合理的环境配置是关键第一步。很多问题都源于.env文件配置错误或对依赖服务理解不透彻。3.1 代理端 (clawtipper/) 配置详解进入clawtipper目录复制环境变量模板并开始编辑cd clawtipper cp .env.example .env # 使用你喜欢的编辑器打开 .env 文件例如 nano 或 vim nano .env以下是对关键环境变量的逐一解读这些解读基于实际部署经验能帮你避免很多坑GITHUB_TOKEN: 这是 GitHub 个人访问令牌。你需要在 GitHub 账号的 Settings - Developer settings - Personal access tokens - Tokens (classic) 中生成一个。权限至少需要repo访问私有仓库或public_repo仅公开仓库。重要经验令牌不要直接使用GITHUB_TOKEN这个默认的 Actions 令牌因为它权限受限。使用你自己生成的 classic token。生成后立即复制并妥善保存因为它只显示一次。GEMINI_API_KEY: 在 Google AI Studio 获取。创建一个项目后可以在 API 密钥部分生成。注意确保你使用的区域支持 Gemini API并且该密钥有足够的配额。MNEMONIC: 这是代理钱包的助记词12或24个单词。这是整个系统安全的核心绝对不要使用已有的、存有大量资产的钱包助记词。建议专门为这个项目创建一个新的钱包。你可以使用 MetaMask 创建一个新账户然后在设置 - 安全 - 显示助记词中获取。安全警告这个.env文件必须被严格保护绝不能提交到 Git 仓库。.gitignore文件通常已经包含了.env。PROVIDER_URL: Polygon 网络的 RPC 端点。你可以使用公共端点如https://polygon-rpc.com但对于生产环境更推荐使用 Infura、Alchemy 等提供的专用节点以获得更好的稳定性和速率限制。例如 Alchemy 的 URL 类似https://polygon-mainnet.g.alchemy.com/v2/YOUR_API_KEY。USDT_ADDRESS: Polygon 主网上 USDT 的合约地址是0xc2132D05D31c914a87C6611C10748AEb04B58e8F。务必再三确认如果填错资金将发送到错误的合约可能永久丢失。对于测试网如 Mumbai需要使用测试网的 USDT 地址。AGENT_WALLET_ADDRESS: 这是由上面MNEMONIC推导出的第一个账户地址m/44/60/0/0/0。配置后Web 应用可以显示它。你可以通过一个简单脚本或使用ethers.js命令行工具来获取它。策略相关变量这些是你的“财务规则”。AGENT_MIN_BALANCE: 设置为一个合理的值比如 50代表 50 USDT。当钱包余额低于此值时代理会拒绝所有打赏请求防止钱包被掏空。MAX_TIP_USD: 根据你的预算设定例如 100。这意味着即使 LLM 认为某个 PR 价值 200 USDT最终打赏也不会超过 100。DAILY_CAP_PERCENT: 比如设为 5意味着每天最多支出钱包总余额的 5%。这是一个很好的现金流管理工具。MIN_ROI: 这个需要你自定义计算逻辑。在默认的评估提示词中它可能被用作一个过滤门槛。你需要想清楚如何量化一个 PR 的“回报”。可以是主观的由 LLM 评估也可以尝试结合一些客观指标如该 PR 关联的 Issue 的严重程度、影响的用户数等但这部分需要定制开发。3.2 Web 应用端 (clawtipper-web/) 配置要点Web 应用的配置相对独立主要关注如何获取和展示数据。cd clawtipper-web cp .env.example .env.local # Next.js 通常使用 .env.local nano .env.localNEXT_PUBLIC_SITE_URL: 你的网站部署后的 URL例如https://clawtipper.vercel.app。这用于构建正确的绝对路径。NEXT_PUBLIC_GITHUB_REPO: 你要监控的 GitHub 仓库 URL例如https://github.com/yourname/yourrepo。这会在页面上显示。ACTIVITY_SOURCE_URL:这是连接代理和 Web 应用的生命线你需要将代理生成的clawtipper/logs/transactions.json文件定期同步到一个公开可访问的 HTTPS URL。最简便的方法是使用 GitHub Gist在 GitHub 上创建一个新的 secret Gist公开 Gist 也行但日志可能包含地址信息。将transactions.json的内容粘贴进去保存。点击 “Raw” 按钮获取类似https://gist.githubusercontent.com/username/gist_id/raw/.../transactions.json的链接。将这个链接填入ACTIVITY_SOURCE_URL。你需要一个机制可以是脚本也可以利用代理本身的逻辑扩展在每次有新交易后自动更新这个 Gist。否则 Web 应用的数据不会更新。WDK_INDEXER_API_KEY: 如果你需要/api/txs端点提供更丰富的链上数据需要去 Tether WDK 平台申请 API 密钥。这是一个可选功能没有它交易卡片只会显示一个 Polygonscan 链接。AGENT_WALLET_ADDRESS: 填入与代理端相同的钱包地址用于在页面上展示代理钱包信息。ALLOW_ACTIVITY_DEMO:仅在本地开发时启用。当设置为true时如果ACTIVITY_SOURCE_URL不可用前端会显示模拟数据。在生产环境Vercel中必须确保此变量未设置或为false否则用户可能看到虚假数据。3.3 Telegram Bot 集成实战Telegram 机器人极大地提升了可操作性。设置步骤如下创建机器人在 Telegram 中搜索BotFather发送/newbot命令按提示设置名字和用户名。创建成功后BotFather会给你一个HTTP API令牌形如1234567890:ABCdefGhIJKlmNoPQRsTUVwxyZ。配置代理将上述令牌填入clawtipper/.env文件的TELEGRAM_BOT_TOKEN变量中。启动与交互重要Telegram 机器人必须由auto-runner.js即npm run agent启动因为它需要保持一个长期运行的进程来监听消息。单次运行的node index.js命令无法处理 Telegram 交互。运行npm run agent启动代理和机器人。在 Telegram 中打开你机器人的链接如https://t.me/YourClawTipperBot。发送/start命令来订阅通知。之后你就可以使用/status查看状态/wallet查看余额/logs获取最新日志/pause和/resume来控制自动轮询。实操心得处理冲突Telegram Bot API 要求一个 token 在同一时间只能有一个活跃的会话。如果你在多台服务器或多次本地运行npm run agent会导致后启动的实例失败HTTP 409 冲突错误。因此生产环境中务必确保只有一个代理进程在运行。可以使用pm2、systemd或 Docker 来管理单实例进程。4. 完整部署流程与运维指南将 ClawTipper 部署到一个可公开访问、稳定运行的环境涉及前端Web、后端Agent和它们之间的数据同步。4.1 前端 Web 应用部署VercelVercel 是部署 Next.js 应用的绝佳选择配置简单。导入仓库在 Vercel 仪表盘点击 “Add New” - “Project”从 GitHub 导入你的 ClawTipper 仓库。配置项目Root Directory: 因为这是一个 Monorepo 结构你需要手动指定为clawtipper-web。Framework Preset: Vercel 会自动检测为 Next.js。Build Command: 保留默认的npm run build或next build。Output Directory: 保留默认的.next。环境变量在项目的 Settings - Environment Variables 页面添加在3.2节中配置的所有NEXT_PUBLIC_*和必要的私有变量如WDK_INDEXER_API_KEY。特别注意ACTIVITY_SOURCE_URL必须是一个有效的、可公开访问的 JSON 文件 URL。ALLOW_ACTIVITY_DEMO千万不要在生产环境设置。部署点击 “Deploy”。部署成功后你会获得一个*.vercel.app的域名。4.2 代理服务部署非 Vercel代理是一个需要常驻运行的 Node.js 服务不能部署在 Vercel 这样的无服务器函数上。你有多种选择云服务商Render、Railway、Fly.io 等提供了简单的 Node.js 应用托管非常适合此类后台服务。虚拟私有服务器如 DigitalOcean Droplet、Linode、AWS EC2 等给你完全的控制权。本地服务器如果你有始终在线的机器如家庭 NAS也可以运行。以 Render 为例的部署步骤在 Render 控制台创建新的 “Web Service”。连接你的 GitHub 仓库。配置服务Root Directory:clawtipper。Build Command:npm install。Start Command:npm run agent。这将启动auto-runner.js包含 Telegram bot。Plan: 选择免费的或付费计划。注意免费实例睡眠后机器人会离线。环境变量在 Render 的 Environment 选项卡中添加clawtipper/.env文件中所有的变量。Render 提供了安全的 Secret 存储。部署保存设置并部署。数据同步挑战与解决方案部署后最大的挑战是如何让 Vercel 上的 Web 应用能实时看到代理产生的日志。因为代理运行在 Render 上它的logs/transactions.json文件对 Vercel 不可见。解决方案你需要建立一个同步机制。这里提供两种思路脚本化同步推荐修改代理的日志记录逻辑。在logTransaction函数中不仅写入本地文件同时调用一个函数将新的交易记录追加到远程存储如 GitHub Gist、Supabase 数据库、或一个简单的 API 服务器。这样ACTIVITY_SOURCE_URL就可以指向这个远程存储的端点。Gist 同步示例你可以写一个函数使用 GitHub API 和 Gist ID读取现有 Gist 内容将新交易追加到数组末尾再写回 Gist。这需要你在.env中额外配置一个具有 Gist 权限的GIST_TOKEN和GIST_ID。共享网络存储如果你将代理和 Web 后端部署在同一云服务商且支持共享卷如 Railway 的 Volumes可以将日志文件写入共享路径然后让 Web 应用的后端 API如/api/activity直接读取这个共享文件。但这通常需要将 Web 应用也以 Serverful 方式部署失去了 Vercel 的便利性。4.3 初始化与测试运行在一切就绪后进行端到端测试资助钱包向你的AGENT_WALLET_ADDRESS转入一些 Polygon 主网的 USDT 作为启动资金。你可以从交易所提现 USDT 到 Polygon 网络或使用跨链桥。准备测试 PR在你的目标 GitHub 仓库创建一个测试用的 PR描述中按照要求包含贡献者的 Polygon 地址例如Tip: 0x742d35Cc6634C0532925a3b844Bc9e...然后合并它。运行代理干跑模式在代理服务器上执行npm run agent:dry或node index.js PR_URL 0xContributorAddress --dry-run。这会完整走一遍流程但不会真正发送交易。检查控制台输出确认 GitHub 读取、LLM 评估、策略检查都通过并打印出拟发送的金额。正式运行如果干跑成功移除--dry-run标志再次运行。观察控制台你应该能看到交易哈希被打印出来。复制这个哈希到polygonscan.com上查询确认交易状态。验证数据流确认代理已将交易记录到日志并且你的同步脚本如果用了成功更新了远程的transactions.json。刷新你的 Vercel 网站新的打赏记录应该出现在活动流中。测试 Telegram如果配置了 Telegram在代理运行期间向机器人发送/status和/logs确认能收到回复。5. 常见问题排查与实战经验在实际部署和运行 ClawTipper 的过程中你几乎一定会遇到下面这些问题。这里我把踩过的坑和解决方案整理出来希望能帮你节省大量时间。5.1 代理运行问题问题GitHub API 返回 401 或 403 错误。排查检查GITHUB_TOKEN是否有效且未过期。权限是否足够repo或public_repo如果是私有仓库必须用repo权限。解决在 GitHub 上重新生成一个 token并更新.env文件。运行curl -H Authorization: token YOUR_TOKEN https://api.github.com/user来测试 token 是否有效。问题Gemini API 调用失败提示权限或配额不足。排查确认GEMINI_API_KEY正确且在 Google AI Studio 中已启用 API。检查项目的配额限制。解决前往 Google Cloud Console找到对应的项目在 “API Services” - “Credentials” 和 “Quotas” 页面进行检查和调整。对于测试可以使用免费的配额。问题交易发送失败RPC 错误如 “nonce too low”, “insufficient funds for gas”。排查Gas 费Polygon 上的交易需要 MATIC 作为 Gas 费。确认你的代理钱包里有足够的 MATIC建议至少 1-2 个 MATIC。Nonce如果短时间内重复发送交易可能出现 nonce 错乱。WDK 通常会处理但在异常情况下可能需要重置。余额确认钱包有足够的 USDT 用于打赏。解决存入 MATIC如果是 nonce 问题可以尝试重启代理它会从链上重新查询最新 nonce检查AGENT_MIN_BALANCE设置是否过高。问题--dry-run模式正常但实际运行时报错。排查干跑模式不执行链上操作所以问题通常出在真正的交易签名或发送环节。检查MNEMONIC是否正确以及它推导出的地址是否与AGENT_WALLET_ADDRESS一致。检查PROVIDER_URL是否可达。解决使用一个简单的脚本验证助记词和地址的对应关系。测试 RPC 节点的连通性curl -X POST --data {jsonrpc:2.0,method:eth_blockNumber,params:[],id:1} YOUR_PROVIDER_URL。5.2 Web 应用问题问题Vercel 网站上的活动流一直显示 “Loading…” 或没有数据。排查这是最常见的问题。打开浏览器开发者工具F12查看 Network 选项卡中/api/activity请求的响应。如果返回 500 错误检查 Vercel 的 Function Logs看是否是服务器端读取ACTIVITY_SOURCE_URL失败。如果返回 200 但数据为空直接访问ACTIVITY_SOURCE_URL这个链接看是否能下载到正确的 JSON 文件。99% 的情况都是这个 URL 配置错误或不可访问。解决确保ACTIVITY_SOURCE_URL是一个直接的、返回Content-Type: application/json的 raw 文件链接。对于 GitHub Gist必须是 “Raw” 按钮的链接。确保该文件内容是一个有效的 JSON 数组。问题交易卡片显示 “Failed to fetch transaction details”。排查这表示/api/txs端点调用 WDK Indexer API 失败。检查 Vercel 环境变量WDK_INDEXER_API_KEY是否正确设置以及该密钥是否有权限。解决确认 API 密钥有效。如果没有配置此密钥前端应优雅降级只显示交易哈希链接。你可能需要检查前端代码看是否在缺少密钥时做了正确处理。5.3 数据同步与日志问题问题代理成功打赏了但 Vercel 网站很久都不更新。排查代理的日志文件更新了但远程的ACTIVITY_SOURCE_URL指向的文件没有更新。说明你的同步机制没有工作。解决实现并确保同步脚本被正确调用。可以在代理的logTransaction函数成功后立即调用一个syncLogToGist()之类的函数。同时考虑在 Web 端增加一个手动“强制刷新”按钮或者使用 SWR/Stale-While-Revalidate 模式来更频繁地轮询。问题transactions.json文件变得很大加载慢。解决实现日志轮转。可以修改日志逻辑每天或每周生成一个新的日志文件如transactions-2023-10-27.json然后让 Web 应用的 API 能够合并或按需读取这些文件。或者将日志存储迁移到数据库如 SQLite 或云数据库/api/activity改为从数据库查询。5.4 策略与评估调优问题LLM 评估的打赏金额总是过高或过低不符合预期。解决调整clawtipper项目中发送给 Gemini 的提示词prompt。提示词是控制评估质量的关键。你需要明确告诉模型你的评估标准、项目背景、以及金额建议的范围和依据。例如加入类似“将代码变更分为‘微小修复’、‘功能增强’、‘重大重构’几类并分别对应 5-20 USDT 20-100 USDT 100 USDT 的建议范围”的指令。这需要反复测试和迭代。问题如何防止垃圾 PR 或恶意行为解决除了依赖 LLM 的判断可以在策略层 (POLICY) 设置更严格的硬性规则Hard Gates代码行数下限忽略修改行数少于 N 行的 PR。提交者检查可以配置一个允许列表Allow List或禁止列表Deny List。PR 描述检查要求 PR 描述必须包含特定关键词或格式否则直接拒绝。时间锁合并后等待一段时间如24小时再打赏以便社区审查。这些规则需要你根据项目具体情况在代理的代码中实现。关于网络延迟的实操心得Polygon 网络大多数时候很快但偶尔也会拥堵。当代理广播交易后控制台会立即打印交易哈希。此时交易已进入内存池但尚未确认。你可以立即用这个哈希在 Polygonscan 上查看状态可能是 “Pending”。这是正常的。代理内部会等待交易确认可配置WDK_TX_CONFIRMATIONS环境变量默认为1个确认块。如果长时间不确认可能是 Gas 费设置过低。WDK 有重试和 Gas 价格调整策略但极端情况下可能需要手动干预。因此监控钱包余额和交易状态是一个好习惯。