手册

通过扫描totalSupply发现列表 (Totalsupply)

getListings 读取 NFT TotalSupply 并对每个 tokenId 进行多次 RPC 调用。 N×call 不可扩展;产生 30 秒的民意调查陈旧列表和 Infura 速率限制。

类似 OpenSea 的市场 UI

部分 2 的 3

Bare Crypto 市场 SPA:类似 OpenSea 的信息架构(主页、市场、查看器、个人资料、铸币形式)、通过扫描 TotalSupply 列出发现、与 Rinkeby Infura 和主网铸币客户共享的实用程序分离 — ADR、速率限制和 30 秒的民意调查陈旧列表失败。

OpenSea-like marketplace UI architecture diagram

如果没有索引器,则每次刷新都是链式扫描

Bare Crypto 市场客户端使用 totalSupply() + tokenId 循环查找开放列表,而不是使用事件索引或子图。每一步都会进行其他调用,例如 wasNftSoldisListingOpenByTokenIdgetLastListingByTokenId。随着供应量的增加,成本呈线性增长——事实上,情况更糟;储备容器每约 30 秒重复一次此操作。```text getListings(sold=false) maxToken ← NFT.totalSupply() for tokenId = maxToken … 1: wasSold? open? isListing? → maybe getListingInfo(tokenId) ↓ N tokens × M RPC calls / poll poll every ~30s (Reserve / Profile) ↓ Infura rate-limit → empty / stale grid


## 第一次提到的概念```text
📦 totalSupply Taraması
Listing kümesini, arz üst sınırından geriye tokenId döngüsüyle keşfetmek.

📦 N×RPC
Her token için birden fazla eth_call; poll ile çarpılınca kota tüketimi.

📦 Stale Listing
Satılmış veya iptal edilmiş ilanın UI'da hâlâ açık görünmesi; poll gecikmesi veya kısmi hata.

📦 Infura Rate Limit
Projeye bağlı istek kotası; aşılınca çağrılar başarısız olur veya yavaşlar.
```在小型 Rinkeby 集合上运行的循环不是主网规模的产品功能。

## 算法真相

`getListings` 首先读取 `getTokenSupply()` 到 `totalSupply`,然后从 `maxToken` 下降到 1。对于每个代币,都有出售/打开/上市检查,如有必要,还有 `getListingInfo`。即使是空的令牌范围也会燃烧 RPC。```text
Cost model (approx)
  cost ≈ totalSupply × calls_per_token × polls_per_minute
  UI cards may add metadata/IPFS reads on top
```## 30 秒的民意调查和陈旧的 UI

在保留容器挂载上运行 `getListings` 并迭代 `setInterval(..., 30000)`。与个人资料类似,它会在大约 30 秒内扫描所有物品;查看器和卡片使用 10-15 秒的间隔。当用户看到购买时,网格可能会因投票而保持陈旧状态,或者由于速率限制而为空。

## Infura 故障模式

整个扫描都会发送到读取节点 (Rinkeby Infura HTTP/WSS)。当达到配额时,部分 try/catch 路径可能会返回 `wasSold=false` 或空字符串;网格悄然变得虚假。将密钥埋在存储库中会加剧问题——项目 ID 从未写在文档中; env + 路由限制是 ADR 的一部分。```text
ADR: Listing discovery
  Accepted (prototype): scan totalSupply client-side
  Rejected (then): subgraph / event indexer
  Consequence: rate limits, stale polls, O(supply) cost
  Follow-up: index Transfer/Listing events; paginate
```## OpenSea 差异

OpenSea 客户端不会扫描每个访问者浏览器的全部内容;有索引+API。 Bare Crypto 复制 IA 中的产品参考,而不是发现基础设施——这是一个有意的(或至少是事后看来)的权衡。

## 本期最令人困惑的对决```text
❌ totalSupply taraması = üretim keşif stratejisi
✓ Prototip; indexer yokluğunun semptomu

❌ 30s poll gerçek zamanlı piyasadır
✓ Poll, stale listing ve kota riskidir

❌ try/catch ile yutulan RPC hatası = güvenli UI
✓ Sessiz yanlış listing daha tehlikelidir

❌ Infura anahtarını client bundle'a gömmek pratiktir
✓ Sızıntı + ortak kota; env ve proxy düşünün

您自己的系统清单

  1. getListings 轮中每个代币有多少 eth_calls?
  2. 当供应量增加 10 倍时,每次投票的成本是多少?
  3. 发生速率限制时,UI 会陷入什么空/不正确状态?
  4. 购买后烤架可以保持多少秒不新鲜?
  5. 哪些事件被索引并且消除了扫描?

本节中需要记住的事情

1、Listing发现是totalSupply扫描;它不是 OpenSea 索引。 2. N×RPC × 30s 的投票使得 Infura 配额和陈旧的 UI 不可避免。 3. ADR:原型接受、索引器跟踪——不会悄无声息地扩展。

询问每个 tokenId,而不是市场;这是一个负载测试。

FAQ

Frequently asked questions

什么是总供应扫描?

通过从供应上限向后循环 tokenId 来探索列表集。

什么是N×RPC?

每个令牌有多个 eth_calls;配额消耗乘以轮询。

“总供应扫描=生产发现策略”是否正确?

原型;索引器缺失的症状

本节修复了什么?

本节详细介绍了类似 OpenSea 的网格背后的发现算法以及为什么它是 ADR 主题。 Bare Crypto 市场客户端使用 `totalSupply()` + tokenId 循环查找开放列表,而不是使用事件索引或子图。每一步都会进行其他调用,例如 `wasNftSold`、`isListingOpenByTokenId` 和 `getLastListingByTokenId`。随着供应量的增加,成本呈线性增长——事实上,情况更糟;储备容器每约 30 秒重复一次此操作。

学到的工程原理

  • 发现成本必须对供应方可见;它不是一个伪装的 O(N) 产品。
  • 轮询间隔不是 SLA;它是与stale和quota一起设计的。
  • 吞下 RPC 错误使得错误的列表成为一个特性。

继续阅读

继续阅读

系列中的下一个

系列中的下一个

随笔

类似 OpenSea 的信息架构

Bare Crypto 市场 SPA 建立了一个信息架构,该架构清楚地将 OpenSea 复制为产品参考:主页、市场、查看器、个人资料和铸币表单。

相关文章

Paylaş