股权证明:内部外观


互联网上有很多非利士的文章和讨论,但是关于优点的信息不足。 在某个时候,作者意识到即使许多加密货币开发人员也无法完全理解其机制和许多相关的安全细微差别。 这在移植一种加密货币的PoS实现的真实案例以及第三方专家发现的有关漏洞的信息的进一步发布中得到了揭示。

本文将对所有已经遇到PoS漏洞或仍将继续存在PoS漏洞的开发人员很有用。


砍下吓坏了。


一段历史


在互联网上,Peercoin中权益证明(PoS)的出现可追溯到2011年在其中一个论坛上进行的讨论,其随后在Novaoin中的使用以及在PIVX和其他比特币分叉中的进一步分发。 一个相当原始的PoS逻辑被带入了kernel.h / kernel.cpp ,它以各种Frankenstein模块的形式在fork空间中徘徊。


PoS算法经历了几个开发阶段,有人给了他们版本。 现在出于自然原因对PoS选项进行了划分,DPoS出现了。 最先进的解决方案之一是以太坊中的Casper协议。


任何区块链都需要生成区块,并且某人应该有权构建新区块。 如果作者在像Git版本控制系统这样的区块链中没有太多竞争的情况下进行加密,那么在工作量证明(PoW)框架内,对于加密货币来说,为争夺区块的奖励而进行的激烈斗争-通过选择得出变量输入参数的组合来得出对应于结果的结果。由给定的目标(采矿,采矿)确定。


PoS取代了工作量证明(PoW),以避免浪费资源进行挖掘。 取而代之的是,所有输入参数都基于现有硬币持有者的节省量严格定义为具有恒定特性。 因此,如果您不使用各种方法进行硬币创造者的初始抵押式增值,则PoW是PoS的起点。


怎么了


对于开发商和硬币持有者而言,节约能源与限制生产商和消费者的温室气体排放同等重要。 残酷的事实是不同的:


  1. 基于PoW的项目受到所谓的 “ 51%的攻击”:攻击者可以利用强大的力量,创建平行链,然后突然以不同的硬币运动(即双重浪费)发布它,
  2. PoW矿工需要负担成本并投资于能力建设-这是项目的直接资本流出,
  3. 储蓄所有者希望通过自筹资金来维持其购买力,而不是关注自然通胀。

举一个活生生的例子:2018年11月至12月,曾有袭击发生的企图; 然后在12月至2月,人们轰动一时,这是在视频卡上进行采矿的最赚钱的硬币; 价格从2+降至0.5 USD; 转换为PoS后,费率在一周内升至1美元,投资涌入也有所增加。




技术要点


注意:在本节中,我们将讨论Peercoin,PIVX及其分支中的“传统” PoS形式。


您需要了解,没有针对“点”的集中化和解释。 在此版本中,运气原理与PoW中的运气相同。


1.术语


该术语相对笼统,但在不同的实现方式中,其细微差别为:


  • PoW目标 -目标=基本目标,通常为2 ^ 240(0x0000ffff ...)除以块的复杂度(增加前面的零个数)。
  • 区块难度 -区块相对于基本目标的复杂度,可根据当前的链增长速度确定。
  • UTXO-花费的交易输出,来自交易哈希和退出编号的一对。
  • CoinBase是包含奖励的区块中索引为0的特殊交易。
  • StakeCoinStake是一个特殊交易,其块中的索引为1。
  • 赌注输入 -符合大小和年龄下注要求的UTXO。
  • 桩号修改器 -每个桩号输入的确定性特殊计算参数。
  • Stake Hash是一个算术上应小于Stake Target的哈希结果。
  • 权益目标 -与工作量目标相同,但相对于最低出价按权益输入量成比例增加。
  • 块签名 - 块签名
  • 叉子 -分支链。
  • 拆分 -网络共享。
  • 孤儿 -由于选择其他替代方法而被丢弃的块。

2.解剖学


生成过程:


  1. 我们发现所有符合放样输入要求的UTXO
  2. 找到放样修改器。
  3. PoW目标乘以桩输入
    • 实际上是百万分之一-这就是为什么1 MH PoW哈希率实验得出等于一枚硬币的原因。
  4. 我们Stake Hash = H(Stake Modifier, Stake Block Time, UTXO output index, UTXO txid, Current Block Time)
    • 仅可变参数当前块时间
  5. 如果Stake Hash >= Stake Target ,则尝试在可接受的范围内找到Current Block Time
    • 您需要考虑乘以放样输入量,放样目标溢出的可能性,具体取决于实现方式。
  6. 我们将Coinbase放入tx [0],将CoinStake放入tx [1]。
    • Coinbase的受益人是与Stake Input相同的脚本(地址)。
  7. 我们在块上签名。

2.1。 封锁时间:


很容易看出,骗局会随着时间的流逝而带来一些好处。 标准共识限制了上下限。


较低的总是设置最后N个块(通常超过11个)的块平均时间。这是生成节点的时间不准确的公差。


在2点钟时用手指指着PoW的历史上限。 增加间隔会降低复杂度并使分支的吸引力降低-因此,这没有任何意义。 但是对于PoS,这是有道理的。


PIVX和其他限制将来的时间最多为3分钟。 有些人设置了更严格的限制,但这给用户带来了问题。 一些PoS实施方案已决定将最小当前阻止时间间隔从一秒更改为15-16秒。


2.2。 放样修改器:


放样修饰符被认为是使预测变得困难并建立未来链的一种方法,但是出了点问题...


有多种计算方法:在逐渐指定的时间间隔的末尾,块的散列的最后几位,来自先前块的预测值[不是很差],等等。 在某些地方,它看起来更像是混淆代码,而不是理智的东西。


原始间隔为64个间隔。 此差距逐渐分为64个不相等的部分。 边界四舍五入到分钟。 在边界处,选择现有块,并从它们中获取最后一位。 结果是一个64位的数字,类似于Nonce。


Peercon的时间间隔为20分钟,但PIVX的人员认为1分钟的时间间隔(四舍五入为分钟)是医生命令的。


通常,在某些实现中,例如Blackcoin V2 +,所有内容都是固定的,并且从头算起Stake Modifier,而在Peercoin V03,PIVX,Blackcoin V1和其他实现中,则是从Stake Input模块输入的。 后者几乎完全破坏了意义。 有一种假设认为,混淆是由于命名变量,进一步的变形和周到的复制粘贴的平庸问题所致。 作者本人很晚才发现问题,而他的全部注意力都集中在针对DoS的防护上。 不要被抓住!


2.3。 块签名


由于该区块的哈希不再用作工作量证明,并且任何人都可以从其他人的区块中进行已签名的CoinStake交易,因此您需要检查该区块是否由Stake的所有者创建。 因此,标头使用与CoinStake相同的私钥签名。


2.4。 CoinBase和CoinStake退出脚本


为了保护隐私并避免在一个钱包中链接各个地址,需要使用相同的退出脚本或人们称为钱包地址的退出脚本。


2.5什么地方?


它们在CoinBase和CoinStake中处理金额的方式各有不同。 在特定情况下的逻辑和动机:


  1. 必须将金额分开存放,以避免由于处理错误而造成的用户资金损失甚至最小。
  2. CoinBase会保留其100个确认信息,但是CoinStake可以立即使用,这当然会带来重复消费的风险。
    • 捕捉到块的深度也与用作桩输入的年龄限制相矛盾。
  3. CoinBase和CoinStake永远都不应进入内存池,并且在链重建期间应删除基于它们的所有交易。

3.针对标头完成块


完整的节点进入网络始于同步。 在比特币中,同步主要基于块头,例如 它们包含足够的信息用于初步验证共识。 首先,从一个侧节点拉出相对较小的接头,并分批检查(最多2000件)。 如果初始检查成功,则将所有块从所有连接的节点并行拉出。


防洪保护基于以下事实:本地节点将最知名的标头与其拥有的标头进行比较,并请求整个标头链。 下载时,磁盘空间和计算成本低廉,可以检查所有内容。 根据诸如链条之类的特征比较链的权重,链条是每个单独区块的复杂度之和。 要构建如此强大的替代链,将需要投入大量资源,这将使攻击毫无希望。


对于PoS,此方法不起作用,因为 要检查块,您需要处理完整的先前块,至少要达到最小放样年龄。 作者所看到的实现并没有开始变态,而只是拒绝使用标头。


因此,作者在标头之后实现了块的并行机会下载,由于使用了所有连接,因此大大提高了同步速度。 仅当对等方位于不同的链上时,才会发生较小的延迟-然后,如标准方案中那样,在稍有超时后,连接将断开。 负值是在同步时选择错误链的趋势。


顺便说一句,如果其中的一些出于各种原因失败,那么标准的比特币客户端及其分支已经选择了至少8个标准的传出连接的最小标准数量。 异步出站连接已解决此问题。


4.叉,叉和孤儿


在积木竞赛中,1-2个链接的替代链比较普遍。 只有在由于编程错误或全局Internet中断而导致共识性史诗性失败的情况下,发达网络中的长分支自然会发生。


即使存在分离,通常也不会威胁到交易处理的完整性,因为 分离块时,所有事务都将返回到内存池,并且已包含在其他块中。 Mempool是创建事务后的临时存储库。 Mempool本身以最新版本保存到磁盘。 该方块的奖励被破坏。 这就是为什么要设置奖励的最低确认数(深度)的原因。


假设本地网络段已经与主网络建立连接,那么它就会失去与外界的连接并继续挖掘。 这些分支通常由于其自然弱点而不会构成威胁。


上面已经描述了PoW的主要51%攻击-它非常耗费资源,但是对于PoS来说,它变得相对负担得起。 因此,从链的各个环节生产许多分支在技术上成为可能。 经典的解决方案之一是禁止将叉子叉入一定深度以下。


这样的保护的主要问题是,在重新启动后,隐蔽段中的节点无法独立返回主电路。


因此 ,仅当链的顶部还很年轻时,才实施一种方法来禁止比特定时间段早的叉子。


在目标间隔为1分钟的情况下,在1小时内选择了旧叉子的标准,这大约相当于CoinBase确认的60%,并且在15分钟时的王冠年轻标准比最大统计阻挡延迟高3倍以上。


5.阻止和拆分哈希


在PoW中,块哈希完全覆盖了所有数据。 它还用于检查目标。 在PoS中,权益哈希是一个单独的值,因为 有必要排除其选择的可能性。 这带来了主要的威胁-基于相同的重合桩产生无限数量的不同版本的块的能力,这很容易泛滥并放置网络或其单个节点。


天真的防御方法会导致更严重的分裂漏洞。 不同变体中的一种这样的方法是仅允许一次使用放样输入。 一种简单的攻击是将不同的块发送到不同的节点,这立即创建了一个软拆分。


使用DoS禁令加剧这种情况更为致命,因为DoS禁令不仅将链条划分,还将网络本身划分为不同的部分。


出现其他问题-无法使用掉落块中的桩。


因此 ,选择节气门方法是最安全的解决方案-同一桩号每分钟最多只能使用一次。 逻辑很简单:一次攻击只能持续1小时(请参见上面的旧分叉),因此最多可以淹没60个块。 最好的情况是,在下一个块中,网络将已经移动到单个电路。 在最坏的情况下,如果连续攻击,将在一个小时内发生。 最坏情况的可能性-连续找到多个区块,呈指数级分解。


尽管如此,在完全同步之前,节点仍然容易受到中等洪水的影响


6.最低年龄


对于某些人来说,这种限制令人困惑,但是对于网络稳定性而言,这极为重要,因为 此参数与备用网络的最大长度直接相关,本地节点将能够检查该长度,而不会造成严重的技术失真。


如前所述,本地节点必须处理直至使用期限的所有块,以便能够验证赌注输入a)的位置是否为b)确实是UTXO且尚未使用。


仅通过所谓的功能检查这是可能的。 CoinView,这是特定块时硬币的运动状态-在了解本地节点时主链的顶部。


按时间间隔甚至以CoinView所保存的特殊方式对替代电路进行全面测试似乎是没有希望的,因为 这些替代链的数量是无限大的。


对于UTXO的年龄限制过大的标准会对想要花费或组合其部分硬币的用户产生负面影响。


如果在块的深度中指定此边界,则由于没有合适的UTXO的事实,一个完整的链停止的假想僵局情况。 在时间单位的情况下,至少发生一些运动。


因此 ,在其他网络中,以绝对时间单位而不是块的深度来平衡选择1小时。


7.有什么比最低数量的N UTXO好或总N的一个UTXO好?


这里的比喻是乞讨自己:更好的是一把枪的精度为0.9,三把枪的精度为0.3,但是概率为1/2 ^ 20,这样的计算结果似乎是平均的。 一张小地图会混淆资格的成熟度。


当前关于许多小交易找到更多块的看法可能可以追溯到在确定权重时也考虑了股权投入的年龄。 那时,旧的小交易确实很有意义。


目前,根据实际实验和理论计算,大型UTXO中的分组带来了更多的障碍。 此外,更少的UTXO需要更少的CPU工作。 有人主张相反。


因此 ,请自己考虑。


8.向前跑块


PoS矿工自然胜过区块时间。 这会更严重地影响网络的复杂性。 标准的比特币代码选择接收到的第一个块,而不管其中指示的时间如何。 大多数PoS实施都执行相同的操作。


因此,如果当前块的时间向前移动,则改变PoS挖掘器逻辑,以便从块的平均时间开始选择。 同时,在比较顺序之前,节点会比较块的指示时间。 PoS挖矿器发现发现的块将发送到网络,即使它发现它正在生成派生。


这样,还可以保护网络免受假设的过早发送的块的影响,这些块由于DoS保护而无法在接下来的60秒内使用相同的Stake Modifier使用Stake Input。 就像随着时间的流逝而受到双重惩罚一样。


9.小清单


  1. 放样点之前,放样输入必须是有效的UTXO:
    • 在主链的情况下,分叉点是尖端,
    • 如果是备用电路-分支点之后的UTXO在切换时可能导致自DoS,
    • UTXO不应单独位于内存池中。
  2. 重建主电路时,请勿在内存池中接受CoinStake:
    • 同样的事情发生在CoinBase上
    • 这可能会破坏交易链(不太可能)。
  3. 如果顶部还活着,则不要接受来自旧块的叉子。
  4. 桩号输入的绝对时间期限是稳定和安全所必需的。
  5. 桩哈希只能从块时间更改。
  6. 放样修改器不应绑定到放样输入块。
  7. 使用块标题需要在网络上和重新索引期间进行特殊处理。
  8. CoinStake记录在本地钱包中,需要进行一些更改才能正确显示orfans。
  9. PoS矿工最有可能拥有足够的门槛,需要用文件定稿。
  10. 重新索引需要改进,因为 它与标头类似地工作-首先加载并仅检查块的索引,然后仅尝试处理块。
  11. 如果向PoS的过渡不是硬编码的,而是通过spork进行的,则您需要在启动时捕获它,因为 子项未保存。
  12. 达世币(Dash)和比特币(Bitcoin)中的检查站几乎是虚假的,需要进行非常认真的修订。
  13. 如果Dash fork版本最高为0.13,则在简单用户模式下处理masternode数据存在问题。
    • 随着客户端的频繁重启,网络视图会失真。
    • 如果以图形模式运行,最好忽略缓存。
  14. 考虑到块时间,更改最佳块的选择。
  15. Bitcoin .
  16. mempool CoinStake .





. mainnet PoW , , PoS, . PoS Ethereum Casper'.


GPU - — ethminer'. 150-200 GH (ethash). - PoS .


PoS PIVX 2.x " ". - PIVX , , . , PIVX 2.x . Dash 0.12 Bitcoin'.


, PoS . , , .




. . whitepaper -.



PoS PIVX Bitcoin/Dash. CoinStake . PoS .


, Stake Modifier Stake Hash , Stake Input . - , - PIVX .



— . :


  1. .
  2. .
  3. — .. , .
  4. , - , .

. spork' , .


, . spork' .


PoS


, - . spork, , .



, .. . , .



testnet, .


testnet 3 1 mainnet, .



PoW , PoS - , 1e6 PoW.


. mainnet Stake Input.


.


PoS


X spork PoS . - , .


. , . .


, , .



Stake Modifier . . PIVX - … , , Ethereum, .




结论


- , . , PoS , . .


: - .


GitHub

Source: https://habr.com/ru/post/zh-CN442862/


All Articles