比特币2MB分叉仅仅只是改一行代码么

当前位置:首页 > 币圈百科 > 比特币2MB分叉仅仅只是改一行代码么

比特币2MB分叉仅仅只是改一行代码么

2022-12-01币圈百科208

GAVIN ANDRESEN

比特币块大小上限从100万字节(1MB)扩大到200万字节(2MB)。乍一看,这听起来很简单:只需将源代码中的数字“1”改为“2”,然后我们就完成了,对吗?

如果我们不在乎平稳升级,那么可能就那么简单。只需更改以下代码行(在src/consensus/consensus.h下):

.max _ block _ size=1,000,000

至:

.max _ block _ size=2,000,000

。如果修改后重新编译,再次运行比特币核心。您的计算机将下载整个区块链,并与网络上的其他计算机互操作,没有任何问题。

如果你的电脑正在把交易组装成块(如果你是单干挖矿或者你是矿池操作员),事情会变得更复杂。在本文的其余部分,我将解释其复杂性,希望让您了解问题,并确保共识级别的更改是安全的。

GitHub上有一个方便的功能,可以让你并行比较代码;可以访问https://github.com/bitcoin/bitcoin/compare/v0.11.2…Gavin Andresen:Two _ MB _ BUMP看看这个2MB分叉的代码变化。你应该看到下面这个界面:

蓑衣网小编2022vetbbbiyb6dujq_small

上面有五个“提交”(指代码更改组)。请忽略第一个大卫哈丁的提交,这是比特币核心0.11.2的最后一个提交)。

一共22个。

第一次提交是“最小共识/挖掘器要求2MB块扩展,最小共识/挖掘器更改为2MB块大小凸起”。更改中有20行新代码。一行可以看到的变化是MAX_BLOCK_SIZE从1,000,000字节变成了2,000,000字节;剩下的变化对矿工来说是必要的,他们可以看到产量更大的区块是否安全。定义了一个新的MaxBlockSize()方法来返回旧的或新的最大块大小,它基于80字节块头中的时间戳。我可能会写一篇完整的博客文章来解释为什么应该使用时间戳而不是过去11个街区的街区高度或中值时间,或者其他东西…但不是今天。

共识变化写在main.cpp的第2816行,使用CheckBlock()方法,采用新的MaxBlockSize()方法判断一个块是否过大,而不是MAX_BLOCK_SIZE。miner.cpp中的CreateNewBlock()函数和' getblocktemplate '远程过程调用也发生了类似的变化,这样矿工就可以创建更大的块。

下一次提交(“测试基础设施修复”)增加了一些功能,并修复了用于测试比特币源代码的代码中的一个漏洞。

这个代码测试代码(code-testing-code)有两个层次;单元测试放在src/test/里的树里,用c写的,这个层次很低,用来保证代码各部分的行为是正当的。qa/rpc-tests/中的树也有回归测试。它们是用Python编写的,使用RPC(远程过程调用)接口命令行运行“-regtest mode”来确保一切正常运行。

“矿工投票后2mb分叉和矿工投票后宽限期”是迄今为止最大的提交,有大约700行新代码。它实现了转出规则:当计算能力产生的75%的块有一个特殊的块版本号,然后28天后,允许产生更大的块。

75%和28天是比较随意的选择。我讨厌武断的选择,主要是因为每个人都会对它们有不同的看法(也称为“bikeshedding”,指的是过于关注细节和边缘问题,而忽略了主要问题),花几天时间争论一个徒劳的问题。 我已经在另一篇博文中解释了为什么我们认为这些数字是一个好的选择。

矿工投票和宽限期代码源自我为比特币XT编写的BIP 101实现,已经过三级测试。

block _ size _ tests . CPP中有一个新的单元测试,它测试CheckBlock()调用,创建一个具有旧的或新的大小限制的精确块,或者一个比旧的或新的块大小限制大1个字节的块,并根据它们的时间戳是在允许更大块的时刻之前还是之后(或者正好是在这个时刻),对其进行测试以确定它们是否被接受。

还有一个新的回归测试,bigblocks.py它运行bitcoind的四个备份,创建一个block-chain,仅用于开发者的机器测试(在-regtest模式下,可以即时创建块),然后测试fork激活码,以确保矿工的投票被正确计数,即区块链的重建被正确处理,只有在过渡期结束后才会允许创建更大的块。这也可以确保当75%的计算能力在2018年1月的截止日期内未能接受这一变更时,整个代码将被报告为无效。

我的大部分开发时间都花在了保证回归测试和单元测试上。然后,一旦回归测试和单元测试通过,就在测试网络上进行更多的测试。编写代码是比较容易的部分。

最后,这部分展示代码已经得到了Jonathan Toomim的验证,他在8MB block和比特币XT测试网(包括中国的长城防火墙)上做了大量的测试。

让我们继续探索代码变更.

main . CPP的IsSuperMajority()函数也有一些变化block.h中有一个新的VersionKnown()函数,用来统计支持各种变化的块数。当块大小扩展时,它可以与BIP 009的“版本位”和各种软分叉bip(68,112,113,141)同时发生。

(测试除外),新代码最多的部分蓑衣网小编2022 在txdb.cpp当矿工投票成功时,触发块的hash会被写入区块链索引。这不是严格要求的。这部分代码将扫描区块链中的所有块头,以确定每次启动时投票是否成功。这比在区块链索引数据库中存储一些信息更有效。

唉,描述所有这些可能的代码变化比编写它们要花更多的时间。这里还有两个承诺要谈。

“准确的sigop/sighash核算和限制”非常重要,因为没有它,增加块大小限制可能会很危险。你可以看看我在去年11月的DevCore会议上展示的一些细节。基本上,中本聪没有非常仔细地考虑交易是如何签署的,这可能导致比特币产生非常大的交易,验证成本太昂贵。这个commit清理了一些“技术债务”,实现了一个新的ValidationCostTracker,它可以跟踪有多少作业在验证事务,然后与一个新的限制(MAX_BLOCK_SIGHASH)一起使用,以确保没有人可以创建一个非常昂贵的验证块,并试图搞乱整个网络。

人们会有强烈的动机不去创建昂贵的验证块(矿工希望他们的块尽快通过这个网络,并努力最小化他们的孤块率)。但是,安全编码的一个原则是“皮带和背带”(如果你想听起来专业,或者不喜欢背带的说法,那就换成“纵深防御”这个词)。

MAX_BLOCK_SIGHASH又是一个烦人又武断的限制。是否设置为1.3 GB?这将足够大,以至于目前没有块可以触及这个极限,但它也足够小,以至于可以创建需要几分钟来验证的毒块。

而最后一次提交,“不要中继或挖掘太多sighash事务,不要中继或挖掘异常SIG 蓑衣网小编2022hash事务”,是另一种“皮带式”安全措施。目前,它可以拒绝非常大和昂贵的验证事务是有限制的,但这次提交增加了另一项检查,以绝对确保聪明的攻击者无法欺骗矿工将疯狂和昂贵的事务放在他们的块中。

如果你能一直看这些东西,你的注意力持续时间会比我长。当非程序员在看这篇文章的时候,希望你能从中学习到从“1”转换到“2”需要注意的地方。

原文:http://gavinandresen.ninja/a-guided-tour-of-the-2mb-fork作者:加文安德森译者:洒脱快乐投稿来源(翻译):信息(http://www.8btc.com/guided-tour-of-the-2mb-fork?)

比特币2MB分叉仅仅只是改一行代码么 | 分享给朋友: