低成本基础设施:eRPC+Ponder
当你的核心业务逻辑位于链上时,你的基础设施需要牢不可破,同时保持成本控制。以下是使用开源工具构建它的方法。
一键发币: x402兼容 | Aptos | X Layer | SUI | SOL | BNB | ETH | BASE | ARB | OP | Polygon | Avalanche
每个区块链项目都从一个梦想和有限的预算开始。在 Frak,我们构建了一个平台,用于自动链上奖励分发,通过智能合约推动营销活动。我们的基础设施完全运行在 Arbitrum 上,需要处理:
- 高频事件:每个活跃用户每周处理约 8 笔用户交易
- 复杂查询:实时分析和奖励计算
- 多合约索引:8 个主合约和 3 个活动工厂(在撰写本文时,已部署了约 100 个合约)。
当您的核心业务逻辑位于链上时,您的基础设施需要牢不可破,同时保持成本控制。以下是使用开源工具构建它的方法。
1、挑战
每个区块链应用程序都会面临三个核心挑战:
- 可靠且成本效益高的 RPC 访问
- 高效的事件索引和数据访问
- 可扩展的基础设施,不会耗尽资金
大多数团队会把钱扔向问题。我们采取了不同的方法。
2、eRPC:交通管制员
eRPC 就像你区块链请求的空中交通管制器——但还有一个摄影记忆和成本优化的超能力。用 Go 编写以获得最大性能,它是一个容错的 EVM RPC 负载均衡器,使你的典型代理看起来像生锈的门。
2.1 我们选择 eRPC 的关键功能
智能负载均衡
- 按方法路由(因为让我们面对现实,不是所有的 RPC 都是平等的)
- 项目特定配置(不同的人有不同的需求)
- 自动故障转移处理(因为 uptime 不只是一个可选功能)
智能缓存
- 重新组织意识的永久缓存(不再有陈旧数据的噩梦)
- 按方法的缓存规则(缓存重要的内容,忽略不重要的内容)
- 选择器级别的粒度(因为有时你只需要缓存特定的合同调用)
开发者体验超级力量
- 需要扩大你的开发团队吗?有智能合约测试击中你的 RPC 像 airdrop 期间的 MEV 机器人吗?eRPC 的项目系统让你:
- 为不同的团队创建专用环境
- 实施基于 IP 或钱包签名的身份验证
- 为测试环境配置激进的缓存
- 开发者无需配置更改(它只是工作™)
2.2 简单中的力量
想看看做复杂的事情有多容易吗?这是一个 eRPC 配置,处理多提供者负载平衡、速率限制、方法特定路由和缓存:
export default initErpcConfig({
logLevel: "info",
database: {
// 在这里你可以列出每个数据库(pg、redis、内存等),然后根据数据类型或甚至使用的 方法来配置哪些数据库被使用
// Frak 配置在这里:https://github.com/frak-id/infra-blockchain/blob/6e907c50db2117083a113ee74e2d38d1a6b596ea/packages/erpc/src/storage.ts
evmJsonRpcCache: cacheConfig,
},
})
.addRateLimiters({
// 是的,你甚至可以深入到每种方法的速率限制
alchemy: [{ method: "*", maxCount: 300, period: "1s", waitTime: "5s" }],
pimlico: [{ method: "*", maxCount: 100, period: "1s", waitTime: "5s" }],
drpc: [{ method: "*", maxCount: 100, period: "1s", waitTime: "5s" }],
// 是的,速率限制也可以应用于网络、认证策略、项目等
walletProject: [{ method: "*", maxCount: 1000, period: "1s", waitTime: "5s" }],
})
// 向配置中添加几个网络
.decorate("networks", {
arbitrum: arbNetwork,
arbitrumSepolia: arbSepoliaNetwork,
})
// 向配置中添加几个上游
// Frak 上游配置:https://github.com/frak-id/infra-blockchain/blob/main/packages/erpc/src/upstreams.ts
.decorate("upstreams", {
alchemy: alchemyUpstream,
drpc: drpcUpstream,
pimlico: pimlicoUpstream,
})
.addProject(({ store: { upstreams, networks } }) => ({
id: "wallet-rpc",
// 智能路由:Pimlico 用于 AA,Alchemy 用于其他所有,dRPC 作为备用
upstreams: [
upstreams.alchemy,
upstreams.pimlico,
upstreams.drpc
],
networks: [networks.arbitrum, networks.arbitrumSepolia],
// 使用之前定义的预算进行速率限制
rateLimitBudget: "walletProject"
}))
.build();
在这个例子中,我们使用了 erpc-config-generator 包,它提供了构建器模式,你也可以直接使用 erpc typescript 配置。
3、我们的生产设置
这就是 eRPC 如何让区块链负载平衡和多 RPC 路由变得简单,并帮助我们实现几乎零停机时间:
索引项目
- 主要:Envio + dRPC
- 备用:Alchemy
- 为什么?为了高容量历史查询的成本优化
通用用途(前端+后端+Foundry)
- 主要:Alchemy + Pimlico
- 备用:dRPC
- 辅助:非关键路径的免费 RPC
4、Ponder:带来快乐的索引器
如果你曾经与 The Graph 的托管服务搏斗过,Ponder 就像是你最喜欢的开发工具给你的一次温暖拥抱。它是那个让你记住为什么最初热爱区块链开发的索引器。
// 跟踪当一个活动分配奖励时
ponder.on("CampaignBanks:RewardAdded", async ({ event, context }) => {
// 尝试找到给定事件发射器的奖励合同
const bankingContract = await context.db.find(bankingContractTable, {
id: event.log.address,
});
if (!bankingContract) {
console.error(`Banking contract not found: ${event.log.address}`);
return;
}
// 更新奖励合同的已分发代币总金额
await context.db
.update(bankingContractTable, {
id: event.log.address,
})
.set({
totalDistributed:
bankingContract.totalDistributed + event.args.amount,
});
// 更新当前用户奖励(如果未找到则插入)
await context.db
.insert(rewardTable)
.values({
contractId: bankingContract.id,
user: event.args.user,
pendingAmount: event.args.amount,
totalReceived: event.args.amount,
totalClaimed: 0n,
})
.onConflictDoUpdate((current) => ({
pendingAmount: current.pendingAmount + event.args.amount,
totalReceived: current.totalReceived + event.args.amount,
}));
// 插入奖励事件
await context.db.insert(rewardAddedEventTable).values({
id: event.log.id,
contractId: bankingContract.id,
user: event.args.user,
emitter: event.args.emitter,
amount: event.args.amount,
txHash: event.log.transactionHash,
timestamp: event.block.timestamp,
});
// 更新分布式金额的当前活动统计
await safeIncreaseCampaignsStats({
productId: bankingContract.productId,
context,
blockNumber: event.block.number,
increments: {
totalRewards: event.args.amount,
},
});
});
4.1 Frak 的实际索引
我们不是在谈论玩具合约。我们在索引:
- 8 个主合约
- 3 个活动工厂合约
- 在 Arbitrum 上(你好,短块时间 👋)
- 复杂的营销活动跟踪
- 实时统计数据生成
4.2 为什么 Ponder 拥有了我们的心
闪电般的索引速度
- 重新索引不需要喝咖啡休息
- 内部缓存使更新感觉即时
- 直接的 PostgreSQL 集成,只需工作
真实世界的性能
- 处理复杂的链上营销活动
- 实时统计数据生成
- 与 Web2 后端共享数据库(再见,不必要的数据传输)
不会让人讨厌的开发者体验
- TypeScript 一路到底
- 通过 Hono 提供内置 HTTP 服务器
- 包含缓存和速率限制
5、部署:因为 YOLO 到生产是 2017 年的事了
SST v3 以完美的执行闪贷的优雅方式协调了我们的整个部署:

5.1 代码即基础设施的优势
- 无接触部署
- 版本控制的基础设施
- 易于环境复制
- Pulumi 在后台(因为当我们最终迁移到 k8s 时,我们不需要治疗)
5.2 一路开源
我们堆栈中的每个工具都是开源且积极维护的:
想看看它们是如何结合在一起的吗?查看我们的 区块链基础设施仓库 以获得完整画面。
5.3 像个高手一样启动,像熊市一样花费
启动你的区块链基础设施而不需要 A 轮融资的秘密武器:明智地使用免费层级和高效的架构。把它想象成收益耕作云凭证和 RPC 调用。
6、从零到一的基础设施堆栈
云基础 🌩️
- AWS 免费套餐 = 12 个月的免费 t2.micro 实例
- GCP = $300 初始信用额度
- 选择你喜欢的,两者都与我们的堆栈兼容
RPC 策略 🔌
.addProject({
id: "bootstrap-rpc",
upstreams: [
// 免费 RPC,战略性负载平衡
llamaNodes, // 25k 请求/天
publicNodes, // 可变限制
ankr.free, // 20k 请求/天
// 随着增长添加更多
]
})
索引与 API 📊
- 自托管 Ponder = $0(在你的免费套餐实例上运行)
- PostgreSQL = 云提供商上的免费套餐
- Hono 端点 = 与 Ponder 一起免费提供
6.1 MVP 成本分解
- 基础设施:$0(云信用)
- RPC 调用:$0(负载平衡的免费套餐)
- 索引:$0(自托管)
- 你的时间:最少(感谢这些工具)
6.2 当你准备好扩展时 📈
达到免费套餐限制?恭喜,你有了牵引力!当你准备好从耕作免费 RPC 中毕业时,查看 eRPC 的 聚合服务。它是一个统一的端点,适用于所有链,具有预先协商的供应商费率。如果基础设施管理不是你的强项,他们甚至会为你托管 eRPC 实例。
7、结果
这种设置使我们能够:
- 从精益开始(你的风投会感谢你)
- 随着用户基数的增长平稳扩展
- 保持高可靠性
- 保持基础设施复杂性可控
- 实时处理复杂的链上营销活动
8、接下来是什么?
虽然我们目前的设置很稳固,但我们正在探索:
- 为更多的部署灵活性迁移至 Kubernetes
- 为成本优化寻找本地解决方案
- 进一步优化 RPC 使用模式
9、结论
构建区块链基础设施不必感觉像盲眼解决魔方。有了 开源工具 如 eRPC、Ponder 和 SST,你可以构建一个 稳健、可扩展的系统,随着你的需求增长。
在 Frak,这个基础设施支持一个正在革新品牌倡导的平台:
- 实时奖励分发 用于真实的分享
- 透明、成本效益高 的客户获取
- 品牌到倡导者的直接价值流
- 可扩展的口碑营销自动化
最好的基础设施就像一个好的智能合约——它只是工作,只有在出问题时你才会注意到它。而当 87% 的人 在购买前阅读评论,79% 的人 信任客户评论如同朋友的推荐,你真的不能承受出错。
原文链接:Building Cost-Effective Blockchain Infrastructure: A Journey with eRPC and Ponder
DefiPlot翻译整理,转载请标明出处
免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。