# 区块是如何被挖出的？

<div data-with-frame="true"><figure><img src="https://629346125-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FH74xqoobupBWwBsVMJhK%2Fuploads%2FKP7TV3rUxRBugJITtEOy%2Fmining-section-cover.png?alt=media&#x26;token=a3891617-2b64-4742-9a0c-004c6a70f944" alt=""><figcaption></figcaption></figure></div>

{% hint style="info" %}
**构建者资源**

* 为了运行你自己的 Stacks 矿工， [这里](https://app.gitbook.com/s/4cpTb2lbw0LAOuMHrvhA/run-a-miner).
* 用于对 Stacks 挖矿进行数据分析， [这里](https://app.signal21.io/stacks/mining).
  {% endhint %}

#### 全局概览

* PoX 每个 BTC 区块随机选择一名单领导者区块矿工
* PoX 激励矿工生成 STX 区块并赚取 STX 奖励 + 交易费
* 矿工发送 *区块提交* 交易到比特币 L1。
* 区块提交包括：(区块哈希，VRF 种子) 对
* 在每个比特币区块上产生一个确定但不可预测的胜者
* PoX 通过 ATC-C 抑制 BTC L1 矿工进行干扰

***

## 简介

Stacks 挖矿围绕一个简单却强大的理念构建：矿工花费比特币来获得生成新的 Stacks 区块的权利。Stacks 并不是引入一套完全独立的共识机制，而是对比特币现有的工作量证明进行了适配和扩展。从这个意义上说，Stacks 利用比特币的安全性和经济权重来保护建立在其之上的这一层。

当矿工在挖矿过程中提交 BTC 时，这些比特币不会被销毁或浪费。相反，它们会转移给 Stackers——即锁定其代币以帮助验证并签署区块的 STX 持有者。比特币从矿工流向 Stackers 的这一过程，是转移证明（PoX）背后的核心创新。“转移”BTC 的做法既将 Stacks 锚定到比特币的安全性之上，又使矿工与网络参与者之间的激励保持一致。

## 挖矿流程拆解

在 Stacks 的上一版本中（Nakamoto 升级之前），Stacks 矿工会以与比特币区块一一对应的节奏挖出新的 Stacks 区块。Nakamoto 之后，情况不再如此。在 Nakamoto 规则下，矿工会被选中担任一个对应于某个比特币区块的任期。在这个任期内，矿工会构建并提议多个 Stacks 区块（大约每 10 秒一个），而 stackers 则会批准并追加这些区块。

{% hint style="info" %}
[Nakamoto 升级是什么？](https://docs.stacks.co/learn/zh/block-production/what-was-the-nakamoto-upgrade)
{% endhint %}

<div data-with-frame="true"><figure><img src="https://629346125-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FH74xqoobupBWwBsVMJhK%2Fuploads%2Fca0oJCagFYDaEU3vw1e4%2Fmining-flow.png?alt=media&#x26;token=1d65f252-c0b3-4614-8166-726a22de4f42" alt=""><figcaption></figcaption></figure></div>

矿工运行启用挖矿功能的 Stacks 节点以参与 PoX 机制。该节点实现 PoX 机制，并通过四个关键阶段确保正确处理和激励：

1. **注册**：矿工通过向网络发送共识数据来为未来的选举进行注册
2. **承诺**：已注册的矿工转移比特币以参与选举。已承诺的 BTC 会发送给一组参与的 STX 代币持有者，也就是 stackers。
3. **选举**：一个可验证随机函数会选出一名矿工在新的任期内为 Stacks 区块链写入区块
4. **组装**：当选矿工从内存池中提取交易来编写新区块，并以新的 STX 代币形式收取奖励

## 矿工选择流程

与 PoW 中的区块竞赛不同，Stacks 使用一种称为密码学抽签（cryptographic sortition）的单领导者选举过程。这一过程通过嵌入在比特币交易中的可验证随机函数状态来实现。这样一来，每个比特币区块都能产生确定但不可预测的赢家。

<details>

<summary>什么是密码学抽签？</summary>

密码学抽签是一种使用密码学从一组对象中随机选择一个或多个实体的过程。这是一种去中心化且可验证的方式，可用于选择多种任务的参与者，例如共识协议、抽奖和拍卖。

更具体地说，在 Stacks 的语境中，矿工抽签是指按权重进行的密码学抽签过程，通过该过程将某个矿工候选人选为下一个矿工（领导者）。

</details>

首先，每个 Stacks 矿工都必须在一笔比特币交易中注册一个 VRF 公钥。完成后，他们就可以发出 *区块提交* 比特币上的交易。比特币上的区块提交交易包含：

`（区块哈希，VRF 种子）对`

这些区块提交交易不仅包含他们打算生成的区块流的指针，还包括为下一次抽签重新设置下一轮 VRF 所需的所有相关信息。矿工不能篡改 VRF 种子。这一点由以下属性保证：

`VRF 种子 = hash(VRF 证明)`

而该 VRF 证明只能由矿工的 VRF 私钥生成。

<details>

<summary>区块提交彼此之间如何关联？</summary>

<div data-with-frame="true"><figure><img src="https://629346125-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FH74xqoobupBWwBsVMJhK%2Fuploads%2F9l4YJ1AOry3SSTL724wd%2Fmining-leader-election-flow.png?alt=media&#x26;token=6dcfaefd-1362-4d10-a530-b726584b91d8" alt=""><figcaption></figcaption></figure></div>

</details>

{% hint style="info" %}
要被纳入任期考虑，矿工必须有一笔区块提交被包含在比特币区块中。如果矿工在提交后希望更新其承诺，可以使用比特币的 Replace-By-Fee。
{% endhint %}

### 挖出下一个区块的概率

被选中挖出下一个区块的矿工取决于矿工转移的 BTC 数量。矿工挖出下一个区块的概率使用“带结转的假定总承诺”（ATC-C）的一种变体来确定 [MEV](https://github.com/stacksgov/sips/blob/main/sips/sip-021/MEV-Report.pdf) 用于将区块奖励分配给矿工的缓解策略。矿工赢得抽签并获得当前任期的概率，将基于一个函数，该函数会考虑当前抽签之前的区块上的总区块提交支出。

虽然协议并未强制要求最低 BTC 承诺，但在实践中，受尘埃（dust）限制会有一个下限：基本上，如果一笔交易的手续费超过所花费输出的价值，它就会被视为尘埃。尘埃如何 [计算](https://github.com/bitcoin/bitcoin/blob/master/src/policy/policy.cpp#L14) 取决于许多因素，我们发现每个输出 5,500 聪是一个不错的下限。Stacks 矿工发出的比特币交易包含两个输出（用于转移证明），因此建议每个区块至少承诺 11,000 聪。

要计算应发送多少 BTC，矿工应：

* 猜测下一天（100 个区块后）的 BTC/STX 价格
* 猜测所有矿工总共承诺的比特币数量

{% hint style="info" %}
Stackers 负责验证和追加新区块，以及进行矿工任期变更。下一节将解释其工作方式，之后我们会看到这一过程如何实现比特币最终性。
{% endhint %}

### 区块提交交易（在比特币上）

矿工在每笔领导者区块提交交易中向 **两个** 地址承诺比特币。每个地址所承诺的金额必须相同。这些地址从当前 stacking 参与者的奖励集合中选出。地址使用可验证随机函数进行选择，要为给定区块确定正确的两个地址，需要监控 Stacks 链。

<figure><img src="https://629346125-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FH74xqoobupBWwBsVMJhK%2Fuploads%2Fgit-blob-26b4e9ac6cc7d7af044042d0a9ddfedb6ce4bc4f%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

<details>

<summary>区块提交交易实际上看起来是什么样？</summary>

* 观看这个 [片段](https://youtube.com/shorts/HPRsn-aSYrg?si=Y7hA7_9BeHFxV0zz) ，了解比特币上的区块提交交易包含什么。
* 查看比特币上的一笔较早的区块提交交易 [这里](https://mempool.space/tx/42834cb7ec9ca3e2b51e2ff16bd809ae049c925ed8d3da099c9ce3d5292d2a91).

</details>

## 矿工奖励

矿工会获得他们赢得任期对应的 Stacks 区块 coinbase 奖励。

奖励金额为：

* 在挖矿的前 4 年内，每个任期释放 1000 STX
* 接下来的 4 年内，每个任期释放 500 STX
* 再接下来的 4 年内，每个任期释放 250 STX
* 此后永久每个任期释放 125 STX。

这些“减半”与比特币减半同步。

#### 交易费用

矿工还会获得他们所生成的任何区块中的 Stacks 交易费用。

#### 奖励成熟期

区块奖励和交易费用需要在比特币区块链上经过 100 个区块才能成熟。在成功挖出一个区块后，你的奖励会在大约 24 小时后出现在你的 Stacks 账户中。

## Stacks 挖矿实践

如果你查看 [SIgnal21 的挖矿仪表盘](https://app.signal21.io/stacks/mining)，你可以看到一些关于 Stacks 网络挖矿的有趣数据，包括每个区块花费的 BTC、每个区块赚取的 STX、链历史上矿工总数，以及任意给定区块的矿工数量。

许多人注意到 Stacks 上矿工数量看起来很少。若缺乏上下文，这有时会引起质疑。让我们深入了解 Stacks 的挖矿工作方式，以理解为什么这对去中心化不是问题。

Stacks 矿工的功能类似于 L2 系统中的排序器，因为他们只负责构建和提议新区块，而不负责将其追加到链上。但与大多数仅使用单个中心化排序器的以太坊 L2 不同，Stacks 始终至少有 4-5 名矿工，且采用开放成员制，任何人都可以加入。

需要注意的是，Stacks 的区块生成过程涉及两个主要参与方：矿工和 stackers。这两个角色在区块生成过程中相互补充，而 stackers 会大幅削弱矿工对链可能造成的任何破坏性力量。

矿工无法重组链。在最坏的情况下，矿工最多只能省略（某些类型的）交易，而要应对这一点，只需运行你自己的矿工即可。

此外，网络中更多的矿工意味着 Stackers 获得的 BTC 奖励更少，因为矿工必须把更多资金花在比特币 L1 费用上，而不是发送给 Stackers。

<details>

<summary><strong>更多矿工难道不意味着更多竞争，也就意味着更多奖励吗？</strong></summary>

更多矿工之所以意味着更少奖励，是因为矿工在经济上会理性行事，而且他们可用于运作的 BTC 数量并不是无限的。

矿工支付 PoX 承诺和比特币手续费，是为了获得赢取 coinbase（1,000 STX）以及任期手续费的机会。如果矿工更多，那么每个矿工支付的金额会更少，因为他们获胜的概率更低。他们不可能不断支付越来越多的 BTC，因为到某个点上将永远无利可图，所以他们能为了尝试赢得任期而花费的 BTC 数量是有限的。

当他们支付更少时，比特币手续费就会成为其支出中更重要的一部分，这也会降低他们赢得任期的概率。

下面是一个具体例子：

假设 Stacks 的交易价格是每个 STX 1,000 聪。

如果每个人都按理性行事，并且忽略 Stacks 费用，那么所有矿工的总支出会少于 1,000,000 聪（1,000 STX coinbase \* 1000 聪/STX）。

如果这是由 5 名矿工贡献的，那么可能是 10,000 聪（每笔交易 2,000 聪）用于比特币手续费，990,000 聪用于 PoX。

如果有 100 名矿工，那么会有 200,000 聪用于比特币手续费，800,000 聪用于 PoX。

</details>

这会形成一种自然的经济均衡：

{% stepper %}
{% step %}
**足够多的矿工参与，以确保区块能够可靠地产生**
{% endstep %}

{% step %}
**Stackers 获得最优 BTC 奖励**
{% endstep %}

{% step %}
**网络在无需不必要的挖矿竞争的情况下保持抗审查性**
{% endstep %}
{% endstepper %}

这一设计是有意为之——通过让 stackers 作为互补的安全保障者并通过 PoX 获得 BTC 奖励，Stacks 在不需要大量矿工仅为争夺区块生成权而竞争的情况下实现了安全性。

与其他由矿工单独决定规范链的链不同，Stacks 的双方系统提供了更强的保障：

* 矿工不能强制提交无效交易或区块（stackers 不会签名，即使签了，节点也不会接受）
* 没有任何矿工可以单方面重组链（stackers 控制链最终性）
* 70% 的 stacker 阈值签名要求确保区块被接受之前需要广泛共识

矿工与 stackers 之间的这种职责分离，正是 Stacks 尽管矿工数量很少却依然具有独特安全性的原因。

<details>

<summary>微区块怎么了？</summary>

微区块是旧版 Stacks 的一个遗留功能，现已不复存在。它们最初被创建出来是为了提高交易吞吐量，但在没有 Nakamoto 功能的情况下，它们在实践中从未真正起作用。

Nakamoto 不再使用微区块，而是采用一种区块生产结构，如此处所述，以快速节奏生成 Stacks 区块。

</details>

## 比特币 MEV 缓解

矿工可提取价值（MEV）一直是许多区块链长期存在的问题，Stacks 在 Nakamoto 之前也是如此。

MEV 指的是矿工通过操控其生成的区块中交易的包含与排序而可能提取的潜在利润，这会导致不公平行为并削弱网络信任。

具体到 Nakamoto 之前版本的 Stacks，拥有比特币大量算力份额的比特币矿工，能够审查其他 Stacks 矿工的承诺交易，从而确保自己作为比特币矿工同时赢得比特币区块后，也能赢得 Stacks 区块的奖励和手续费。

Nakamoto 系统使用了“带结转的假定总承诺”（ATC-C）的一种变体 [MEV](https://github.com/stacksgov/sips/blob/main/sips/sip-021/MEV-Report.pdf) 缓解策略来分配区块奖励给矿工。矿工赢得区块并获得当前任期的概率，将基于一个函数，该函数会考虑当前区块之前各区块上的总区块提交支出。

<div data-with-frame="true"><figure><img src="https://629346125-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FH74xqoobupBWwBsVMJhK%2Fuploads%2FKR4LNqlqDmrC4hBmUwOB%2FATCC-formula.png?alt=media&#x26;token=ade7ed3f-2d1e-4124-8768-467069afca60" alt=""><figcaption></figcaption></figure></div>

ATC 方案允许某个区块没有有效赢家。TenureChange-Extend 交易缓解了因错过区块而造成的大多数不利影响。

***

### 其他资源

* \[[Stacks YT](https://youtu.be/F31B-my510A?si=E0SRw0bbhuevB4kj)] Stacks 与比特币矿工的关系
* \[[Stacks YT](https://youtu.be/bhVyM5CYoh4?si=3bQl8Q_iJ_3z5jX-)] 比特币的长期安全预算与矿工激励
