Proof of Stake - 股权证明 系列2

月亮🌛   |     |   928 次阅读

译者:Max

什么是“缺乏利害关系”(nothing at stake)问题以及如何解决这个问题?

在包括点点币的许多早先股权证明算法中,生产区块只会产生奖励而不会产生惩罚。这种设计有着一些不幸的后果,即当多条相互竞争的链出现时,验证者有动机去尝试在所有链上同时出块,以防万一:

在工作证明情境中,同时出块需要把算力分成两半,因此这么做无利可图:

之前股权证明的特性导致一个结果,即在所有的参与者都严格经济理性的条件下,即使没有攻击者,一个区块链也存在永远无法达成共识的可能。在先前的股权证明中如果攻击者出现,那么攻击者只需压倒那些无私的节点即可(那些只留在原链上的持股的人),并不需要压倒那些理性的节点(那些在原链和攻击者的链上同时持股的人),而相比之下在工作证明中,攻击者需要同时压倒无私的和理智的节点才能取得成功(至少是给他们造成真实威胁:参见P+epsilon攻击)。有些人主张股权持有者有动机去采取正确的行动,即只在最长的链上持股,因为他们需要“维护自己投资的价值”,但是这个论点忽略了一个问题,即持股人的动机受累于公地悲剧问题:虽然每个个体可能只有1%的几率成为那个决定成败的“关键”(换言之,即处于如果参与攻击就会使其成功而不参与就会使其失败的位置),所以(行贿者)只需私下使大家相信参加攻击行动只需要他们1%的定金;因此,贿赂金需要的总数仅为所有定金总数的0.5%-1%。另外,这个论点的暗含着任何零几率失败状态不是一个稳定平衡态的意思,仿佛失败的几率为零则每个人成为失败关键的几率为零。

这个问题可以通过两种策略解决。第一解决方案可以被一种称做“Slasher”的策略大体描述,此策略后来被Iddo Bentov进一步完善。这个策略在某一个事后的时间点把错误证明导入区块链通过扣除作恶者的押金去惩罚同时在多条链上出块的验证者。这项改变给动机结构带来的变化如下:

注意这个算法的有效运行要求充分提前确定参与的验证者。否则,如果验证者拥有1%的股权,假设有两支分叉A与B那么有0.99%的几率验证者只能在A链上持股而不能在B链上持股,有0.99%的几率验证者只能在B链上持股而不能在B链持股, 只有0.01%的几率验证泽能在两条链同时持股。因此,验证者会在概率上以99%效率去双持股:如果可能便在A上持股,如果可能便在B上持股,只在有可能选择的情况下选择长的那条链。这样的情况只能通过为两条链选择同样的一群验证者来避免,这就需要在分叉发生之前完成对验证者的选择(算法假设分叉不会持续几个小时以上;这一点通常通过设置”还原上限“禁止节点接受长分叉来实现,更详细的内容可以参加下一段弱主观)。这样做有它自己的缺陷,包括为中距离验证者合谋风险打开了敞口(比方说,连续名30验证者中的25人预先达成共识进行51%攻击),假如认为这些风险是可以接受的那么这个策略还是很有效的。

第二个策略很简单,即惩罚验证者在错链上出块的行为。换句话说,如果有两个相互竞争的链A和B,验证者在B链上出块并在B链上获得+R奖励,(在Casper里面这个被称为‘黑叔’dunkle),这个头块可以同时被导入A链中这时在A链上的验证者会承受-F损失(有可能F=R)。这个策略带来的经济计算上的变化如下:

这里的直觉是我们可以把工作证明的经济机制复制到股权证明中。在工作证明中,同样存在惩罚在错链上出块的机制,但是这个惩罚是隐藏在外部环境当中的:矿工需要额外的电,获取或者租赁额外的硬件。这里,我们仅仅是使惩罚显性化。这个机制的缺陷是它会让验证者暴露于稍稍多的风险之中,但是优势是不需要预先对验证者进行选择。

什么是“弱主观性”?

明白使用押金的机制来确保利害关系的存在会给安全模型带来一个确实的变化是十分重要的。假设押金会被锁定一个月,之后可以被提取。假设发生了一个51%攻击篡改了10天的交易记录。攻击者所出的块可以做为作恶证明(即'dunkle'黑叔叔块)被导入主链, 验证者会被惩罚。但是,假设同样的一个攻击发生在40天之后。那么届时,即便产生的块可以被重新导入,作恶的验证者将可以从主链上取走他们的押金,因此他们将不会受到惩罚。为了解决这个问题,需要设置一个‘还原上限’,即规定一定长度之前的节点将不可以被还原的规则。这意味着我们对节点产生了两个追加要求:

当节点第一次同步时,他们必须独立地验证最新的状态。他们可以通过自己的朋友、区块浏览器等方式进行这种验证。值得注意的是,如果节点发现只有一条链,那么他默认知道该链是正确的。只有当发现有2条链,并且超过“还原上限”仍然分叉的情况下,才需要进行这种社交验证。
每次“还原上限”单位时间内节点必须至少要登录一次。如果不登陆,有可能需要重新做一轮社交验证。

  1. 注意这个社会验证的范围实际是十分有限的。为了使它成为攻击项量,攻击者必须创造出社区很大的一部分才能使他们创造出来的错误的链被大家认为是正确的,即便这样攻击者也只能使新链接的节点相信。新链接的节点可能收到最近的检查点做为软件的一部分,一个可以黑化软件中检查点的攻击者理论上可以轻易地黑化软件本身,单纯的密码学经济学验证无法根本解决这个问题。一旦一个节点链接上,只要这个节点足够经常登录它可以无需社交验证一直安全的保持链接在区块链上。

  2. 另外,如果需要社会验证可以通过几种不同的方法被自动化。一个通过把它嵌入是自然用户工作流程中:a BIP 70类型的支付请求可以包括最近的区块哈希,用户的客服端软件可以在通过支付请求之前确认用户与卖家在同一条链上(同样的可以运用到所有的链上交易之中)。另一个是Jeff Coleman的通用哈希时间。如果运用UHT(通用哈希时间),那么成功的攻击链必须在正链生成的同时悄悄生成,这要求大部分的验证者悄悄的长时间共谋。

什么是“经济最终性”?

经济最终性是一种防止中距离区块链分叉的机制。它通过要求验证者在块上声明“我同意在所有B块被包括其中但是B块没有参与获得X数额的历史中承担数额为Y损失”。一旦验证者对一个块有足够的信心,他们会乐意放入一个价值很高的Y,直到放入到他们押金的全部为止。一旦一个块到达一个大部分验证者都愿意投入他们全部的定金的地步,这个块就会被认为“经济最终化”了。这确保了大多数人也难以共谋去进行51%攻击来篡改交易记录除非他们自己也付出及其昂贵的代价。

股权证明中能惩罚审查(屏蔽)吗?

与篡改不同的是,证明屏蔽要困难得多。区块链本身无法直接对“用户A曾尝试发送交易X但是被不公正的审查(屏蔽)掉了”,“用户A曾尝试发送X交易但是没有被处理因为交易费不足”,“用户A从来没有尝试发送X交易”这几种情况进行区分。但是,存在几种缓解屏蔽问题的技巧。

第一种方法,是通过“停机问题”来达到耐屏蔽(抗审查)的效果。在这个方案的弱化版本中,我们可以设计一种图灵完备的协议,验证者不花费大量的运算力执行一个交易就无法判断该交易是否会产生不希望的结果,从而导致其存在遭受拒绝服务攻击(DoS)的风险。这就是阻止了DAO软分叉的原因。

在这个方案的强化版中,交易会在不久的未来触发固定的效果。因此,用户可以发送多个交易,这些交易互相交互,并与已知的第三方信息一起产生某个未来的事件。但是,验证方并不能预知未来的结果,直到这些交易已被包含在区块中(已经济上最终确认了)并且已太晚阻止他们了。即使后面所有的交易都被排除,验证方希望阻止的事件仍然会发生。值得注意的是,在这种方案下,验证方仍可试图阻碍所有交易,亦或使得所有交易都不包含区块链所需的某些证明,从而不会产生验证方不期望的结果。但这样做的话,会排除大规模的交易,最终造成几乎整个系统崩溃。那么,对于验证方本身也会受损贬值,因为其当作押金的数字货币的价格会下跌。

第二种方法,如Adam Back在此所诉,是要求所有交易通过“时间锁加密”。因此,验证方将交易包含到区块中时,无需知道其内容。交易的内容之后则会自动揭示。而此时再要将该交易剔除为时已晚。但是,若验证方足够恶毒,他可以只接受那些具有密码证明(如,ZK-SNARK)的交易,而这些密码证明的内容已经解密公开。此举会迫使用户下载新的(支持密码证明的)客户端软件,而(恶意验证方的)对手则可以很方便地提供类似的客户端软件供用户方便下载。根据博弈论,用户也有动力这么做。

对于股权证明来说可能最好的办法就是用户也能够使用软件升级的方法,通过硬分叉来剔除恶意的验证方。这不会比安装作恶者提供给他们的对屏蔽友好的软件版本更加困难。总的来说,这个方案还是比较行之有效的,虽然是以造成区块链运行速度减慢为代价了(值得注意的是,该方案必须足够高效运行。不然的话,恶意的验证方只需简单的将加密交易过滤掉,而保留那些更快速的未加密交易)。

第三种方法,是将审查侦测机制包含在分叉选择规则中。基本的思路是,所有节点观测网络上的交易,如果发现有交易在足够时间内提供足够高的交易费,那么,对于那些不包含该交易的区块链打较低的“分数”。如果所有的节点都采取这种策略,那么,最终少数链会自动合并到包含该交易的链上,而所有正常的在线节点都会这么做。这种方案的主要弱点是,离线节点还是会跟随主要分叉。如果审查动作是临时的,而当离线节点重新连接上线时审查动作已经结束了,那么这些离线节点可能会在一个与其他在线节点不同的分叉上。因此,这种方案可能只能作为一个当发生硬分叉时,辅助紧急自动协调的工具,而不能作为一个日常分叉选择的角色。

 
2 人喜欢