技术

Stacks是什么类型的区块链?

2021-06-28

 作者:Jude Nelson (Stacks基金会首席科学家)

对Stacks的几个常见误解,说它是一个侧链、一个合并挖矿链、一个权益证明链或layer-2系统。这些都不对。Stacks区块链layer-1区块链,它使用一种被称为传输证明 (PoX) 的新颖独特的挖矿协议。PoX区块链与另一个区块链(此处为BTC)并行运行,后者用作其区块头部的可靠广播媒体。Stacks矿工使用存储的元数据执行自己的领袖选举,实现独立于BTC的中本共识变体,方法是选择一个获胜区块,其概率与BTC链上记录该区块花费的BTC成比例。

 

是什么让Stacks与其他方法不同?

 

- Stacks不是一个PoS链。产生区块的行为需要外在支出 - 它与在PoS中必需拥有的原生代币无关。在Stacks链中产生区块的唯一方法是将BTC转移到预先确定的BTC地址随机列表中。此外,Stacks区块链可以进行分叉,并且存在一个协议,可以根据质量对分叉进行排序,而与矿工和他们持有的代币无关。这两个属性进一步将其与PoS链区分开来,PoS 链无法分叉,因为没有信任第3方判定特定分叉有效去识别规范分叉。分叉的能力使Stacks区块链能够在会导致PoS链崩溃的故障模式下幸存下来。

 

- Stacks不是侧链,主要有两个原因。首先,产生所有Stacks块的历史记录都记录到BTC中。这意味着产生私有Stacks分叉的行为至少与重组BTC链一样困难。这反过来又使得依赖于创建私有分叉的链上的攻击(例如私挖和双花)更难以盈利,因为所有诚实的参与者都可以在攻击发生之前看到攻击并有机会采取对策。侧链没有提供这样的安全优势。其次,Stacks区块链有自己的代币;它不与BTC相挂钩。这意味着Stacks区块链规范分叉的安全性由其整个代币经济的价值支撑,而侧链规范分叉的安全性只有通过任何系统特定的措施来支撑,这些措施激励验证方诚实地生成块,或者BTC矿工愿意处理钉住的请求(以较弱的保证为准)。

 

- Stacks不是BTC的layer-2系统 - 它本身就是一个主权系统。Stacks区块链状态与BTC不同,完全由Stacks节点维护。Stacks交易与BTC交易是分开的。像闪电网络这样的Layer-2系统旨在帮助扩展BTC支付交易,而Stacks旨在通过智能合约为BTC带来新的用例。Stacks并非被设计为BTC layer-2可扩展性解决方案。

 

- Stacks不是一个合并挖矿链。Stacks链上唯一的区块生产者是Stacks矿工。BTC矿工不参与Stacks区块验证,也不获得Stacks区块奖励。此外,Stacks不是一个不可视合并挖矿链,因为STX区块获胜者是公开的和随机选择的(而不是出价最高的获胜),并且它的代币是根据一个独立于矿主承诺度或BTC转让度的时间表铸造的(而不是只通过BTC的单向挂钩铸造)。这确保了Stacks能够在没有BTC矿工选择加入的情况下取得进展,并确保Stacks矿工得到足够的补偿,以保持系统活跃,而不管交易量如何。

 

Stacks仅将BTC区块链用作可靠的存储和广播介质,用于记录曾经生成的所有Stacks块的集合,以及它们之间的父/子链接。系统的状态以BTC结算 - 创建一个新的Stacks区块的行为需要发送一个格式良好的BTC交易,该交易记录一个Stacks区块的哈希值及其它附加到区块链的位置。在BTC上建立系统赋予Stacks在其他区块链中看不到的新颖安全属性 - 它利用BTC的安全性来保证所有Stacks分叉都是公开的,并帮助引导Stacks节点识别规范的Stacks分叉并找到他们还没有下载的Stacks块。

 

概述

 

Stacks 2.0是第一个使用传输证明 (PoX) 来挖矿的区块链。PoX是一种新颖的挖矿协议,通过将另一个区块链上的另一种加密货币传输到预定的地址列表来选择区块生产者。在PoX 的Stacks 2.0执行中,它将BTC传输到BTC地址,这些地址由STX代币持有者定期设置。

 

PoX挖矿是一种单领袖挖矿,和PoW一样。每个区块仅有一个矿工产出,每个矿工可以选择任何现有区块作为其区块的父区块。由此产生具有以下属性的区块链:

 

- 开放式挖矿。生产区块的方式与将另一个加密货币(BTC) 传输给STX持有者相关。成为区块生产者的唯一准入屏障是获取和使用BTC。矿工不需要持有STX(不像PoS),矿工也不需要配备专门的硬件(不像PoW)。

 

- 分叉是一种故障恢复机制。因为任何人都可以仅通过花费BTC成为矿工,所以区块链可能会分叉。矿工在经济上受到激励,在一个规范的链分叉上构建网络,但这不是必需的。这是一个理想的属性,因为这意味着诚实的矿工可以在灾难性的网络划分或不诚实的挖矿活动期间恢复链。Stacks区块链为节点提供了一种无需咨询其他节点即可独立识别规范分叉的方法。这个分叉就是拥有最多块的Stacks分叉,因为这代表了矿工花费最多时间工作的分叉,用BTC块的数量来衡量。

 

- 所有分叉上的区块产生历史都是公开的。通过基于在另一个区块链(BTC)上发送交易来选择矿工,所有矿工的活动都在所有的Stacks分叉中公开。这意味着所有对BTC链具有相同视野的Stacks节点将了解所有存在的Stacks分叉;改变这种视野的行为就是改变BTC链本身状态的行为。

 

那么,这些属性将Stacks区块链置于类似区块链中的什么位置?

 

Stacks区块是通过在分叉上挖矿产生的

 

成为Stacks链上矿工的唯一障碍就是获取和花费BTC。此外,矿工甚至不需要拥有链状态的完整副本就可以开始挖矿 - 他们可以自由选择在任何现有的Stacks区块上来构建他们的区块,这允许了区块链分叉。

 

分叉是Stacks中的故障恢复机制,就像它们在PoW区块链中一样。如果发生系统性网络或矿工故障,甚至系统性区块丢失,其他节点可以随时成为矿工并继续生产新区块。所有Stacks区块的历史都被编码在BTC链中这一事实意味着所有节点都可以枚举所有曾经存在过的Stacks区块,并确定哪些Stacks区块在其本地链状态中丢失。

 

由于挖矿是一个单一领袖过程,因此生产区块不需要法定人数。为了挖一个块,Stacks矿工在BTC链上提交“区块提交”交易,在BTC区块内的所有竞争“区块提交”中,将通过加密抽签过程来选择其中一个。获胜的矿工有权在他们选择的分叉上将他们的区块加到其他诚实节点的链状态中。

 

为了选择获胜者,矿工通过他们的BTC区块提交交易共同维护共享随机数生成器的状态。他们使用可验证随机函数 (VRF) 来确定地随机抽取每次抽签的获胜矿工,并证明抽样区块是根据协议指定的随机数生成器选择的。赢得一个区块的概率是每个矿工提交的BTC比例的函数 - 所有矿工都提交了BTC,但是如果一个矿工比其他矿工提交的更多,那么他获胜的机会就更高。这在大多数情况下引用了PoW区块生产的激励模型:所有矿工以接近预期奖励率 (STX) 的速度消耗资源 (BTC)。

 

每个矿工都被激励在Stacks规范分叉之上构建自己的区块,因为这个分叉是其他矿工(以及用户和交易所)花费最多时间竞争构建的地方。规范分叉始终是附加连续块数量最长的分叉。挖矿过程和链构建过程的详细描述可以在SIP-001SIP-007中找到。

 

规范分叉可以由每个节点独立识别 - 只要Stacks节点能够识别规范BTC分叉,它就可以识别规规范Stacks分叉。为此,用户运行BTC节点(或连接到受信任的节点)以同步BTC链状态。Stacks节点从每个BTC块中提取出区块提交交易,运行加密抽签来确定每个BTC块中选择了哪个Stacks块,然后找到赢得Stacks块最多的Stacks分叉。与PoS不同,节点不需要信任第3方来告诉他们哪个分叉是规范的 - 节点通过首先确定规范BTC分叉来独立确定规范Stacks分叉,并且它通过选择具有最多累积工作量证明的BTC分叉来确定规范BTC分叉。

 

用户和交易所只接受规范分叉上的交易是有效的,并且他们只认为区块奖励在得到充分确认的情况下是可以使用的。这使得矿工需要在规范分叉上进行构建,因为获取和出售区块奖励将使他们能够收回他们支出的BTC。反过来,这又激励所有单一领袖区块链(包括Stacks和BTC)中的矿工广泛复制他们的区块,并采取措施使他们对链状态的视角与他们的同行矿工保持同步。这还激励他们建立在彼此的区块之上,而不是挖采相互竞争的分叉。这些复制区块和建立在规范链之上的双重需求都确保矿工努力保持链的活跃性和安全性 - 规范链上的构建块保持链处理交易,并阻止矿工构建分叉以改变已经确认的块。

 

由于这三个特性 - 矿工只需要花费BTC来挖矿,Stack区块链可以分叉,并且存在一种计算规范分叉的方法 - Stacks区块链不是PoS区块链。没有任何东西被抵押或削减;矿工花费资源(BTC)换取代币(STX),其消耗率随着时间的推移接近所获得代币的预期价值;每个链分叉代表资源的累计支出(BTC和时间),这作为经济活动量的代理指标。

 

Stacks区块链实现了中本聪共识的变体

 

在Stacks区块链中,活跃度和安全性是通过激励矿工用他们确认的所有区块充斥网络并建立在彼此的区块上来获得的。与PoW链一样,Stacks链实现了一种形式的中本聪共识:对于一个区块是否在规范分叉中被接受,没有达成不可逆转的协议; 相反,随着上面构建的区块越来越多,改变某块是否被接受变得越来越难。这在实践中是有效的,因为对于大多数交易,只有很小的确认深度,在这个深度上,恶意矿工尝试恢复交易块的成本比简单地接受它现在是规范的成本更高。

 

选择在Stacks中实现中本聪共识是为了在不利的网络条件下赋予链高度的弹性。例如,只要恶意矿工永远不会超过诚实矿工,PoX链就可以从安全故障(51%攻击)中恢复。再举一个例子,PoX链可以从长期存在的网络分区甚至系统性块丢失中恢复 - 最长的分叉将成为规范分叉,丢失的块将被“分叉”以从之前的交易中产生新的规范链。事实上,多亏中本聪共识,Stacks链已经通过在运行早期分叉错误引起的网络分区和块丢失来自动恢复。如果Stacks是一个PoS链,它就会因为仲裁失败而崩溃。

 

PoX的中本聪共识与PoW的中本聪共识的不同之处在于,它在两种额外的PoX特定形式的降级挖矿下具有弹性:折扣挖矿和外部矿工垄断。在这些挖矿模式中,链的安全性和活性得以保留,但我们将它们归类为“退化”,因为它们仍然不利于链的整体健康。PoX的中本聪共识与PoW的中本聪共识的其他降级挖矿形式相同,例如私挖、区块扣留和51%攻击,但这些降级形式的破坏程度在PoX中被减轻,因为所有矿工活动是公开的。

 

当PoX矿工使用他们累积的区块奖励从其他矿工(包括他们自己)接收PoX代币转移时,就会发生折扣挖矿。随着时间的推移,这将使折扣矿工在竞争中胜过非折扣矿工,因为他们的真实支出低于他们在链上的支出。然而,这种退化的挖矿形式仍然以(BTC)交易费的形式存在持续的资本成本,这会阻止系统完全崩溃到PoS。具体到Stacks,少数STX代币持有者有权投票迫使PoX矿工销毁BTC而不是转移BTC,如果发现矿工系统性地进行折扣挖矿,从而消除优势。因为这样做的好处受到警惕的STX持有者的限制,而且由于折扣采矿要求矿工长期放弃出售他们的STX以收回他们的BTC支出,所以这在实践中不太可能成为问题。此外,除了将它们锁定用于PoX之外,STX的一系列蓬勃发展的用例的存在进一步使折扣挖矿成为利润较低且风险较高的STX使用方式。

 

当BTC矿工成为Stacks矿工并继续审查竞争性区块提交交易以赢得STX代币时,就会发生外部矿工垄断。如果完全实现,这种退化的挖矿形式相当于矿工100%参与的合并挖矿(迄今为止,合并挖矿链从未实现过这一点)。它仍然不会降级为PoS,因为新的BTC矿工可以继续加入BTC网络,消费电力,并继续开采BTC和 STX(即STX生产的实际手段将成为消费电力而不是BTC)。具体到Stacks,如果BTC矿工垄断发生在BTC矿工的参与率低于100%的情况下,那么STX持有者有权投票支持网络升级,这将在预定的块高度杀死当前的Stacks链,并将其替换为可能会惩罚矿工垄断的不兼容版本(例如,通过要求STX 矿工根据最后一个BTC区块的总交易费用来代替燃烧最低数量的BTC)。因为存在投票升级链以使用新的挖矿规则的选项,并且因为垄断行为是破坏BTC作为抗审查货币的声誉的行为,所以预计维持这种退化的挖矿形式的行为将是不利于BTC矿工的利润。

 

除了这两种新的降级挖矿形式外,PoX的中本聪共识在与PoW相同的原则和限制下运作。投入更多资源(BTC)的矿工赢得区块的机会更高。所有矿工都提交资源,但只有一个人会赢得给定的区块竞赛。矿工可以选择从哪个区块挖出,且机制鼓励(但不要求)矿工及时复制他们的区块并在规范分叉上进行构建。即使这些退化的挖矿模式在实践中出现,Stacks区块链也将继续保持活力和安全。

 

安全性取决于STX的价值和挖掘它所花费的时间

仅在规范的Stacks链分叉上导致安全故障(即通过重组造成的双花)有多难? 任何人都可以通过花费BTC成为矿工,因此在不失一般性的情况下,恢复规范链上的最后一个区块至少与花费比其他矿工为该区块加起来的BTC多的BTC一样困难。因为每个BTC区块最多选择一个Stacks区块,所以将规范Stacks链重组回N个区块的行为是赢得至少N + 1个区块的行为,这些区块由N个区块深的共同祖先块构建。这是需要进行重组的BTC区块数量的下限 - 在实践中,诚实的矿工将继续在规范链上工作,并将赢得他们自己的一些Stacks块,这反过来又增加了重新排序矿工必须赢得的Stacks块的数量。

 

对 N 个块进行重组的成本是多少? 这取决于 STX 相对于 BTC 的价值——STX 的价值越高,BTC 诚实矿工致力于挖矿的数量就越多(这在实践中得到了证实),因此重组矿工必须投入的 BTC 也就越多。 因此,重组的成本取决于 STX 的价值。

 

这类似于 PoW 区块链的经济安全性。就像在PoW中一样,Stacks链的每个分叉都有自己独立的“安全预算” - 攻击者必须花费安全预算才能进行重组,而安全预算是区块奖励的函数。在PoX中,唯一的区别是矿工使用另一个区块链的代币(在Stacks的案例中为 BTC)而不是能源。因此,Stacks不能是侧链、驱动链或合并挖矿链,因为这些其他系统的安全预算都不是其代币价值的函数。侧链、驱动链和合并开采链的安全都依赖于外部矿工,因为它们的安全部分是由外部矿工验证其区块来保证的。这些系统的责任是让外部矿工愿意这样做,在侧链、驱动链和不可视合并开采链的情况下,还有一个额外的责任来鼓励他们的节点完全挖掘区块(因为他们这样做不会获得链上奖励)。相比之下,BTC矿工既不会帮助也不会阻止PoX中的重组 - 他们只记录所有Stacks分叉的历史。

 

PoX在PoW之上提供了两个额外的、独特的安全属性。首先,无论重组矿工可以投入多少 BTC,执行重组的行为都将非常耗时。除非攻击者可以通过快速产生更好的BTC分叉来攻击BTC链本身,否则重组矿工必须至少在N + 1个BTC区块内承受攻击。这让诚实的矿工和用户有足够的时间注意到重组尝试并做出反应。

 

其次,所有Stacks分叉中出块的历史都嵌入在BTC中。这允许系统利用BTC的安全预算,以确保所有分叉都是公开的。这是因为产生隐藏的Stacks分叉的行为,其中分叉的区块哈希值不为诚实的矿工所知,是产生隐藏的规范BTC分叉的行为。因此,制造一个隐藏的Stacks分叉的行为至少与重组BTC链一样困难。PoX链利用这一特性不是为了防止重组,而是为了使重组无利可图

 

通过将区块锚定到现有区块链,PoX链迫使重组在公开场合发生,从而在发生时向所有诚实的网络参与者发出预警。诚实的矿工、用户和交易所将看到现有区块链上重组尝试的PoX 交易,并相应地调整他们的行为:诚实的矿工将增加他们的晋标,用户和交易所将需要更多的交易确认。这使得在进行重组同时赚取利润的行为更具挑战性,因为恶意重组 - 比如私挖和双花 - 依靠保密才能有效运作。具体到Stacks,矿工还有需要挖掘两个区块的“预热”期,在此期间他们必须在目标提交水平上花费BTC,但不会赢得任何Stacks区块。因此,高预算的重组尝试不仅代价高昂,而且还会在损失发生之前提醒网络中的其他人。

 

Stacks回收比特币的能量消耗以提高安全性

 

PoX中的挖矿过程与PoW密切相关。PoX和PoW 都是允许区块链分叉的单一领袖挖矿算法,并且都通过激励矿工发布区块并在规范链上构建来提供活跃度和安全性。两者的主要区别在于PoX不需要能量消耗;相反,它“回收”了生产PoW链代币所需的能量。运行Stacks本身消耗的能量可以忽略不计;比特币稀缺代币的支出扩展了比特币的能源使用,以确保两条链的安全。

 

将所有Stacks区块的哈希值和父/子链接记录到比特币链上,矿工不仅可以计算规范分叉,还可以识别丢失的区块。特别是,Stacks节点可以在获得区块之前学习规范分叉的区块头哈希。这使得进行eclipse攻击变得困难——节点会注意到一串不可用的块,如果它们碰巧落在从比特币计算的规范分叉上,它将能够推断出eclipse攻击正在进行并警告它的用户。

 

Stacks区块链状态有自主主权

 

仅仅因为Stacks区块链将区块生产的历史存储在另一个区块链中,并不意味着其他区块链了解Stacks。比特币矿工在设计上与Stacks无关 - 他们对待Stacks矿工的区块提交交易就像任何其他比特币交易一样。虽然Stacks区块链允许将某些Stacks交易嵌入到比特币交易中(例如PoX锁定和代币传输),但比特币矿工对待这些交易就像对待任何其他比特币交易一样。Stacks节点仅使用比特币区块链作为发现区块数据的共享广播媒体,这就是所有给比特币矿工提供的报酬。

 

STX代币和合约状态是使用Stacks节点而非比特币节点已知和应用的规则来挖掘和验证的。通过对每个块进行散列,并通过 OP_RETURN 输出将散列写入比特币区块链,链的状态在每个块提交交易中以比特币结算。Stacks区块链节点和矿工,而不是比特币节点和矿工,管理Stacks状态并维护链状态副本。比特币节点是不在乎的 - 它们扮演的唯一角色是挖掘区块提交交易,就像这些交易是任何其他比特币交易一样。

 

虽然 Stacks的Clarity智能合约可以验证任意比特币交易并确定它们在比特币链中的哪个位置被挖采,但首先必须有人将它们转发到 Clarity 合约中。类似地,虽然比特币交易的 scriptSig执行可能依赖于Stacks区块链中存储的状态(例如 HTLC 哈希原像),但有人必须明确地发送带有来自 Clarity 合约的状态的比特币交易。这就是Stacks区块链与Layer2系统的区别 - 它不是为扩展比特币的交易容量而设计的,甚至不代表比特币的状态。这是一个单独的系统,由于每个Stacks区块被锚定到一个比特币块,它恰好能够从比特币读取状态,并使用规范的比特币分叉作为其自己发现块的广播媒体。Stacks状态本身独立于比特币状态。

 

比特币矿工是Stacks区块链中的无利害关系方这一事实进一步将Stacks与合并挖掘链、侧链和驱动链区分开来。比特币矿工在Stacks区块提交交易中获得的唯一补偿是BTC交易费,该费用仅用于支付交易中比特币特定部分的存储和验证(因为这是比特币矿工为 Stacks挖矿过程做出的唯一贡献)。没有强制性的比特币挂钩,比特币矿工不开采 Stacks区块 - stacks链通过自己的矿工保持活力和安全。

 

那么Stacks是什么样的区块链?

 

Stacks是Layer-1区块链,具有独特的挖矿算法,可确保所有区块的历史记录都在比特币上结算。每个比特币区块最多挖出一个Stacks区块,如果存在竞争,则通过加密抽签过程随机选择获胜的Stacks区块。如果某Stacks矿工相对于其他矿工发送更多BTC,则他有更高的获胜机会。因此,像Stacks这样的PoX链实现了中本聪共识的变体,其自身的安全性和活性保证与比特币分开。这些属性将其与Layer-2系统、合并挖矿链、侧链和PoS链区分开来。

 

Stacks利用比特币的安全性为其提供一些其他地方没有的额外功能。其中包括公开所有分叉的能力(使诚实节点更容易检测待处理的重组),以及通过分叉长度衡量链质量的能力(使重组耗时)。此外,所有开采的区块都记录在比特币上这一事实意味着任何引导节点都可以确定网络中缺少哪些区块,并确定即使缺少区块,哪个分叉将成为规范链分叉。

 

下表总结了主要区别:

Stacks和其他类型链的主要区别
[1] https://github.com/stickfigure/blog/wiki/Proof-Of-Stake-Wears-No-Clothes 

 

作者

Jude Nelson从普林斯顿大学获得计算机科学博士学位,曾作为PlanetLab的核心成员,该实验室因实现行星级试验和部署而获得ACM时间测试奖。他的研究涵盖广域存储系统和 CDN。有超过10年的Vim使用经验。

原文链接:https://stacks.org/stacks-blockchain

 

使用Stacks

Stacks钱包
获取STX
栈押 (Stacking)
挖矿
去中心化应用 (Dapps)
稳定币 (Stablecoin)

学习

了解Stacks
Stacks 2.0 中文白皮书
传输证明 (PoX) 白皮书
Stacks改进提议 (SIPs)

开发者

开发者主页
文档
Stacks GitHub
Clarity智能合约语言网站
Clarity文档
Clarity教程
Clarity GitHub

生态

Discord
电报中文群
微信公众号和微信群
赠款 (Grants)
社区改进提案 (SIPs)
Stacks品牌资产

由Stacks中文社区创建并维护的Stacks中文网站。

上次更新:2022年1月