【译】Hard Forks, Soft Forks, Defaults and Coercion

区块链领域的一个重要论据是硬叉或软叉是否是首选的协议升级机制。 两者之间的基本区别在于,软叉通过严格减少有效的交易集来改变协议的规则,所以遵循旧规则的节点仍然会进入新链(假设大多数矿工/验证者实施叉),而硬叉允许以前无效的交易和块变得有效,所以客户必须升级他们的客户才能保持硬叉链。 还有两种分叉形式: 严格扩张硬叉,严格扩大有效的交易组合,因此旧规则对新规则和双边硬叉来说是一个软分叉,这两个规则集都是不兼容的。

下面是一个Venn图来说明叉子类型:



这两个常见的好处如下。

  • 硬叉让开发人员在协议升级时有更大的灵活性,因为他们不需要注意确保新规则“符合”旧规则
  • 软叉更方便用户使用,因为用户不需要升级以保持连锁
  • 软叉不太可能导致连锁分裂
  • 软叉只需要真正需要矿工/验证者的同意(因为即使用户仍然使用旧规则,如果使链条使用新规则的节点,那么只有在新规则下有效的东西才会进入链条)。 硬叉需要用户同意

除此之外,硬性叉子经常遭受的一个主要批评是硬叉子是“强制性的”。 这里所强调的那种强制不是物理的力量, 相反,它是通过网络效应来强制的 也就是说,如果网络将规则从A更改为B,那么即使您个人喜欢A,但如果大多数其他用户喜欢B并切换到B,那么尽管您个人不同意为了进行更改而必须切换到B与其他人一样的网络。

硬叉的支持者常常被嘲笑为试图对网络进行“敌意接管”,并“强迫”用户与他们一起前进。 此外,连锁分割的风险通常被用来作为“不安全”的硬叉。



我个人的观点是,这些批评是错误的,而且在很多情况下是完全倒退的。 这个观点并非特定于以太坊或比特币或任何其他区块链; 它是由这些系统的一般属性引起的,并且适用于它们中的任何一个。 此外,下面的论点仅适用于有争议的变更,至少有一个选区(矿工/验证人和用户)的很大一部分不赞同; 如果变更不具争议性,那么无论叉子的格式如何,通常都可以安全地进行。

首先,让我们讨论强制问题。 硬叉和软叉都以某些用户可能不喜欢的方式改变协议; 如果任何协议更改的支持不足100%,则会执行此操作。 此外,在任何情况下,至少有些持不同意见者认为,坚持更大群体的网络效应比评估自己对协议规则的偏好更重要。 因此,这两种分叉类型都是强制性的,就网络效应而言。

然而,硬叉与软叉之间存在本质区别: 硬叉是选择性的,而软叉允许用户根本不选择“选择” 为了让用户加入硬叉链,他们必须亲自安装实现分叉规则的软件包,并且与规则不一致的用户组的变化甚至比他们重视网络效应更强烈,理论上可以简单地留在旧的连锁店 - 实际上,这样的事件已经发生了

在严格扩大硬质叉和双侧硬质叉的情况下,情况确实如此。 然而, 软叉的情况下, 如果分叉成功,则不存在非叉形链 因此, 软叉明显地从体制上赞成强制分离,而硬叉具有相反的偏见 我自己的道德观点促使我赞成分离而非强制,尽管其他人可能会有所不同(最常见的观点是网络效应真的非常重要,而且“ 一枚硬币统治全部 ”是非常重要的,尽管更适度的版本也是如此存在)。

如果我不得不猜测为什么,尽管存在这些论点,软叉通常被认为是“硬性较差”,但我认为这是因为它感觉像一个硬叉子“迫使”用户安装软件更新,而用软分叉用户不会“有”做任何事情。 然而,这种直觉是错误的:重要的不是个人用户是否必须执行点击“下载”按钮的简单官僚步骤,而是用户是否被强迫接受协议规则的改变 ,他们会宁可不接受。 如上所述,通过这种度量方式,这两种叉子最终都是强制性的,并且难以出现的叉子在保持用户自由方面稍微好一些。




现在,让我们看看极具争议的分支,特别是矿工/验证者偏好和用户偏好冲突的分支。 这里有三种情况:(i)双侧硬叉,(ii)严格扩张硬叉,和(iii)所谓的“用户启动软叉”(UASF)。 第四类是矿工在未经用户同意的情况下启动软叉; 我们将在稍后讨论。

首先,双边硬叉。 在最好的情况下,情况很简单。 这两种硬币在市场上交易,交易者决定两者的相对价值。 从ETC / ETH的情况来看,我们拥有绝大多数证据表明,无论其意识形态如何,矿工绝大多数情况下都会根据价格比例简单地将硬币分配给硬币,以最大化他们的利润。



即使一些矿工对一方或另一方表达意识形态偏好,过度倾向于有足够的矿工愿意套用价格比率和乱率比率之间的任何不匹配,并使两者保持一致。 如果一个矿工的卡特尔试图形成不在一个链上挖矿的话,那么就会有过度的缺陷诱因。

这里有两个边缘案例。 第一种可能性是,由于调整算法的效率低,开采硬币的价值随着价格的下降而下降,但难以补偿,使得开采非常无利可图,并且没有矿工愿意在继续推进链条直到其难度恢复平衡为止。 以太坊的情况并非如此,但比特币可能就是这种情况 因此,少数连锁店很可能永远不会脱离地面,因此它将会消亡。 请注意,这是否是一件好事的规范性问题取决于你对强制与分裂的看法; 正如你从我之前写的内容中可以想象的那样,我个人认为这种少数连锁反对的难度调整算法是不好的。

第二个边缘案例是,如果差距非常大,那么大型连锁企业可以有51%攻击较小的连锁企业。 即使在ETH / ETC以10:1的比例分配的情况下,也没有发生; 所以它肯定不是一个给定的。 然而,如果主导链上的矿工更喜欢强制让分离和按照这些价值行事,那就永远是可能的。



接下来,我们来看看严格扩展硬叉。 在一个SEHF中,有一个属性是非分叉链在分叉规则下是有效的,所以如果分叉具有比非分叉链低的价格,它将具有比非分叉链更小的散列能力,并且因此,无叉链条最终将被原始客户和分叉客户规则视为最长的链条 - 因此分叉链“ 将被歼灭 ”。

有一种观点认为,这样一个分支的成功存在着强烈的内在偏见,因为分叉链将被湮没的可能性将被推销到价格中,从而推低价格,使链条更有可能成为歼灭......对我而言这一论点似乎很强烈,所以这是一个很有理由做出任何有争议的硬派双边而非严格扩张。

比特币无限制开发者建议通过在发生硬手动双边交易手动处理这个问题,但更好的选择是使内置的双边交易成为可能; 例如,在比特币的情况下,可以添加一条规则来禁止一些未使用的操作码,然后在非分支链上进行包含该操作码的事务处理,以便在分叉规则下,非分叉链将从此被认为永远无效。 在以太坊案例中,由于有关状态计算如何工作的各种细节,几乎所有的硬叉几乎都是自动双边的。 根据其架构,其他链可能具有不同的属性。



上面提到的最后一种叉是用户激活的软叉。 在UASF中,用户可以打开软分支规则,而无需得到矿工的共识。 预计矿工们只会摆脱经济利益。 如果许多用户不遵循UASF,那么将会出现硬币分裂,这将导致与严格扩展的硬叉相同的情况,除了 - 这是概念的真正聪明和迂回的部分 - 相同的“湮灭风险”压力强烈反对严格扩张的硬分叉中的分叉链,反而强烈支持UASF中的分叉链 即使UASF选择加入,它也会使用经济不对称来偏向成功(尽管偏差不是绝对的;如果UASF决定不受欢迎,那么它将不会成功,并且只会导致连锁分裂)。

但是,UASF是一个危险的游戏。 例如,让我们假设一个项目的开发人员想要创建一个UASF补丁,该补丁将先前接受所有事务的未使用的操作码转换为只接受符合某些很酷的新功能规则的事务的操作码,尽管政治或技术上有争议的矿工不喜欢。 矿工们有一种聪明狡猾的反击方式: 他们可以单方面实施矿工激活的软叉,使得使用由软叉创建的特征的所有交易总是失败

现在,我们有三个规则集:

  1. 操作码X始终有效的原始规则。
  2. 操作码X仅在事务的其余部分符合新规则时才有效的规则
  3. 操作码X始终无效的规则。

注意(2)是关于(1)的软叉,并且(3)关于(2)是软叉。 现在,有利于(3)的经济压力很大,因此软分叉未能实现其目标。

结论是这样的。 软叉是一种危险的游戏,如果它们有争议并且矿工开始反击,它们会变得更加危险。 严格扩展硬叉也是一个危险的游戏。 采矿者激活的软叉子是强制性的; 用户激活的软叉子不那么强制性,虽然由于经济压力而仍然非常强制,并且它们也有其危险。 如果你真的想要做出有争议的改变,并且认为这样做的高社会成本是值得的,那么只需做一个干净的双边硬盘,花一些时间来增加一些适当的重放保护,并让市场对它进行整理。

https://vitalik.ca/general/2017/03/14/forks_and_markets.html

为了避免死锁,需要对程序中的资源竞争进行优化。下面是对代码进行的修改: ``` public class Philosophers implements Runnable { private Semaphore leftFork; private Semaphore rightFork; // 修改成叉子的信号量 private int id; public Philosophers(int id, Semaphore leftFork, Semaphore rightFork) { this.id = id; this.leftFork = leftFork; this.rightFork = rightFork; } public void run() { try { //思考 System.out.println("哲学家" + id + "正在思考"); Thread.sleep((long) (Math.random() * 10000)); //进餐 System.out.println("哲学家" + id + "饿了,开始进餐"); // 判断左右叉子,只有当两个叉子都可用时才能取到叉子 if (id % 2 == 0) { leftFork.acquire(); System.out.println("哲学家" + id + "拿起左边的叉子"); rightFork.acquire(); System.out.println("哲学家" + id + "拿起右边的叉子"); } else { rightFork.acquire(); System.out.println("哲学家" + id + "拿起右边的叉子"); leftFork.acquire(); System.out.println("哲学家" + id + "拿起左边的叉子"); } Thread.sleep((long) (Math.random() * 10000)); System.out.println("哲学家" + id + "进餐完毕,放下叉子"); //释放叉子 rightFork.release(); System.out.println("哲学家" + id + "放下右边的叉子"); leftFork.release(); System.out.println("哲学家" + id + "放下左边的叉子"); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { int N = 5; //哲学家数量 Semaphore[] forks = new Semaphore[N]; for (int i = 0; i < N; i++) { forks[i] = new Semaphore(1); } for (int i = 0; i < N; i++) { new Thread(new Philosophers(i, forks[i], forks[(i + 1) % N])).start(); } } } ``` 注释如下: 1. 将 rightknife 修改为 rightFork,以更好地反映代码含义。 2. 在进餐前,对哲学家编号进行判断,偶数编号的哲学家先取左边的叉子,奇数编号的哲学家先取右边的叉子。 3. 注释相关代码,方便理解和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值