​​我喜欢规范区块顺序(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可以延迟分叉或完全没有它。我们通过放弃获得的所有都是性能优化或对抗条件,这两者都可以通过编写更多代码来解决。虽然我们更愿意使用分叉来消除比特币的设计并创造更精简,更纯净,更优雅的比特币现金,但如果我们尝试这样做会让社区感到害怕,我们可以回到编写更多的变通代码和增加系统的复杂性上来。

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

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

  1. 关于BCH交易规范排序(CTOR)的优缺

    最近BCH开发团队Bitcoin ABC在11月份的BCH升级更改中表示要推出交易规范排序(Canonical Transaction Ordering,简称CTOR).但是针对这一点,BCH社区并没 ...

  2. c语言标准库低通的qsort函数不适宜所有排序任务的原因

    c语言标准库低通的qsort函数不适宜所有排序任务的原因: 第一:它只能用于内存中的数组排序,不能对链表中的数据排序: 第二:因为它是参数化的函数,所以能对各种数据进行操作,也造成它的运行速度比针对单 ...

  3. 财付通绑定工商银行出现“交易失败 错误代码:96110791 失败原因:数据库异常”解决

    问题:财付通绑定工商银行出现"交易失败 错误代码:96110791失败原因:数据库异常" 如图: 分析:数据库异常,很可能是插入的数据违反完整性约束.想了想,很有可能是主键重复.因 ...

  4. 财付通绑定工商银行出现“交易失败 错误代码:96110791 失败原因:数据库异常”解决...

    问题:财付通绑定工商银行出现"交易失败 错误代码:96110791失败原因:数据库异常" 如图: 分析:数据库异常,很可能是插入的数据违反完整性约束.想了想,很有可能是主键重复.因 ...

  5. Oracle分页排序数据混乱原因及解决

    看这条分页sql,其中order by statues_row中的statues_row字段不是唯一字段,而是一个必填的状态字段里面例如内容是(1或者2或者3) select * from(selec ...

  6. mysql分组失效_请教MySql中使用表子查询时,试着先排序后分组,出现排序失效的原因?...

    1,今天试着码了一下教程里的题目,是找出每一个班级的身高最高的学生,用的是先order by降序排序所有学生升高,再用 group by分组每一个班级取第一个值,却发现当使用子查询时,得到的仍旧是未排 ...

  7. FISCO BCOS Transaction execution error交易事务合约执行失败原因

    error|2022-06-21 19:31:31.351916|[g:1][EXECUTIVE][TxExeError]Transaction execution error,Transaction ...

  8. CTOR对比Gavin提出的交易排序规则

    ​​通过对CTOR的了解,我们已经知道它有很多优于TTOR的地方.尤其在解决未来BCH扩容中块传播的瓶颈中发挥着重要的作用.由于TTOR是中本聪提出的技术,而CTOR则需要改变共识,因此并不是所有的人 ...

  9. Bitcoin Unlimited发布BCH新版客户端1.5.0.0,包括CTOR和CDSV

    对于比特币现金11月份的网络升级,BCH社区存在一定的分歧,争论主要集中在Bitcoin ABC开发团队提出的更改内容交易规范排序(CTOR)和引入新的OP-Code代码OP_CHECKDATASIG ...

最新文章

  1. html5的在线播放页面,整理5款html5网页播放器,总有一款适合你吧
  2. php编程神器,PHP代码神器 十个PHP代码片段超极好用
  3. 另辟蹊径,中科院自动化所等首次用图卷积网络解决语义分割难题
  4. 数据库范式(1NF、2NF、3NF、BCNF)
  5. HDU1013 POJ1519 Digital Roots(解法二)
  6. docker 查看容器日志大小 清除指定容器日志
  7. 【量化交易】组合优化三部曲:换手率和alpha模型换手约束下的最优模型时变IC下的多空/多头最优组合换手率
  8. python变量/分支/循环/数组/列表/元组/序列
  9. python如何输入一个数停止输出可循环部分_Python 第04周:控制与循环
  10. 15个变态的Google面试题以及答案
  11. mysql中的replication_mysql中replication的相关问题总结
  12. Caffe2 的基本数据结构(Basics of Caffe2 - Workspaces, Operators, and Nets)[4]
  13. C# 实现将文本txt生成图片
  14. 今晚7点,腾讯专家详解腾讯广告召回系统的演进
  15. 各种推荐算法的 benchmark
  16. 解决本地笔记导入博客中图片无法显示的问题
  17. TOP100summit2017:微博如何做到1小时增加一千台服务器应对鹿晗恋情带来的流量暴增
  18. python短信验证码_Python如何实现手机验证码
  19. 阻挡前进的小兵<隐私政策>
  20. 了解Socket吗?什么是socket?

热门文章

  1. Elasticsearch之CURL命令的PUT和POST对比
  2. 《为什么我们的决策总出错》摘录
  3. NFS 安装配置及常见问题
  4. Python3学习之路
  5. MySQL数据库的创建
  6. javascript 构造函数类和原型 prototyp e定义的属性和方法的区别
  7. VM虚拟机中的centos6.3命令行模式添加GCC
  8. 2010年下半年网络工程师考试上午试卷与参考答案(3)
  9. asp.net 域名欺骗式开发
  10. spring cloud (一):大话 Spring Cloud