Chainspect 是一个区块链基础指标追踪器,无需付费即可发布众多网络的实时 TPS、出块时间、最终性、交易量、收入和去中心化指标。本文解释这些数字背后的思维模型,然后展示如何针对任意 RPC 端点自行复现核心测量,以便验证仪表盘上的声明或构建自己的内部对比。内容涵盖实时 TPS 与峰值 TPS 的区别、为什么出块时间不等于最终性、如何从区块数据统计交易数,以及如何校验去中心化输入。你在仪表盘上看到的每一个数字都应能追溯到一个可重新运行的查询。
区块链基础指标追踪器实际测量的是什么
像 Chainspect 这样的基础指标追踪器汇总的是可从节点观测到的技术信号:链当前正在处理多少笔交易、出块需要多长时间、交易多久后不可逆转、链产生多少手续费收入,以及验证者或质押权力的集中程度。其价值不在于任何单一数字,而在于能够用一致的定义跨网络比较同一指标。
重要的编辑立场是:这些仪表盘是描述性的,而非规定性的。高实时 TPS 数字告诉你链在这一分钟在做什么;它不会告诉你链在对抗性负载下能维持什么,也不会告诉你这些交易是否具有经济意义。把每个仪表盘数字都当作一个可以用你自己的 RPC 调用检验的假设。
- 吞吐量:每秒交易数,包括实时和记录峰值。
- 延迟:出块时间和最终性时间,这是两回事。
- 经济:支付的手续费、链上收入和价值指标。
- 去中心化:验证者数量、质押分布、中本聪系数。
- 活性:区块是否仍按预期节奏产出。
测量前的先决条件和假设
你需要每条要比较的链的 RPC 端点,最好能暴露标准 JSON-RPC 方法,如 eth_blockNumber、eth_getBlockByNumber 和 eth_getBlockReceipts。对于非 EVM 链,方法名不同,但模式相同:获取最近区块、统计交易数并记录时间戳。如果你还没有端点,多链 RPC 端点指南 说明了如何组织访问,你可以在 RPC 定价页面 比较套餐。
假设你的端点可能在略微不同步的节点之间做负载均衡。对于几十个区块窗口的吞吐量测量这没问题,但会扭曲单区块延迟测量。对于最终性敏感的工作,固定到一个节点或使用专用节点,以免在测量中途悄悄切换后端。
最后,提前确定你的窗口。60 秒窗口噪声大;7 天窗口能平滑突发但会掩盖峰值行为。如果你想对链的性能保持诚实,就同时发布两者。
思维模型:吞吐量、出块时间和最终性是三个不同的时钟
吞吐量是一个速率:交易数除以经过的挂钟时间。出块时间是一个节奏:区块时间戳之间的间隔。最终性是一个保证:在此之后,交易在协议假设下无法被回滚。这三个时钟独立运行。一条链可以每 400 毫秒出一个块,但仍需 12 秒才能最终确定;另一条链可以即时最终确定,但每秒处理的交易非常少。
这就是仪表盘将实时 TPS 与记录最大 TPS 分开的原因。实时 TPS 是实际包含交易的滚动平均值。记录最大 TPS 是在某个窗口内观察到的最高持续速率,这是历史事实而非容量保证。两者都不等于白皮书中的理论 TPS,后者通常是理想条件下的基准,应如此标注。
对于最终性,诚实的测量是包含你交易的区块与协议宣布其不可逆的区块之间的差距。在概率最终性链上,这个差距是一个置信阈值,而非硬边界,因此任何单一数字都是你必须说明的约定。
可运行流程:从原始区块测量实时 TPS
最简单的可复现 TPS 测量获取最近 N 个区块,汇总其交易数,再除以最新与最旧区块之间的时间戳差。下面的脚本使用占位符 RPC_URL,适用于任何 EVM 兼容链。在一天中多次运行以观察方差。
注意,在大多数 EVM 链上,区块头中的交易数包含失败的交易。如果你想要成功交易的 TPS,必须获取收据,这更慢但对经济比较更准确。
import json, urllib.request, time
RPC_URL = "RPC_URL"
WINDOW = 50 # blocks to sample
def rpc(method, params):
req = urllib.request.Request(
RPC_URL,
data=json.dumps({"jsonrpc":"2.0","id":1,"method":method,"params":params}).encode(),
headers={"Content-Type":"application/json"},
)
with urllib.request.urlopen(req, timeout=15) as r:
return json.load(r)["result"]
head = int(rpc("eth_blockNumber", []), 16)
blocks = []
for n in range(head - WINDOW + 1, head + 1):
b = rpc("eth_getBlockByNumber", [hex(n), False])
blocks.append((int(b["timestamp"], 16), len(b["transactions"])))
elapsed = blocks[-1][0] - blocks[0][0]
tx_total = sum(c for _, c in blocks[1:])
tps = tx_total / elapsed if elapsed else 0
print(f"blocks={WINDOW} elapsed={elapsed}s txs={tx_total} tps={tps:.2f}")可运行流程:出块时间和最终性校验
出块时间是你的窗口内连续区块时间戳之间的平均间隔。它容易计算也容易误读:出块可变的链可能显示稳定的平均值,而个别间隔很长。在报告平均值的同时报告中位数和最大间隔,以便读者看到尾部情况。
对于最终性,可移植的检查是提交一笔交易并轮询,直到包含它的区块达到或低于链的最终确定头。下面的代码片段假设端点暴露了 finalized 区块标签;在链的原生最终性方法不同时替换它。
async function finalityProbe(rpcUrl, txHash) {
const call = async (method, params) => {
const r = await fetch(rpcUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method, params }),
});
return (await r.json()).result;
};
const start = Date.now();
const receipt = await call("eth_getTransactionReceipt", [txHash]);
const includedIn = parseInt(receipt.blockNumber, 16);
while (true) {
const fin = await call("eth_getBlockByNumber", ["finalized", false]);
const finNum = parseInt(fin.number, 16);
if (finNum >= includedIn) {
return { includedIn, finalizedAt: finNum, seconds: (Date.now() - start) / 1000 };
}
await new Promise((r) => setTimeout(r, 1000));
}
}
finalityProbe("RPC_URL", "0xYOUR_TX_HASH").then(console.log);结果表:记录什么以及如何呈现
不要只发布一个 TPS 数字。发布一个包含窗口、样本量和离散度的表格,以便读者判断该数字是否稳定。下面的模板是最低限度的诚实呈现;用你自己测量的值填充它,绝不要用借用或估计的数字。
| 链 | 窗口 | 采样区块数 | 平均 TPS | 出块时间中位数 | 最大区块间隔 | 最终性(秒) | 备注 |
|---|---|---|---|---|---|---|---|
| 链 A | 7 天 | N | 实测 | 实测 | 实测 | 实测 | 端点固定 |
| 链 B | 7 天 | N | 实测 | 实测 | 实测 | 实测 | 统计收据 |
如果你要与公共仪表盘比较,在你自己的数据旁边记录仪表盘声明的窗口和时间戳,以便两者可比。仪表盘显示 24 小时 TPS 而你的脚本显示 50 个区块窗口,它们测量的不是同一件事,差异往往大于底层链的方差。
去中心化输入以及为什么它们更难复现
吞吐量测量成本低;去中心化则不然。验证者数量、质押分布和中本聪系数依赖于链特定状态,这些状态可能无法通过标准 RPC 暴露。一些链通过专用方法或质押 pallet 查询暴露验证者集合;其他链则需要索引器或治理仪表盘。
当你无法直接复现去中心化指标时,至少验证其输入。对照链自身的质押模块确认验证者数量,对照仪表盘引用的同一来源确认质押分布,并说明快照区块。用过期质押数据计算的中本聪系数是历史趣闻,而非当前属性。
这也是仪表盘体现价值的地方:在数十个网络上维护一致的验证者和质押管道是真正的工程工作。为一条链复现是可行的;为五十条链复现则是一个产品,而不是一个脚本。
排查不一致或令人惊讶的数字
如果你的 TPS 与仪表盘差异很大,按顺序排查常见原因。大多数差异是定义性的,而非对抗性的。
如果你的最终性探测永远不解析,检查端点是否支持 finalized 标签,或者链是否使用不同的最终性原语。如果区块时间戳看起来不对,确认你读取的是规范链而非分叉或测试网端点。如果数字在多次运行间漂移,你的负载均衡器可能路由到不同高度的节点——固定端点。
- 窗口不匹配:50 个区块 vs 24 小时 vs 7 天。
- 失败交易包含在区块头计数中,但不包含在成功 TPS 计数中。
- L2 或 rollup 交易被批处理为单笔 L1 交易。
- 端点滞后:你的节点落后于仪表盘读取的头部。
- 时间戳来源:区块时间戳 vs 本地接收时间。
- 意外使用了测试网或分叉端点而非主网。
仪表盘式指标的局限性和权衡
基础指标仪表盘为可比性优化,这意味着它们必然抹平链特定的细微差别。单一 TPS 列无法表达一条链的交易是简单转账而另一条链的交易是不同 gas 成本的合约调用。单一最终性列无法表达概率性与确定性保证。这些是权衡,不是缺陷,但你应该知道自己在接受哪些。
还存在测量与意义之间的差距。高吞吐量伴随低手续费收入可能表明补贴活动;高收入伴随低吞吐量可能表明昂贵的区块空间。同时阅读两列比在任何单一指标上排名链更有信息量,这是区分分析与排行榜观看的习惯。
最后,实时仪表盘是快照。如果你需要历史趋势或可复现研究,按计划捕获自己的样本并存储,而不是依赖一个在你眼前更新的页面。
下一步:构建你自己的基础指标管道
从一条链和一个指标开始。按计划运行 TPS 脚本,将结果写入一个小型时间序列存储,并在第一个管道稳定后添加出块时间和最终性。当你扩展到多条链时,在添加网络之前标准化窗口和交易计数规则,否则你的比较将是苹果对橘子。
对于你要追踪的网络端点选择,网络目录 列出了支持的链,API 服务 描述了如何获取密钥和管理速率限制。如果你为了保持一致性而运行自己的测量节点,在投入基础设施之前请查看区块链节点托管指南。
对于特定链应使用哪个端点的具体问题,把这个决定交给 RPC Assistant 而不是猜测——上述方法论与端点无关,端点选择应基于可靠性和延迟。一旦你的管道运行起来,你将拥有比仪表盘截图更有价值的东西:每条链实际行为的可复现记录,以及证明它的查询。