从RSK的角度对Stacks区块链评估

作者:Sergio Demian Lerner, 2021.5.13 英文版 在这篇文章中,我分析了Stacks区块链,并将其与RSK进行了比较,特别是关于它们的起源和共识协议。为了使本文尽可能简短,其他平台的特点,如其生态系统,将在后续文章中进行分析。虽然这篇文章打算做一个纯粹的技术评估,但我对Stacks的研究使我对PoS系统中公平的硬币分配有了更多的哲学讨论。我尽了最大的努力去了解Stacks的共识,由于缺乏文档,我曾多次把头撞向墙壁。然而,Muneeb和Stacks论坛的人们都很友好地回答了我的技术问题1。如果你发现对Stacks协议的描述不正确,请与我联系,我将修改这篇文章。

起源 #

RSK和Stacks都有一些共同点:它们是唯一被其社区宣传为在比特币之上提供智能合约的项目。但它们非常不同,对建立在比特币上的意义和什么是加密货币观点是相反的。

RSK是一个在2016年设计的比特币侧链(我参与了它的设计)。它在2018年由一个拉丁美洲草根比特币玩家团体开发并最终推出,他们成立了RSK实验室。它很快就发展了自己的社区,并有拥有共同的比特币价值观。RSK在将近一年的时间里没有受到新闻的关注,因为比特币者都在关注闪电网络的发展,因为它是比特币唯一的支付扩展性解决方案。在第一年,RSK的有机增长与比特币闪电网络相当,慢慢地征服了拉美地区的无银行账户的人,并且与投机性的使用情况相当遥远。RSK社区的核心是一个开放的新金融系统对金融包容性的好处,并相信有状态的智能合约和以比特币为抵押的稳定币是有利的关键。在最初的几年里,RSK社区不断建设基础设施,如易于使用的钱包、on-ramps和off-ramps,以准备好迎接黄金时期。2019年,‘DeFi’热潮开始,从以太坊开始,但随着以太坊的gas价飙升,又转移到RSK和其他兼容EVM的区块链上。DeFi开发者意识到,DeFi应用不需要被束缚在单一链上,而是可以在EVM兼容的平台上轻松成为多链。RSK由于其高安全性和廉价的交易而被选中。在2020年和2021年,RSK社区在RSK上创建了许多新的DeFi dapps。更多用户的存在加速了一个良性循环,钱包原生地整合了DeFi应用程序,在2021年,数以万计的新用户成为DeFi的活跃用户。

Stacks的创建和开发更加中心化。Stacks是由Muneeb Ali2017年创建的,之前的名字是Blockstack。他写了所有的白皮书,并成立了Hiro Systems PBC公司来开发这个项目。他从已知的风险投资公司筹集了几轮投资。许多应用程序是为Blockstack开发的。截至2021年5月,Stacks平台似乎有几百个日活跃用户,如果你看一下区块资源管理器中的交易量。然而,似乎活跃用户不等于Stacks上的活跃地址。用户可以注册一个用户名(域名),而没有任何区块链交易。我被告知,explorer只反映了智能合约的活跃用户,而不是需要用户名的应用程序的活跃用户(这很难衡量)。

关于早期VC和预挖参与Stacks的问题,人们意见不一。在以太坊进行预售之前,预挖是一个坏词。现在对于资助新项目来说是很常见的。当然,对于一个为权益证明支付利息的加密货币来说,硬币应该在成千上万的用户中公平分配,以增加共识的安全性,避免出现财阀。

最后,鉴于Muneeb学术界资历,我对不存在描述Stacks PoX共识协议的科学论文感到失望。没有健全性或有效性证明。白皮书只是肤浅地解释了PoX共识。

激励机制一致性 #

RSK 是一个比特币侧链。这意义重大。它意味着不需要其他代币来使RSK工作。它意味着比特币是RSK的原生币,它意味着只要比特币仍然是价值储存,RSK就不怕内在的货币风险。比特币矿工在合并开采RSK时赚取交易费。这种流动激励了提高比特币和RSK的安全性。大多数比特币矿工参与了RSK的合并开采。

Stacks在营销材料中宣布自己是比特币的伙伴,但在内部它与比特币社区(矿工、持有人或基础设施供应商)没有共同的激励。Stacks和比特币之间的唯一联系是,Stacks使用比特币区块链作为技术来确保共识,作为副产品,Stacks有一个比特币区块链预言机。Stacks 2.0的原生货币是STX,而不是比特币(而且Stacks上没有包裹好的BTC代币!)。由于Stacks开发者的意图是人们堆积(长期锁定)STX代币,看起来STX的激励用例是作为一种价值存储,直接与比特币竞争。在比特币社区和Stacks社区之间发生对抗的情况下,比特币矿工可以审查Stacks PoX交易(他们可以很容易地被区分),导致问题或Stacks共识的停止。由于Stacks和比特币之间缺乏跨链激励,Stacks是一个Remorachain

综上所述,Stacks与Ethereum、Avalanche、Cosmos、Arbitrum以及所有其他智能合约区块链竞争,这是对Stacks的褒奖。我只是不相信 “建立在比特币上 “的口号。

区块链共识 #

RSK使用merge-mining来保证其链的安全,其安全性是由在RSK上交易的价值,以及比特币矿工不攻击比特币侧链的动机所赋予的。加密经济的安全性随着费用的增加而上升,但在第一年,RSK主要是由51%的诚实挖矿的多数来保障。由于超过68.5%(月平均)的比特币矿工也在挖RSK,而且这个比例在逐日上升,RSK的安全门槛正在迅速接近比特币的。在起步期,合并挖矿的安全性一直被批评认为不安全,但RSK已经成功地超越了 “不安全区”。

在合并采矿的基础上,RSK有一个去中心化的保护系统,称为Armadillo。Armadillo节点可以在潜在的恶意分叉造成破坏之前检测到它们,并提醒网络注意它们。任何用户都可以运行这样一个节点。

至于未来,RSK社区也在评估实施一种标准合并采矿的创新改进,称为Inclusive Fork-aware 合并开采。

Stacks的共识协议被称为Proof-of-Transfer (或称PoX)。矿工们为创建区块的权利进行投标。选择区块提议者(称为领导者)的过程类似于全付费拍卖。在全付费拍卖中,所有竞标者必须支付他们的出价,即使是那些没有赢得拍卖的人。竞价是使用比特币进行的。竞价将被发送到一些 “堆积者 “地址,这些地址是通过多方随机数生成过程确定的。随着时间的推移,PoX机制显然会经历一些转变(sunsetting过程),越来越多的比特币被烧掉而不是被转移。谁是Stacker?Stacker的集合是如何演变的,他们与矿工的联系是什么?这个机制对比特币社区有什么贡献吗?

Stacks共识协议是没有正式化,也没有安全证明的。PoX白皮书中的描述是模糊的。之前有一个Stacks 1.0共识协议,模仿中本聪的共识,通过匿名的虚拟矿工燃烧比特币来实现其安全性。最佳链获得的安全性是由燃烧的价值给出的。最佳链是拥有最多燃烧值的链。Stacks 1.0共识是很容易分析的。但是在Stacks 2.0中,假名的*区块生产者*通过将比特币转移到另一个被称为*stakers*的假名团体,在一个名为STX的新代币中进行定期存款,来竞标创建区块的权利。作为回报,堆积者对Stacks链的版本/分叉发出信号(投票),作为当前的版本。堆积者对STX的锁定被称为堆积(不要与钉子混淆)。

论文后来提醒说,随着时间的推移,Stacker可能与区块生产者重叠或串通,然后区块生产者将只是给自己付钱,使共识协议不安全。社区很有可能永远不会发现这一点,直到它太晚了。该文件提出,如果社区检测到重叠(很难,因为所有参与者都是假名),社区将把网络硬塞给以前的共识协议(Proof-of-Burn),或者以某种方式由中央机构决定将比特币支付给谁。对于更多的信息,白皮书将读者重定向到改进建议,其中包含废弃的信息(Stacks 1.0)或白皮书内容的完全复制。

Stacks共识类似于两院政府,这种想法在区块链生态系统中并不新鲜2。在这种情况下,每个议院的多数成员决定议院的投票,两个议院的投票必须匹配,以达成共识。这种想法本身并没有缺陷,但要求至少其中一个议院的参与者可以事先被识别,或者在发生欺诈时可以承担法律责任。如果没有,那么它代表了对所有假名演员一起的honest majority assumption。这与权益证明(没有slashing)没有区别,这些参与者不作弊的唯一动机是未实现的未来收入。

最后,根据Stacks 白皮书,Stacks区块生产者也可以生产Bitcoin-NG风格的微区块,频率高达每秒一个,但我找不到任何方法看到它们。我被告知,微型区块可以每30秒产生一次,而且这个功能已经实现,并且可以使用,但没有反映在区块探索器中。

共识安全 #

RSK的共识是基于合并挖矿,众所周知,当参与区块链的激励机制一致时,当大多数矿工参与时,当合并挖矿链支付的费用对合并矿工意义重大时,合并挖矿就能实现高安全性。RSK在这三个条件上得分很高。RSK是一个比特币侧链,平均68%的比特币矿工会对RSK进行合并挖矿,支付给矿工的RSK费用一直在稳步增长。

对我来说,不能说Stacks PoX在确保共识安全。PoX文件中关于安全的说法似乎是循环的:只要Stacker为他们所扩展的链投票,区块生产者就会得到STX的奖励,只要区块生产者遵循他们投票的链,Stacker就会得到奖励。然而,我后来被告知,Stacker对最佳链的投票只是对矿工的一种提示,并没有真正通过共识来强制执行3。我仍然认为,如果这两组人同时勾结并偏离,他们可以重组链,并强加任何他们想要的分叉而不受惩罚。

另外,一旦攻击者勾结起来接管区块生产(政变),他们就可以超越任何诚实的区块矿工,因为他们从支付自己的费用中获益,而诚实的入侵者必须支付恶意集团的开采费用,否则就烧毁硬币。幸运的是,诚实的大多数Stacker可以通过使用协议中的一个防止stacking审查的功能来恢复。这是通过使用特殊的比特币交易(称为Stack-STX,Transfer-STX,PreSTX)来实现的,但要重新获得治理的控制权,他们需要超过攻击者的股份,攻击者也可以堆积更多,只需保持投票时占多数即可。最后,控制大多数堆积了的STX的集团有可能保留权力,就像PoS一样。为什么stacker会提供一个最佳链的提示?我不知道。似乎如果矿工遵循这个提示,这就削弱了协议的安全性。如果他们这样做,没有slashing的事实意味着,阻止政变重组区块链的唯一因素是他们持有的STX的潜在价值损失。在任何情况下,就像在任何区块链中一样,大多数矿工可以通过忽略它来审查矿工的矿区,并挖掘一个兄弟区块。

PoX比PoS有一个好处:虽然区块生产者可以被审查(矿工可以跳过区块),但他们不能被沉默,因为比特币区块链被用作安全广播媒介。Stacker可以被竞争,但不能被审查。最后,最后的手段是UAHF,没收恶意Stacker的STX。

正如PoX白皮书所述,PoX保持安全的唯一方法是防止区块生产者也进行stack,这只能通过一个依赖于信任的团体来stack流通中的大部分STX来实现。换句话说,就是一个财阀。为了避免成为一个财阀,PoX需要在许多人之间进行初始币的分配,这与PoS完全一样。因此,我决定找出4个月前Stacks 2.0推出时的硬币分布情况。

预挖(Premine) #

Stacks 2.0对之前的区块链账本进行了快照,称为Blockstack,这是一个比特币区块链覆盖协议。你可以在这里查看传统的Blockstack账本。你可以用一个验证脚本来验证余额迁移的正确性,这里。看来Stacks背后的团队对众多投资者和创始人之间的硬币分配一直非常透明(你可以找到它,这里)。这是2018年至2021年创建和销售的13亿个代币的总体分配情况(1B STX)。更多的硬币在2021年通过vesting分配,(346M STX)。

非常凸出大部分币集中很少几方手中。为避免在如此集中的分布,以太坊是从先PoW开始,再进入PoS时代。代币的集中是危险的,因为如果少数参与者被黑客攻击,攻击者可能会得到区块链共识的控制。另外,代币集中度随着时间的推移而增加,导致富者越富。

除了这个图表,属于投资者的具体地址没有被披露。这对于个人隐私来说是可以理解的,但公司、风险投资公司和基金会应该披露。我决定回顾一下代码,寻找这些信息。从1.0转移到2.0的余额被存储在一个名为chainstate.txt的文件中。我解析了这个文件,发现了几个有趣的事情。

首先,我了解到有33万个账户的余额不为零,但有322万个账户正好持有100个STX。这是按金额划分的硬币分布。

通过谷歌搜索,我发现这100个STX钱包对应的是空投在2020年与一些多币种网络钱包合作进行的。然而,由于这些网络钱包还没有实现对Stacks 2.0的支持,用户余额是锁定。这些账户中似乎只有2.4%(8K)是活跃的,所以直到1月份,非托管钱包的活跃用户数量一定是8K左右(我没有计算链外用户,这是很难衡量的)。

第二,我了解到,16个余额最高的账户持有5.03亿STX代币,超过了Stacks 2.0推出时存在的50%的代币。这似乎与公布的图表一致,尽管其中一些地址可能是交易所的钱包,或其他非托管用户钱包的聚合者。下面是Stacks 2.0推出时的前5个地址,以Stacks 1.0地址格式列出。

  1. 138 M STX: 1AtPvrrMiuBdoA6R6atZpgfLsRM7V9ep1W

  2. 45 M STX: 3PJ31s6hBNqWZxomHE1JZPUq78tNyQmepA

  3. 43 M STX: 1NDhoMmGDiwqcFTohUMXkidymcxG12Q82x

  4. 36 M STX: 17UxtH36S3AFM3odE8MQepqMFhNR1sKUWb

  5. 30M STX: 31tXY8LMEcc3YzWwpFQj7ZGYE2U2BM1kk4

第一个持有1.38亿STX。下面是前5个对应的Stacks 2.0地址(你可以用这个库将Stacks 1.0地址转换成2.0)。

  1. SP1P72Z3704VMT3DMHPP2CB8TGQWGDBHD3RPR9GZS
  2. SM3PFM748JYCK9H823C8BGRGFRHFPXHPP8F2FFRV8
  3. SP3MC3C65ZCS9X9W27EFWQW5ME3W7N7632VWE89G3
  4. SP13HN8N68CFASWYBX6C78XP5HF50EHJENRYQHJ7S
  5. sm12tjxjeqqer0ewx6783rwh1r8yzg3m9sbqvdfh

其中一些人仍然收到代币,作为从Stacks 1.0开始的归属时间表的一部分,并在Stacks 2.0继续。这些地址现在似乎都没有参与堆积(stack),但是大量的STX已经从这些账户中转移出来(1AtPvrrMiu现在只有46M STX),所以需要更多的研究来追踪他们的所有者是否还在使用其他地址进行堆积(stack)。

更有趣的是,Stacks 2.0推出时的基尼系数是0.96,这在我看来是相当高的。在现实中,该系数可能会更高,因为几个地址可能属于同一个人或组织。大型交易所的持有量也会增加该指数。有几个尝试测量了比特币和以太坊在不同时期的基尼系数,Stacks在创世时的系数似乎比任何一个都要高得多,表明中心化程度较高,这对引导权益证明系统并不有利。然而,由于每个测量方法的不同(窗口法与静态余额,截止金额等),我无法公平地比较他们的基尼系数。

总而言之,Stacks有一个用于达成共识的权益证明 系统,与其他许多PoS系统一样,如果初始代币集中度高的话,往往会使富裕的一方变得更富有。网站stacking.club在一个漂亮的用户界面4中显示了所有关于堆积者(Stacker)和押金周期的信息。

同样有趣的是,这种创世时STX的高集中度一直持续到今天,在每两周的奖励周期中重复出现。例如,在堆积周期#6(最后一个),只有12个堆积者(stacker)集中了超过51%的总堆积币(385M STX)。其中一些堆积者可能是堆积池,包括数百名参与者,如比特币矿池。

RSK没有预挖,因为侧链不可能有预挖,因为没有coin minting。RSK生态系统发展基金,会收到RSK交易费的一部分,为RSK的发展和研究贡献了数倍于收到的金额,首先由RSK实验室支付,后来是IOV实验室。

比特币桥 #

Stacks的文档指出,“Clarity合约内置了比特币的SPV证明,可以使开发者与比特币状态的互动更加容易’’。但仍然没有与比特币的实时桥梁。我被告知,有一个包装好的BTC服务(由TokenSoft提供)正在进行中,并计划进行双向挂钩的工作,但没有公开的路线图。

RSK是一个比特币侧链,因此只能存在于与比特币的双向挂钩中。因为RSK包含了只有header的比特币区块链视图,这个视图需要由用户通过调用Bridge合约来更新。一个有趣的事实是,在RSK推出后的第一周,调用桥接通知挂入是免费的(由共识强制的零交易费用),因为RSK中没有比特币来支付费用

该桥从联盟挂钩开始,然后增加了标准的HSM安全,最后迁移到Powpeg:它是这样的系统,其中硬件安全模块(HSM)与定制的固件和固件证明保护多签名的私钥,并只根据RSK区块链收到的命令进行操作。这些命令在HSM中使用RSK区块链中由合并挖矿提供的累积工作证明进行验证。关于RSK Powpeg的概述可以找到here

智能合约语言 #

RSK VM与EVM(以太坊虚拟机)高度兼容,它与Ethereum web3标准兼容。大多数以太坊应用程序可以移植到RSK,只需做一些配置上的改变。RSK虚拟机与EVM并不完全相同,其中的差异有记录,这里。Solidity是用来为EVM编程的主要语言。它并不完美,几年来我一直批评使用不成熟的语言所带来的安全问题。然而,它成了一个事实上的标准。现在,每个新版本都修复了较少的错误,语言的变化也很小,实现了稳定性和向后兼容性。

如果你需要合同提供更高的安全保证,你可以使用你自己的DSL来编译成EVM字节码。尽管有几个工具可以对Solidity合约进行形式化分析,但Vyper语言也可以编译为EVM,它更适合用于形式化验证。

Stacks使用Clarity编程语言的一个解释器。当Solidity推出时,我对它的批评也会给Clarity,或Simplicity或Vyper。为什么还要发明一种新的智能合约语言,有这么多的智能合约?然而,让我们集中讨论Clarity的优点和缺点。Clarity是一种新的类似LISP的语言。作为一种新的语言,缺乏教程和社区库是其主要缺点之一。我发现的这一设计决定是有趣和独特的,它在节点中编译Clarity而不是通过bytecode或运行JIT编译代码,这需要从头开始编写一个Clarity编译器。编译Clarity带走了普遍存在的编译器错误和供应链攻击的巨大问题。然而,LISP是一种特别容易编译的语言,所以我不太确定这个好处。

节点编译文本文件的事实意味着合同代码会更大,执行速度会更慢。试图通过即时编译源代码来提高执行性能,将把编译器的所有复杂性带入完整的节点中,并带来编译器炸弹的额外风险。编译Clarity的CPU和存储资源的额外成本现在可能并不重要,但在未来可能会阻碍Stacks的可扩展性。所有已知的在不改变安全模型的情况下扩展区块链链上层的技术都是基于更有效的资源利用带来的不断加速。

Clarity使用LISP符号,如果你以前没有使用过,你可以轻松地学习。该编程语言名副其实。它有有用的本地类型,如结构体、列表和字节缓冲器,但没有浮点。LISP符号也很容易解析代码并对其进行语义分析。

事实上,第一个编译到EVM的语言,叫做LLL,就是受LISP启发的。由于我在Java中实现了一个LLL编译器,我可以证明创建一个从Clarity到EVM字节码的编译器是一件容易的事情,而且RSK有一天可以从Clarity工具链中受益。你可以将Clarity编译成EVM,但你不能做相反的事情,因为Clarity语言不是图灵完全。

非图灵完全语言的主要好处是可以提前计算出最大的gas成本,而且用自动化工具对程序进行形式化分析也比较容易。缺点是许多复杂的DeFi应用可能更难编码,而且大多数程序员对限制性语言不太适应。

虽然我更喜欢Solidity,但在这个帖子中,一位Stacks的开发者将Clarity与Solidity作了很好的比较。

属性总结 #

在这里,我概括我在这篇文章中评估的所有特征和属性的总结。

(*1) 由于Clarity与Algorand是一个团队合作,两个区块链之间可能会出现一个标准。

(*2) Stacks平均区块间隔是由Stacks区块浏览器中显示的区块近似得出的。

最后的话 #

由于我每天都为RSK做贡献,而且我是一个比特币玩家,所以我对Stacks和RSK永远不会100%客观。

这些是我对Stacks的个人批评。

  • Stacks在营销中把自己和比特币联系在一起,这是一种误导。
  • Stacks的共识协议是复杂的,未经证实的,没有很好的记录。
  • Stacks的共识可能会导致堆积者(Stacker)与区块生产者勾结,并成为一个事实上的PoS系统,而不需要Slashing。
  • Stacks宣传自己是比特币的智能合约,但Stacks区块链还没有任何代表比特币的代币。
  • 清晰的语言可能会阻碍扩展,导致交易成本增加,因为高级语言的解释执行可能比bytecode执行慢一个数量级。
  • 缺少编程教程、课程、文件、样本和库。
  • 平均区块间隔是10分钟(协议允许每30秒有一个微区块,但没有关于这个功能的文档,没有区块浏览器显示它们)。

这些是Stacks的优点。

  • Clarity语言编译消除compiler supply attacks, bombs and bugs。
  • 共识系统激励了锁定STX,降低了市场上提供的代币数量。

关于RSK,这些是已知的好处。

  • 与比特币生态系统保持一致的激励机制
  • 与以太坊应用兼容
  • 由著名的合并挖矿技术保障
  • 大于60%的平均比特币算力保障了RSK。
  • 共识的安全性是由RSK上的交易价值,以及比特币和RSK之间的共享激励机制赋予的。
  • 比特币矿工获得了RSK的大部分交易费用。
  • 支持EVM的好处,EVM是一个标准化的编译器工具链,不断改进。
  • 大量的在线编程教程、文档、示例应用程序和经过审计的库
  • 在加密币生态系统中几个支持EVM的区块链之间共享研究和开发工作。
  • 平均区块间隔时间为30秒。

而这些都是已知的RSK的缺点。

  • RSK双向挂账(Powpeg)要求至少51%的挂账实验室在线,以允许挂账退出。
  • 如果由没有经验的开发者编程,Solidity合约可能容易出错
  • Solidity编译器可能包含错误
  • RSK(RBTC)中的比特币与比特币网络(BTC)中的比特币没有相同的安全模式。

  1. 然而,如果真正实施的共识与文档中的内容不同,没有人可以写一篇关于PoX的文章,在发表后,有人私信告诉我这一点。 共识协议的文件应该是毫不含糊的。这是科学论证的先决条件。 ↩︎

  2. 例如,RSK中挂钩资金的安全模式类似于两院制政府:它要求51%的挂钩者和51%的矿工之间不存在串通。只有在至少其中一个议院的参与者可以公开识别的情况下,两院制的治理方案才是安全的。在RSK的案例中,每个pegnatory的身份都是公开的,并由其他的人验证。虽然印在区块上的矿工池身份可以被操纵,但这种混淆只能在短期内发生,因为比特币社区经常检查矿池的算力分布。两室治理的安全性依赖于诚实的多数假设,如果参与者是假名的,获得多数治理份额的唯一障碍是假名购买并锁定代币,就像Stacks共识的情况一样,这种假设很难维持。 ↩︎

  3. 然而SIP 007指出,“除了一个锚块需要达到一定数量的矿工确认外,它还必须通过一些阈值=t=的*有效的堆积支持信息信号*"。而这些信号在 “提交奖励地址和Chain tip信号 “中被定义为 “表示对某一chain tip的支持”。 ↩︎

  4. 如果你想从比特币区块链浏览器中浏览地址,Stacks的区块生产者创建了普通的比特币交易,其中第一个输出包含一个OP_RETURN操作码,然后是Stacks 2.0的数据推送,以 “X2[“开始。下面的输出支付给堆积者(Stacker)。相比之下,一个RSK区块标签只能包含在比特币/coinbase/ /transaction/中,这是只有比特币矿工才能做的事情。的确,比特币矿工的这种包含将RSK的安全性与比特币的安全性联系起来。 ↩︎