# 比特币最终性

<div data-with-frame="true"><figure><img src="/files/8aaa1a3e08610a0c7fb2cdc5466bb3e5ba6f6690" alt=""><figcaption></figcaption></figure></div>

100% 比特币最终性这一概念对 Stacks 的设计至关重要。正是这一点将 Stacks 变成了真正的比特币 L2，并使其能够利用比特币内在的全部安全性。

最终性指的是交易变得不可逆转的那个时刻。一旦区块链达到最终性，在不采取通常在计算上和经济上都极其不可承受的非常措施的情况下，几乎不可能更改账本历史。

当我们说 Stacks 区块具有 100% 比特币最终性时，我们的意思是，它们和比特币交易本身一样难以回滚。

这是一个大胆的说法，那么 Stacks 是如何做到的呢？

如上所述，矿工负责在其任期内生成 Stacks 区块，而一个任期对应一个比特币区块。作为其区块提交交易的一部分——这笔交易此前会将下一个 Stacks 区块的哈希提交到比特币链上——矿工现在将被要求添加一个索引化的区块哈希。

索引化的区块哈希是上一位 Stacks 矿工在其任期内生成的第一个区块的哈希。它是对 Stacks 所识别的所有先前已接受的比特币交易的共识哈希，以及该区块本身哈希的 SHA512/256 哈希。

这会将 Stacks 链的历史锚定到比特币上，覆盖到前一位矿工任期开始之前的部分，以及 Stacks 已处理的所有因果相关的比特币状态。这确保了比特币最终性，通过将分叉防护交给 stackers 来解决矿工连接问题，并允许持有最新 Stacks 链状态副本的节点识别哪些 Stacks 区块受到了比特币重组（reorg）的影响，并恢复受影响的 Stacks 交易。

Stackers、矿工、比特币区块和 Stacks 区块之间的这种关系，既维持了比特币最终性，又允许矿工快速生成 Stacks 区块。比特币最终性的实现方式是：在每一个比特币区块 N + 1 处，Stacks 链在任期 N 开始时的状态都会被写入比特币。即使在未来某个时间，所有前任 Stackers 的签名密钥都被泄露，他们也无法在不将比特币历史重写回任期 N + 1 的情况下，重写任期 N 的 Stacks 历史。

因此，Stacks 交易在其所属任期结束后，或者在比特币区块 N + 1 之后，就可以被视为具有比特币最终性。举例来说，如果我发起了一笔被 Stacks 矿工确认的 Stacks 交易，那么在该矿工任期结束时（当前比特币区块结束时），这笔交易将作为 Stacks 链状态的一部分写入比特币，而所有未来的矿工都必须在该链尖端之上继续构建，这使得回滚该交易与回滚对应的比特币交易一样困难。

{% hint style="info" %}
要点：在每一个比特币区块 N + 1 处，Stacks 链在任期 N 开始时的状态都会被锚定到比特币上。这使得回滚任期 N 的 Stacks 历史和将比特币历史重写回 N + 1 一样困难。
{% endhint %}

## Nakamoto 交易与比特币重组

如果 Nakamoto 交易遵循比特币最终性，那么如果比特币分叉会发生什么？

为了回答这个问题，我们需要区分两类 Stacks 交易：依赖比特币的和内部的。

{% hint style="info" %}

* **依赖比特币的** 交易是读取比特币状态的交易。如果比特币分叉，这些交易会发生变化。对于这类交易，你无法做得比遵循比特币最终性更好。例如，如果你将 BTC 从 L1 转移到 L2，那么你必须等到比特币最终性达成后，你的 L2 BTC 才能使用（如果由于分叉导致 L1 交易变成未确认状态，你就没有任何 L2 BTC）。
* **内部的** 交易不依赖比特币状态，因此如果比特币分叉，它们不会改变。这些交易可以更快确认，因为即使比特币分叉，签名者也能确保它们以相同的顺序被重新处理。
  {% endhint %}

关键结论是：

在 Nakamoto Stacks 中，交易不会因为比特币分叉而发生有实质影响的重组。重组不仅相对少见，而且因比特币分叉而被重组的 Stacks 交易，其行为与被重组的比特币交易完全相同。经过一些未来分析，纯粹位于 L2 链上的交易也许有一天将完全不受影响。

<details>

<summary>阅读更多关于比特币重组行为的内容</summary>

如果你想进一步了解其工作原理，请参阅文档中的 [比特币重组](/learn/zh/block-production/bitcoin-reorgs.md) 页面。

</details>

***

{% embed url="<https://youtu.be/w2mA3ajOoNQ?si=IK8w4Kxd6v0acdDB>" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.stacks.co/learn/zh/block-production/bitcoin-finality.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
