# Portaldot 黑客小屋 2026 | Portal Meter：在 Portaldot V3 上按次付费使用任何 API

**URL:** <https://portaldot.discourse.group/t/topic/190>\
**Category:** Hackathon\
**Created:** [2026 年11 月 8 日 00:11 UTC](https://portaldot.discourse.group/t/topic/190 "2026-11-08T00:11:07Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

作者： ![swiftbotlabs](https://avatars.discourse-cdn.com/v4/letter/s/9de0a6/32.png) [@swiftbotlabs](https://portaldot.discourse.group/u/swiftbotlabs)\
发布日期： [2026 年11 月 8 日 00:11 UTC](https://portaldot.discourse.group/t/topic/190/1 "2026-11-08T00:11:07Z")

</div>

赛道：模块化云与中间件

## 项目简介

**Portal Meter** 允许任何 API 在 Portaldot V3 上按调用计费。调用方只需开启一次预付费会话，随后通过 HTTP 使用签名的凭证为每个请求付费：无需逐次进行链上交易。卖方在单笔以太坊交易中结算多个请求，该交易通过 Solidity (pallet-revive) 转移资金，并在 ink! (pallet-contracts) 中写入公共记录，两者要么全部成功，要么全部失败。包含一个 MIT 协议的软件包和一个托管卖方。

**无需钱包即可试用：** 打开实时演示页面 [Portal Meter · live on Portaldot V3 testnet](https://portal-meter.swiftbotlab.workers.dev/demo/) 并点击 **“购买一个请求”** 。您将收到 HTTP 402 响应及 0.01 pUSD 的报价，浏览器将生成签名凭证，随后通过 HTTP 200 获取数据。然后点击 **“重放会话日志以验证链上数据”** 。

## 解决的问题

在此链上为每个请求进行链上支付行不通。我们使用自己的密钥进行了实测：单次付费请求永久锁定了 **7.53 tPOT** 的存储押金（区块 276657 至 276660），远超单次一分钱的调用价值。因此我们构建了预付费会话。一个包含 100 个请求的会话总共锁定了 **7.6 tPOT** ，并通过单笔交易结算（区块 282559）。测试代币没有实际价值，但比例关系才是关键。

**成本如何扩展** （tPOT，包括存储押金加交易费用；“实测” = 从链上读取，其余数据根据这些测量值计算得出）：

| 请求数 | 托管模式：交易数 | 托管模式：tPOT | 会话模式：交易数 | 会话模式：tPOT | 会话模式：单请求成本 |
| --- | --- | --- | --- | --- | --- |
| 1 | 2 | 7.53 (实测) | 3 | 7.56 | 7.56 |
| 10 | 20 | 75.3 | 3 | 7.56 | 0.76 |
| 100 | 200 | 753 | 3 | 7.56 (实测) | 0.076 |
| 1,000 | 2,000 | 7,530 | 3 | 7.56 | 0.0076 |

一个会话消耗 3 笔交易：开启、一次结算批次、关闭。该批次仅兑换最新的凭证，因此其成本不会随请求数量的增加而增长。根据链上数据：开启时锁定 11.52 tPOT（区块 282490），关闭时返还 7.68 tPOT（区块 297818），每个批次会为每个会话写入一个 3.63 tPOT 的 ink! 锚点；每步费用为 0.01 至 0.05。 **每个额外批次增加约 3.68 tPOT** ，因此通过 4 个批次结算的 1,000 个请求总成本为 18.6 tPOT（每个请求 0.019）。卖方选择批处理规则：我们的规则是当有 25 个请求等待或距离最后一个请求过去 6 小时时进行结算，且每隔至少 30 分钟结算一次。对于单个请求，托管模式与开启会话的成本相当；从第二个请求开始，会话模式更具优势。原始数据：[https://portal-meter.swiftbotlab.workers.dev/deployments/proof/session-measure.json](https://portal-meter.swiftbotlab.workers.dev/deployments/proof/session-measure.json)

## 链接

实时网页 / 演示视频（二选一）：实时页面 [Portal Meter · live on Portaldot V3 testnet](https://portal-meter.swiftbotlab.workers.dev/demo/) 和 2:23 视频 [https://youtu.be/sgGdQ-WLum0](https://youtu.be/sgGdQ-WLum0)  
GitHub: [GitHub - swiftbotlabs/portal-meter: Pay-per-request metering on Portaldot, settled on-chain. · GitHub](https://github.com/swiftbotlabs/portal-meter)  
推介幻灯片: [https://portal-meter.swiftbotlab.workers.dev/pitch/portal-meter-deck.pdf](https://portal-meter.swiftbotlab.workers.dev/pitch/portal-meter-deck.pdf)  
DoraHacks BUIDL: [Portal Meter | Buidls | DoraHacks](https://dorahacks.io/buidl/50757)  
包含 137 个请求的批次，在一次外部调用中涵盖两个 VM：[Portaldot Blcok Explorer](https://scanner-testnet-v3.portaldot.dev/#/blocks/282559?tab=events)

**通过终端验证，无需密钥，只需一条命令** （重放真实会话的日志，对照 `Redeemed` 事件和 ink! 锚点进行验证并打印 ACCEPT；在空的 npm 缓存下大约需要 90 秒，大部分时间用于安装）：

```auto
npx -y --package=https://portal-meter.swiftbotlab.workers.dev/source/portal-meter-0.1.0.tgz portal-meter session-verify https://portal-meter.swiftbotlab.workers.dev --id 0xbf59f966153d082007c9a1b36c6361dc1365adc1522c71badc1c6d0f7f1778ab --provider 0xE13A4d566A1f6492C1511EF100DC0417ccE18E59 --endpoint 3

```

或者自己查看价格：`curl -i https://portal-meter.swiftbotlab.workers.dev/v1/asset/7777` 会返回带有价格报价的 HTTP 402 响应。

## 技术亮点

1. **单笔以太坊交易可结算跨两个 VM 的多个会话。** 它调用运行时模块地址并执行 `utility.batchAll([revive.call(redeem), contracts.call(record), ...])`。区块 282559 以此方式结算了来自 3 个会话的 137 个请求。
2. **批次数据依据的是买方的签名，而非卖方的承诺。** 每个凭证都指向前一个响应（`head[n] = keccak256(head[n-1], request[n], response[n-1])`），因此经过编辑、裁剪或重排序的日志无法匹配付款人签名的头部数据。
3. **原生资产作为 ERC-20。** 通过 pallet-assets 预编译合约使用 pUSD（资产 ID 7777）进行支付。
4. **合约拒绝作弊行为。** 对于 22 个无效凭证和试运行，实时卖方和合约拒绝了全部 22 个；在托管路径上，14 个中有 14 个被拒绝（`node scripts/negative-checks-sessions.mjs`，无需密钥）。
5. **源代码与链上代码一致。** ByteMatch（另一个 Hacker House 团队的验证工具）显示我们部署的所有 3 个 Solidity 合约均为逐字节匹配。

合约：MeterSession `0xCc2aBc8AC1B5676e8f9678bb5B6881A0b743B3d5`, MeterSettlement `0x9E7Ad2Aa754A0EBA70CFbd1db01d25ef97e5781e`, MeterRegistry (ink!) `5DHgN8JZRpyo9mDaG1BSNh224AZXcQw8p3Y8GZK1K2Vd8Ku4`。

## 团队

Swift Bot Labs，一家构建支付工具的小型工作室。  
GitHub: swiftbotlabs  
Email: [swiftbotlabs@gmail.com](mailto:swiftbotlabs@gmail.com)

## 评审与投票契合度

**致评审员：** 每个声明都有区块号佐证。在实时页面购买一次调用，用一条命令对照两个 VM 重放该调用，并从链上读取 1 至 1,000 个请求的成本。

**四项标准：**

- **技术可行性。** 三个合约在 V3 测试网上线。123 个测试：42 个 Solidity（单元、模糊、不变量），8 个 ink!，73 个 Node。托管卖方已通过 8 笔交易结算了 257 个请求（`/health` 端点显示的实时计数），且其 cron 任务无需我们干预即可完成结算（区块 282470）。自 11 月 1 日以来有超过 60 次提交。
- **创新性。** 资金在 Solidity 中流转，记录在 ink! 中保存，两者在单笔以太坊交易中原子性完成：单 VM 链需要桥接或第二笔交易。该设计是由 Portaldot 的实测成本（存储押金）驱动的，而非照搬其他链。
- **生态贡献。** 任何 Portaldot API 只需几行代码即可在 Node.js、Cloudflare Workers、Bun 或 Deno 上实现按调用计费，且只需一条命令即可在两个 VM 上注册端点。我们通过仅使用该软件包的公共 API 构建了第二个卖方来证明其可复用性（端点 4，由其自己的报警在区块 327272 中结算）。我们还发布了我们的 Portaldot V3 笔记和一个无需 polkadot.js 的 SCALE 编码器。
- **商业潜力。** 用户：Portaldot 上的数据和 API 提供商（索引器、RPC、分析、AI 工具端点）以及调用它们的 App 和 Agent。谁付什么费：调用方支付 API 的单请求价格（此处为 0.01 pUSD）和会话押金，其中三分之二在关闭时返还；提供商支付每批次的锚点押金和费用。费用模式（计划中，未包含在测试网合约中）：在结算时收取少量协议费用，包含在提供商已发送的批次中，此外为不想自行运行的提供商提供托管卖方作为付费服务。

**质疑回应：**

- **尚无外部用户？** 属实。257 个已结算请求来自我们自己的密钥、我们的示例以及按下演示按钮的访客，该演示使用一个共享测试密钥。没有外部提供商，没有收入，主网上没有任何内容。我们的计划是：在评审期间，我们将免费将 Portal Meter 接入另一个团队的公共 API。如果您在运行一个，请在此回复。
- **为什么有两个端点指向 127.0.0.1？** 端点 1 和 2 是由我们针对自己机器上的卖方进行托管测试时列出的（区块 276612 和 276613）。更改它们需要新的链上交易，而代码冻结规则禁止这样做。实时页面现已将它们标记为“本地测试端点，不可访问”。公共卖方是端点 3 和 4。
- **每个请求 2 次还是 0 次交易？** 这是同一表格中的两列：托管模式每个请求需要 2 次交易（支付、结算），会话模式每个请求无需交易，每个会话共需 3 次。页面现在通过单独的行显示这一点，上面的表格展示了扩展方式。
- **0 次确认却有 100% 评分？** ink! 评分公式为 (已服务 − 争议) / (已服务 + 退款)（`meter_registry/lib.rs` 中的 `reputation`），因此在任何付款人评分之前，提供商自己的已服务计数就显示为 100%。页面现在显示“—，尚无确认”，直到付款人进行确认。只有端点 1 有一个确认（区块 276665）。
- **它展示了其他项目没有展示的内容？** 不是更多的测试：有些竞争对手的测试更多。而是在没有钱包的情况下，您在浏览器中自己进行的付费调用，通过 Solidity 和 ink! 在单笔交易中结算，您可以使用一条命令对照两个 VM 重放该交易。

上述页面修复（11 月 7 日）仅更改显示：不涉及任何合约、卖方或链上更改。

**致社区投票者：** 打开实时页面，按下“购买一个请求”，无需钱包、无需逐次交易即可获得真实数据。这就是 Portaldot 上的 App 和 AI Agent 支付 API 费用的方式。

---

<div class="post-metadata">

作者： ![ympangbill](https://avatars.discourse-cdn.com/v4/letter/y/779978/32.png) [@ympangbill](https://portaldot.discourse.group/u/ympangbill)\
发布日期： [2026 年11 月 10 日 02:01 UTC](https://portaldot.discourse.group/t/topic/190/2 "2026-11-10T02:01:28Z")

</div>

技术已经实现，但创新仍需进一步提升。预计社区贡献将有所改善，商业潜力也需进一步挖掘。评分：75

---

<div class="post-metadata">

作者： ![swiftbotlabs](https://avatars.discourse-cdn.com/v4/letter/s/9de0a6/32.png) [@swiftbotlabs](https://portaldot.discourse.group/u/swiftbotlabs)\
发布日期： [2026 年11 月 10 日 02:13 UTC](https://portaldot.discourse.group/t/topic/190/3 "2026-11-10T02:13:36Z")

</div>

谢谢您的评审和打分！简单回应三点：

1. 创新：Portal Meter 把 HTTP 402 按次付费带到 Portaldot V3。调用方只预付一次会话，之后每个请求只签一个凭证，不需要每次上链；卖方用一笔以太坊交易批量结算，资金在 Solidity（pallet-revive）中转移，公开记录写入 ink!（pallet-contracts），两者在同一笔交易中要么全部成功、要么全部失败。
2. 社区：MIT 开源包加一个托管的卖方示例，任何 API 都能接入；在线页面不需要钱包就能试用。欢迎在本帖提问或提出改进建议。
3. 商业：数据、AI 和 RPC 接口可以按调用收费，不需要 API key 或订阅；一次结算分摊到很多请求上，所以小额调用也划算。

Thanks for the review! In short: one prepaid session, then one signed voucher per request (no transaction per call), and many requests settle in one transaction across pallet-revive and pallet-contracts, all or nothing. MIT package, try it with no wallet. Questions and suggestions are welcome here.

---

<div class="post-metadata">

作者： ![Jungle](https://avatars.discourse-cdn.com/v4/letter/j/df788c/32.png) [@Jungle](https://portaldot.discourse.group/u/Jungle)\
发布日期： [2026 年11 月 10 日 04:31 UTC](https://portaldot.discourse.group/t/topic/190/4 "2026-11-10T04:31:45Z")

</div>

**Portal Meter (75)**

Portal Meter is an API payment tool project with relatively high completeness and good practical value. Through real measurement it discovered Portaldot’s storage cost problem, and implements prepaid sessions and cross-VM batch settlement. Its verifiability and the completeness of its materials are also good.

In a hackathon its completeness as an infrastructure payment tool is at an above-average level.

---

<div class="post-metadata">

作者： ![swiftbotlabs](https://avatars.discourse-cdn.com/v4/letter/s/9de0a6/32.png) [@swiftbotlabs](https://portaldot.discourse.group/u/swiftbotlabs)\
发布日期： [2026 年11 月 10 日 04:44 UTC](https://portaldot.discourse.group/t/topic/190/5 "2026-11-10T04:44:08Z")

</div>

Thank you for the careful review! Glad the storage-cost measurement was useful: that number is why Portal Meter settles many requests in one transaction instead of writing one record per call. Every claim in the post links to its transaction or source, so anyone can re-check it. 谢谢您的认真评审！
