摘要
Polygon 最终性是指交易在 Polygon PoS 链上变得不可逆转的时刻。随着 Heimdall v2 升级,最终性现在大约在 5 秒内实现,而之前需要 1-2 分钟,这使得网络更适合支付和实时应用。对于开发者来说,理解最终性对于设计用户体验、处理重组以及选择合适的 RPC 基础设施来监控最终性状态至关重要。
快速决策指南:最终性如何影响您的应用
在深入机制之前,先问自己:您的应用是否需要等待最终性后再采取行动?答案决定了您的 RPC 策略和用户体验。
- 支付和结算:如果您正在构建支付应用,您需要等待最终性以避免撤销。借助 Polygon 约 5 秒的最终性,您可以快速显示已确认状态,但仍应在释放资金前检查最终性。
- DeFi 和交易:对于交换或清算,等待最终性可降低重组风险,但会增加延迟。您可能会选择接受概率性最终性以换取速度,但需准备好处理重组。
- 游戏和 NFT:这些通常可以使用概率性最终性,但如果您正在铸造稀有物品,您可能需要等待最终性以防止重复。
下一步:如果您需要监控最终性,请使用提供可靠访问最新已定稿区块的 RPC 提供商。OnFinality 提供专用节点和 RPC 端点,可帮助您高效查询最终性状态。
区块链中的最终性是什么?
最终性是保证交易或区块不能被逆转或更改。在区块链中,主要有两种类型:
- 概率性最终性:在交易之上构建的区块越多,被重组可能性就越小。比特币使用此模型。
- 确定性最终性:一旦区块被定稿,它就是不可逆的。以太坊使用 Casper FFG,Polygon 使用里程碑机制。
Polygon PoS 使用确定性最终性,这意味着一旦里程碑被定稿,包含的交易就是永久的。
Polygon 最终性如何工作
Polygon 通过两种机制实现最终性:里程碑和检查点。
里程碑
里程碑在 Polygon 本身上提供快速的确定性最终性,无需等待检查点提交到以太坊。在每个 Heimdall 高度,验证者使用 CometBFT 共识中的投票扩展,提议自上次定稿里程碑以来他们看到的 Bor 区块哈希。当定稿 Heimdall 高度 H+1 时,Heimdall 会寻找所有验证者中具有 2/3 或更多一致性的最长公共区块哈希序列。该序列被定稿为新的里程碑。
借助 Heimdall v2 升级,Heimdall 中的区块时间缩短至 1-2 秒,因此里程碑的投票和定稿速度大大加快。这使最终性缩短至约 5 秒。
检查点
检查点是提交到以太坊的 Polygon 链状态的定期快照。它们通过将 Polygon 状态锚定到以太坊来提供额外的安全性,但速度较慢(通常每 30 分钟到 1 小时一次)。检查点不是 Polygon 本身最终性的必要条件,但对于跨链桥和其他需要以太坊级最终性的应用来说很重要。
为什么最终性对开发者很重要
理解最终性对于构建可靠的应用程序至关重要。以下是一些原因:
- 用户体验:如果您等待最终性,用户可能会看到延迟。借助 Polygon 的快速最终性,您可以提供更好的用户体验。
- 重组处理:即使有确定性最终性,在里程碑定稿之前也可能出现临时重组。您需要在应用程序中处理这些情况。
- 跨链交互:如果您正在桥接资产,您需要在源链上等待最终性,然后再在目标链上铸造。
在 Polygon 上查询最终性
您可以使用 RPC 方法查询最终性状态。以下是一些示例:
使用 curl
要获取最新的已定稿区块,您可以使用带有 finalized 标签的 eth_getBlockByNumber 方法:
curl -X POST https://polygon.api.onfinality.io/public \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["finalized", false],"id":1}'
使用 ethers.js
const { ethers } = require('ethers');
const provider = new ethers.JsonRpcProvider('https://polygon.api.onfinality.io/public');
async function getFinalizedBlock() {
const block = await provider.getBlock('finalized');
console.log('Finalized block:', block.number);
}
getFinalizedBlock();
使用 viem
import { createPublicClient, http } from 'viem';
import { polygon } from 'viem/chains';
const client = createPublicClient({
chain: polygon,
transport: http('https://polygon.api.onfinality.io/public'),
});
const block = await client.getBlock({ blockTag: 'finalized' });
console.log('Finalized block:', block.number);
监控最终性和处理重组
即使有快速最终性,您也应该监控重组,尤其是在构建高价值应用时。以下是一些提示:
- 跟踪最新的已定稿区块:轮询
finalized标签并将其与最新区块进行比较。如果差异很大,则可能存在问题。 - 使用 WebSocket 订阅:订阅 newHeads 并通过跟踪区块哈希来监听重组。
- 设置警报:使用监控工具在最终性延迟或出现深度重组时提醒您。
WebSocket 订阅示例
const WebSocket = require('ws');
const ws = new WebSocket('wss://polygon.api.onfinality.io/public');
ws.on('open', () => {
ws.send(JSON.stringify({
jsonrpc: '2.0',
method: 'eth_subscribe',
params: ['newHeads'],
id: 1
}));
});
ws.on('message', (data) => {
const message = JSON.parse(data);
if (message.method === 'eth_subscription') {
const block = message.params.result;
console.log('New block:', block.number, block.hash);
}
});
最终性与 RPC 提供商选择
在选择 Polygon 的 RPC 提供商时,请考虑他们如何处理与最终性相关的查询和重组。以下是一个比较:
| 提供商 | 最终性支持 | 重组处理 | 备注 |
|---|---|---|---|
| OnFinality | 支持 finalized 标签、WebSocket 订阅 | 提供低延迟的可靠基础设施 | RPC 定价 和 支持的网络 |
| 其他提供商 | 各不相同 | 各不相同 | 查看文档了解最终性支持 |
OnFinality 提供公共和专用端点,使您可以根据需要进行扩展。对于生产应用,请考虑使用专用节点以获得更一致的性能。
常见陷阱和故障排除
- 不等待最终性:如果您不等待最终性,您可能会接受可能被重组的交易。对于关键操作,始终检查
finalized标签。 - 使用错误的区块标签:某些 RPC 提供商可能不支持
finalized标签。请确保您的提供商支持。 - 忽略重组:即使有确定性最终性,也可能出现临时重组。请监控它们。
- RPC 速率限制:公共端点可能有速率限制。对于高吞吐量应用,请使用专用节点。
关键要点
- 得益于 Heimdall v2 升级,Polygon 最终性现在约为 5 秒。
- 最终性通过里程碑实现确定性,检查点在以太坊上提供额外安全性。
- 开发者应查询
finalized标签以确保交易不可逆。 - 选择支持最终性查询和 WebSocket 订阅的 RPC 提供商,例如 OnFinality。
- 监控重组并设置警报以保持应用程序可靠性。
常见问题解答
概率性最终性和确定性最终性有什么区别?
概率性最终性意味着存在重组的可能性,而确定性最终性意味着一旦区块被定稿,就不能被还原。Polygon 通过里程碑使用确定性最终性。
Polygon 最终性需要多长时间?
借助 Heimdall v2,最终性在约 5 秒内实现,而之前需要 1-2 分钟。
我需要在 Polygon 上等待最终性吗?
这取决于您的应用。对于支付和高价值交易,是的。对于随意交互,您可能会接受概率性最终性。
如何检查交易是否已定稿?
您可以使用 eth_getTransactionReceipt 方法,并将区块号与最新的已定稿区块进行比较。或者,在 eth_getBlockByNumber 中使用 finalized 标签。
什么是检查点?
检查点是提交到以太坊的 Polygon 状态快照。它提供额外的安全性,并用于跨链桥。
OnFinality 是否支持 Polygon 最终性查询?
是的,OnFinality 的 Polygon RPC 端点支持 finalized 标签和 WebSocket 订阅。有关更多详细信息,请参阅 Polygon 网络页面。