关于为何推崇交易规范排序(CTOR)的原因

​​我喜欢规范区块顺序(canonical block order,简称CBO)概念的主要原因是它教会了我们关于比特币如何工作的一些新东西。它移除了比特币中我们所认为的这个系统所需的安全功能。当然,这会带来焦虑,恐惧,不确定和怀疑的情绪,因为当一些依附我们的东西从我们身上取下来时,我们都不会喜欢。然而通常情况下,我们所附加的东西实际上是我们并不需要的。通过认识这一点并学会放手,我们可以将认知和高效的算法提升到一个更高的层次。

重要的不是路径而是旅程

在踏上旅程时,您所采取的步骤以及曾访问过的地点并不重要。重要的是它如何改变你的状态,最后你是如何成为一个不同的人。比特币也是如此。

对于每个区块,我们只关心分类帐的状态,在区块产生之前和在区块产生之后都是合法的。为了使后续状态合法,需要在两者之间有一个合法的路径。也就是说,至少需要有一个合法的交易排序,其中所有合法输入都是建立在合法输出之上的。我们实际上不需要知道那个排序是什么; 只知道它存在就足够了。

对于当前系统,我们知道存在合法的排序,不过这个排序规则已经成为矿工的负担。大多数区块的合法排序的数量就像是天文数字。以一个包含1000笔交易的区块为例,其中90%的交易都是独立的。这种块的合法排序数远远大于宇宙中的原子数量。但是那里还有很多不合法排序,远远多于合法的排序。如果宇宙中的每个原子代表块的一种潜在排序,则从统计学上讲,没有一个原子代表一个合法的排序。生成合法的排序实际上并不像听起来那么难,但它仍然需要一些时间。

在验证区块时,许多验证步骤应该被序列化,以确保该特定路径确实合法。您可以采取一些技巧来解决串行处理要求,但这是一个复杂的来源。在试图解决这个问题时已经让我们惊讶地发现:

证明存在合法排序比验证任何特定排序更容易。

为了表明这一点,我们首先会讨论可以确定交易合法性的基本关系。这些基本关系是兄弟关系和亲子关系。

家谱中的信仰

先是交易中的兄弟关系。兄弟关系发生在两个交易共享一个母交易时——也就是说,两个交易的支付输入都是第三个交易的同一输出。当这种情况发生时,您都会进行双花尝试。这在比特币世界中是违法的,惩罚是自相残杀致死。为了确定哪个交易是有罪的一方,我们使用战斗审判,假设哥哥比弟弟更大更强壮。如果一个矿工打包的区块包括兄弟关系的交易,这意味着他们没有强制执行战斗审判法,这使得该区块无效。对此的惩罚是推翻我们的采矿霸主。幸运的是,对于每个人来说,使用带有原子交换的哈希表检查一个块中是否有兄弟节点是很容易的。这是一个尴尬的并行问题,而这正是我们想要解决的问题。

接下来,讨论交易中的母子关系。比特币之所以存在,是因为中本聪(Satoshi Nakamoto)讨厌时光旅行。他不想要像《回到未来》电影中那样的场景,那样人们都可以回到过去重写历史,他特别讨厌穿越时空的乱伦。回到过去使自己的祖母怀孕,从而成为你自己的祖父,这是粗鲁的,不是自然的秩序。我们不想那样,中本聪也不想那样。一个交易的花费输入应该是按时间进行的,交易关系图应该是没有任何循环的。它应该是一个有向无环图,或者叫DAG。在他的分析中,tl121指出,即使发生了循环,也不会危及比特币的安全,因为无法创造新的货币。tl121只需要后退一步就可以了。我们根本不用担心这些乱伦,因为它们是不可能的。时间旅行不存在的,中本聪确保了这一点。

在SHA256哈希的交易中每一个交易的输入是上一个交易的输出。SHA256是单向函数。您无法创建SHA256哈希以匹配输入,这意味着您必须创建输入以匹配SHA256哈希。如果可以通过一种方式反转SHA256,那么攻击者可以通过创建具有相同哈希的另一个块或者交易来更改他们想要更改的任何历史区块或交易。因为每一个输入必须建立在先前已知输出的基础上,所以时间旅行是不存在的。由于时间旅行是不存在的,交易关系图必须是DAG。我们甚至无需对每一个区块都验证这一点,这只是一个可证明的数学事实。

所有DAG必须至少有一个拓扑排序。也就是说,对于每个交易DAG,至少有一条路径可以按顺序访问每个交易,而不访问任何交易输入或输出两次。如果我们想,我们可以计算其中一个排序,但没有必要。只要我们知道它是DAG,并且DAG没有兄弟姐妹或孤儿,我们的验证工作就完成了。

放手的价值

如果我们不再担心所采取的路径,它会给我们一些真正的,实实在在的好处。

首先,它是一个更优雅和美丽的系统。对于工程师来说,能够通过在纸上做一些数学计算而可以删除一堆代码是最美好的事情。

其次,矿工不再需要发现有效的排序了。也就是说,区块模板创建可能更快,允许更高的吞吐量和更少的孤块。目前,大约70%的区块模版的生成时间在用于因为排序规定造成的child-pays-for-parent(CPFP)代码。除去这一步骤可能会大大增加性能。

第三,这意味着我们不再需要担心由于区块验证所需的中间态。以太坊速度如此之慢的主要原因之一是协议需要交易收据,这些部分在每次交易后都指定了分类账的状态。这使得难以实现令人尴尬的并行化。我们不希望这样。使用CBO,我们只需要担心开始和结束。

第四,它使得为其他人提供指导变得更加容易。我们可以只给他们当前坐标和目标坐标之间的差异,而不是告诉人们他们需要按顺序进行每次转弯。这就是石墨烯所做的,尽管坐标系是一个高维超立方体,其中每个边都基于块中每个交易的哈希。如果我们不需要知道交易顺序,它的工作效率会提高7.14倍。

第五,它降低了系统的复杂性,并且排除了攻击者发布一个排序数量众多的区块来减慢验证,以此恶意攻击的可能。这可能与弱块方案相关,其中自私的矿工可以制作包含相同交易但是顺序不同的弱块,并将不同的弱块发送到不同的节点。然后,自私的矿工可以操纵他们创建的最终块,以便改变块传播到网络的不同部分的效率。要求所有交易都按哈希进行排序,这使得这种事情变得不可能。它降低了系统的自由度,并消除了我们不需要的信息。

在这五种效果中,我认为#4和#5是最重要的。典型和敌对的情况下,块的传播速度是目前安全区块大小的主要限制因素。能够在两种情况下都使用相同的更改来提高性能是很罕见的。

寻求启蒙是我们为了满足自我而告诉自己的谎言

还记得我在上面第3条中说过的吗,Ethereum的状态规范使得令人尴尬的并行验证不可能实现?我让它听起来像是当前的比特币也存在这个问题,而令人尴尬的并行验证目前在比特币上是不可能的。事实证明这不是真的。在CBO fork之后,仍然可以使用相同的算法来进行令人尴尬的并行验证,只需稍加修改即可。

基本算法是首先遍历每个交易(以任何顺序)并制作所有输出的哈希表,然后遍历每个交易并确保其输入来自同一块或之前的未花费的输出。

这很容易做到,但只有当我们不关心输出在块中出现的时间是否晚于花费它的输入时,它才会起作用。在并行算法中检查顺序不是很困难吗?

不,不是。您将遍历每个交易(以任何顺序)并创建所有输出及其所在区块位置的哈希表,然后检查每个输入是否花费了一个未使用的输出,该输出很早出现在块中或在之前的区块中。

这意味着CBO的一大好处是甚至可以通过比特币核心来实现,在不需要分叉的情况下。

没有勺子,有叉子吗?

所以我们真的不需要为了得到并行验证来实施CBO硬分叉。因为它可以让我们在实现并行验证之前是自由的。也许Bitcoin Cash可以延迟分叉或完全没有它。我们通过放弃获得的所有都是性能优化或对抗条件,这两者都可以通过编写更多代码来解决。虽然我们更愿意使用分叉来消除比特币的设计并创造更精简,更纯净,更优雅的比特币现金,但如果我们尝试这样做会让社区感到害怕,我们可以回到编写更多的变通代码和增加系统的复杂性上来。

但如果社区认为它已经准备就绪,并愿意与我们一起跨越信仰的鸿沟,那么我们就会张开双臂等待着你。

转载于:https://juejin.im/post/5ba997eae51d4543e6096a3c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值