在SafeW中,如何为无服务器函数启用API密钥,使其能够实现按请求进行速率限制?

功能定位:在 SafeW 中实现“按请求限频”的目的是什么?
无服务器 的“弹性”常被误用成“无上限”。当函数被前端、小程序或第三方同时调用,瞬时并发可能把月度免费额度秒光,甚至触发链上防火墙的异常告警。SafeW 在 2026-02 版推出的“API 密钥级限频”把频率控制下放到单密钥维度,让同一条函数可以面向不同调用方提供差异化配额,既防滥用也避免“一刀切”误伤正常用户。
相较于云服务商的“函数级别限流”,SafeW 的方案能够将密钥、链上身份及税率模块进行统一绑定,特别适用于需要同时处理“用户是谁、使用量多少、是否需要征税”等问题的 Web3 应用场景。然而,这种方案的弊端在于增加了密钥签发的环节,并且其频率限制窗口固定为 1 秒的粒度,无法像 AWS API Gateway 那样实现毫秒级的自定义精度。
准备工作及相关人员列表
1. 钱包所有者:需持有 SafeWallet v6.4.2 及以上版本,已开启“链上防火墙”开关(设置→安全→链上防火墙→启用)。
2. 函数部署者:已在 SafeW 控制台创建 无服务器 函数,且函数运行时选择“Node.js 20.x”或“Python 3.11”,旧运行时暂不支持密钥注入。
3. 调用方:至少一个外部系统,能携带 HTTP Header x-api-key 认证密钥 请打开函数链接进行访问。
决策树:限频策略应优先选择“函数级”还是“密钥级”?
提示如果你的函数仅面向单一前端且域名固定,直接采用云服务商提供的函数级别限流功能即可;只有当同一个函数需要分别为“白名单DApp”、“社区机器人”和“空投脚本”这三类对象分配不同配额时,才建议启用SafeW密钥级别的管控方案。
通过桌面端操作控制台,路径最短
- 登录 safew.com 控制台 请将左上角的网络切换至您需要使用的 EVM 链,例如 Arbitrum。
- 侧边栏选择 无服务器→函数管理,请单击目标函数的名称,即可跳转至详情页面。
- 顶部标签切换到 API 密钥 → 右侧蓝色按钮 新建密钥。
- 在弹窗里填写“调用方名称”“QPS 上限”(整数,≤100)、“日累计上限”(0=不限制)、“是否计入空投税”(默认关)。
- 点击 生成并签名届时,桌面端会启动SafeWallet插件,要求您在一笔“添加访问凭证”的链上交易上进行确认;确认完成大约10秒后,页面将自动刷新,您便能看到密钥的明文形式(此明文仅展示一次)。
针对移动端,操作路径有所不同:App 本身无法直接签发密钥,需要通过“扫描二维码,然后通过插件进行签名,最后返回 App”的流程来完成;如果您的 iOS 版本低于 19.4,并且在 NFC 签名时遇到问题,可以暂时关闭 NFC 功能,转而使用 USB-C 有线连接进行签名。
在函数执行期间注入密钥
SafeW 启动时,会将密钥白名单加载到环境变量中。 SAFEW_API_KEYS,格式为 JSON 数组。示例代码(Node.js):
const allowList = JSON.parse(process.env.SAFEW_API_KEYS || '[]');
const clientKey = req.headers['x-api-key 认证密钥'];
if (!allowList.includes(clientKey)) {
return res.status(401).json({error: 'Invalid key'});
}
频率限制的逻辑已由 SafeW 边缘网关集中管理。因此,函数内部只需验证密钥是否存在即可,无需额外编写计数器,这样可以缩短函数的冷启动时间。
验证限频是否生效
1. 用 curl 连续发送 120 次请求,QPS 设为 100,期望最后 20 次返回 429。
2. 观察响应头 x-safew-rate-limit此处将显示剩余的配额以及重置的倒计时。
3. 若日累计上限非 0,可在次日凌晨 00:00 UTC 后看到计数器归零(经验性观察:实际重置时间可能前后漂移 30 秒)。
常见的错误处理路径及回退机制
- 当 Arbitrum 网络出现拥堵导致链上交易长时间处于待处理状态时,可以尝试将 Gas 价格上调 10% 后重新签名。如果交易在 5 分钟内仍未成功上链,控制台会弹出“创建失败”的提示。此时,您可以放弃当前的密钥 ID,重新执行操作流程,此过程不会产生任何费用。
- 如果意外将测试密钥泄露至生产环境,可立刻在控制台执行“停用”操作。此操作不收取任何费用且立即生效。一旦密钥字符串被泄露,将无法重新激活,只能重新创建新的密钥。
- 关于空投税模块的误扣问题:如果一个密钥被设置为“计入空投税”,但实际操作者是内部机器人,您可以在“设置”>“空投税”>“白名单地址”中添加该机器人的地址。系统将在次日 03:00 UTC 自动将税款退还。
在与第三方机器人协作时,遵循最小权限原则
经验性观察:社区最常见的是把“第三方归档机器人”加入通知频道,同时让它调用函数写库。此时应单独给机器人签发“QPS=1、日累计=1000”的只读密钥,并在函数内把机器人地址写死在 访问请求的头部信息中的 'x-forwarded-for' 字段 这一层用于验证,以防密钥一旦被转售便被不当使用。
不适用场景清单
| 场景特征 | 原因 |
|---|---|
| 要求实现毫秒级的突发情况精确控制。 | SafeW 窗口会锁定一秒,时间精度最高只能达到毫秒级别,无法精确到 10 毫秒。 |
| 此功能适用于函数运行时版本低于 6.4 的情况。 | 在旧的运行时环境中,环境变量无法被注入,因此需要进行整体迁移。 |
| 提供无需身份验证的完全匿名API接口 | 密钥级限频必须携带 x-api-key 认证密钥,与匿名矛盾 |
五个最佳实践要点速览
- 同一业务线共享同一密钥,以便实现每日累计并统一进行税款扣除。
- 初期为每秒查询次数(QPS)预留 20% 的冗余量,并在上线运行 24 小时后进行评估。
x-safew-rate-limit峰值再收紧。 - 在密钥名称后添加“日期+业务”的后缀,便于在 30 天后进行轮换式回收。
- 请勿将密钥硬编码为前端常量,应通过后端进行转发处理,以规避跨域资源共享(CORS)带来的安全风险。
- 每次大型促销活动开始前的24小时,需要创建临时的密钥;一旦促销活动结束,应立即停用这些密钥,以避免日后遗忘。
常见问题解答(结构化数据格式)
如果密钥不慎丢失,还有办法找回来吗?
不行。SafeW 仅在生成时会显示一次明文,一旦丢失,只能禁用旧密钥并创建一个新的。
每日累计上限是根据请求次数还是调用费用来统计的?
此处统计的是 HTTP 请求的数量,与链上的 gas 费用没有任何关系。
QPS 是否支持运行时调整?
当前需要先禁用旧密钥并创建新密钥,热更新功能暂时无法支持。
总结与展望:关于接下来的行动,我们提出以下建议。
如果你已经走到这里,建议立刻在测试函数上新建一条“QPS=5、日累计=100”的密钥,用 curl 跑一轮 200 次请求,亲眼看一次 429 响应——这比任何文档都直观。验证通过后,再把生产密钥换上,并给团队共享一份“密钥滚动日历”,30 天回收一次,既安全也不给未来自己埋坑。