手册
通过扫描totalSupply发现列表 (Totalsupply)
getListings 读取 NFT TotalSupply 并对每个 tokenId 进行多次 RPC 调用。 N×call 不可扩展;产生 30 秒的民意调查陈旧列表和 Infura 速率限制。
类似 OpenSea 的市场 UI
部分 2 的 3
Bare Crypto 市场 SPA:类似 OpenSea 的信息架构(主页、市场、查看器、个人资料、铸币形式)、通过扫描 TotalSupply 列出发现、与 Rinkeby Infura 和主网铸币客户共享的实用程序分离 — ADR、速率限制和 30 秒的民意调查陈旧列表失败。
如果没有索引器,则每次刷新都是链式扫描
Bare Crypto 市场客户端使用 totalSupply() + tokenId 循环查找开放列表,而不是使用事件索引或子图。每一步都会进行其他调用,例如 wasNftSold、isListingOpenByTokenId 和 getLastListingByTokenId。随着供应量的增加,成本呈线性增长——事实上,情况更糟;储备容器每约 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
您自己的系统清单
getListings轮中每个代币有多少 eth_calls?- 当供应量增加 10 倍时,每次投票的成本是多少?
- 发生速率限制时,UI 会陷入什么空/不正确状态?
- 购买后烤架可以保持多少秒不新鲜?
- 哪些事件被索引并且消除了扫描?
本节中需要记住的事情
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 错误使得错误的列表成为一个特性。
继续阅读
继续阅读
系列中的下一个
Rinkeby 测试网和主网客户端分离
Collection Mint 客户强化到主网,而 Marketplace SPA 锁定 Rinkeby Infura。具有共享 web3/IPFS 实用程序的网络特定配置...
系列中的下一个
类似 OpenSea 的信息架构
Bare Crypto 市场 SPA 建立了一个信息架构,该架构清楚地将 OpenSea 复制为产品参考:主页、市场、查看器、个人资料和铸币表单。
相关文章
BareNFTReserve:托管、RandomBuy 和弱 RNG
仅限所有者 createNewListing、buy 和 randomBuy — keccak256(revealNonce, block.difficulty, msg.sender) % 3. 所有者运营的市场 ADR 和紧急转移。