比特币区块大小是如何突破百万字节的?

虚拟货币资讯 发布在 比特币 1 2001

481,824。

随着BTCC矿池在2017年8月24日上午9点57分挖出比特币网络第481,824个区块,比特币用户终于等到了隔离见证(Segregated Witness)这个备受期待的技术正式激活。

So what? 对于像小编一样的广大吃瓜群众来说,隔离见证的激活意味着什么?之前UASF和UAHF闹得不可开交难道不就是不同理念和技术间的政治斗争?隔离见证对我们这种普通的比特币网络参与者会产生什么实质性的影响?

CoinDesk作为比特币老牌媒体(成立于2013年5月),用以下三点总结了隔离见证的关键要点。

隔离见证改变了比特币数据在区块当中存储的方式;
隔离见证为提高区块容量打下坚实的基础,同时和过去版本的比特币软件相兼容;
隔离见证移除了交易延展性漏洞,而交易延展性问题是很多比特币项目无法开展的主要障碍。

那么,重点来了。比特币交易数据在区块中到底是如何存储的?为什么说隔离见证改变了数据存储方式并起到了‘扩容’效果?

Snip20170829_260

首先让我们简单了解一下几个基本概念。

Block size: 就是咱们理解当中的目前比特币区块链上的区块大小,以字节(bytes)为单位。每个区块包含块头(block header),交易数量(number of txs)和该区块内的所有交易(txs)。根据比特币网络建立之初达成的共识,目前的比特币网络节点只能识别区块大小小于或等于1,000,000字节的区块。也就是说,SegWit激活之前,一个区块的大小(block size)是绝不可能大于1,000,000字节的。

Block weight: SegWit激活之后,咱们有了一个全新的概念来描述区块的大小,它叫区块重量(目前还没有官方翻译,咱们暂且这样翻译)。这区块重量(block weight)是什么东东?区块重量指的是该区块内每一笔交易的重量之和。

Legacy nodes: 不支持SegWit的遗留节点。

SegWit nodes: 支持SegWit的节点,也就是升级到Bitcoin Core 0.13版本或更高版本的比特币节点。

那么,问题来了。一笔交易的重量该如何计算?

交易重量=(移除见证数据的交易大小)*3+(交易大小)

隔离见证激活前的比特币交易中不包含任何见证数据(witness data),所以每笔交易的重量正好是交易大小的四倍。

交易重量=交易大小*3+交易大小=交易大小的四倍

支持SegWit的交易和普通的比特币交易不同,会包含一部分见证数据,所以这种交易的交易重量必然是一个小于交易大小四倍的数值。在这有一点大家要特别注意,所有的SegWit交易在传送到散落在全世界各地的比特币遗留节点(legacy nodes)时并不包含见证数据,所以每个节点收到的区块大小(block size)依然小于或等于1,000,000字节(虽然这个区块包含的真正的交易数据大小之和在SegWit nodes是大于1,000,000字节的)。这也是我们将隔离见证称之为软分叉的根本原因。

在隔离见证激活29个小时之后(2017年8月25日15时10分),我们在481,947高度的区块见证了历史上第一个block size大于1,000,000字节的区块。这从何说起?而stripped size又是什么鬼?

Snip20170829_261

刚才和大家提到过,目前比特币网络的legacy nodes承认的是区块大小小于或等于1,000,000字节的区块。而隔离见证激活之后的区块大小的计算规则是区块的重量不可超过4,000,000。按照上面的交易重量公式来计算(还记得不,交易重量等于。。。),如果一个区块不包含任何SegWit交易,这个区块的大小也必然不可能超过1,000,000字节(反推出来的,对不对)。

所以,我们可以得出的结论是什么?未激活SegWit的区块的交易处理能力和激活SegWit的区块的交易处理能力无差别(艾玛,是不是快被绕晕了?)。简单说来,就算支持SegWit的区块不包含任何SegWit交易,这个区块的大小(block size)也不可能超过1,000,000字节。为什么?因为非SegWit交易的交易重量永远都是交易大小的4倍。也就是说,1,000字节的非SegWit的交易重量肯定是4,000。

但SegWit下的交易就不太一样了。同样大小的SegWit交易,在拥有不同的见证数据的情况下,可能会有不同的重量。

让我们举个例子来说明一下。
一笔包含500字节见证数据的总大小1,000字节的隔离见证交易。
一笔包含300字节见证数据的总大小1,000字节的隔离见证交易。

还记得交易重量计算公式吗?

交易重量=(移除见证数据的交易大小)*3+(交易大小)

所以这两笔交易的重量分别为2500和3100。虽然交易大小都是1,000字节,SegWit下的交易却因为拥有不同大小的见证数据,而拥有不同的交易重量。

让我们换个角度再来计算下这种情况下的交易重量:拥有不同交易大小的交易,可能有相同的交易重量。

咱们再举个例子来说明一下。
一笔包含400字节见证数据的总大小800字节的隔离见证交易。
一笔包含800字节见证数据的总大小1,100字节的隔离见证交易。
一笔500字节的非隔离见证交易。

大家赶紧用交易重量公式算起来~

答案揭晓:这三笔交易的重量都是2000。那么在目前的比特币网络遗留节点(legacy nodes)中,这几笔交易又将如何被记录呢?分别是400字节,300字节和500字节,对不对?为啥?因为见证数据是不会包含在最终记录在遗留节点中的交易大小里的。这就是SegWit节点显示的区块大小和遗留节点的区块大小显示不一的根本原因所在了。目前,在BTC.com区块浏览器里显示的Size是该区块所承载的真实交易大小,也就是在SegWit nodes中的区块大小(所以这个区块大小可能大于1,000,000字节);而Stripped Size则是将见证数据移除后legacy nodes接收的区块大小(所以该区块大小仍然小于或等于1,000,000字节)。

Snip20170829_262

隔离见证激活后的节点不再聚焦于区块大小,也就是block size,而是将关注点转移至区块重量(block weight),这也就造成segwit节点接收的区块大小变大。理论上来说,一个区块的大小在SegWit nodes中可以无限接近4MB(为什么?聪明的你是不是马上就算出来了呀),但这个区块的Stripped Size却仍然小于或等于1,000,000字节。区块大小接近4MB,这种情况在现实中发生的概率极少。按照目前的估算,SegWit交易下的区块大小将在2MB左右。这就是为什么人们说隔离见证会有区块‘扩容’效果的根本原因所在了。再次强调一下,区块大小是增加了,但遗留节点接收的区块仍然小于或等于1,000,000字节,因为见证数据(witness data)均被移除。
那么问题又来了,截止2017年8月29日07时,SegWit激活后的最大区块是哪家矿池挖出来的?相信聪明的你已经知道答案了,对不对?

Snip20170829_263

猛戳‘阅读原文’,查看历史上第一个破百万的区块到底长啥样吧~
参考文献:

https://bitcoincore.org/en/segwit_adoption/

https://medium.com/@jimmysong/understanding-segwit-block-size-fd901b87c9d4

https://www.bitsonline.com/segwit-bitcoin-blocks-1mb/

https://bitcoinmagazine.com/articles/segregated-witness-activates-bitcoin-what-expect/

https://www.coindesk.com/50-blocks-segwit-bitcoins-coming-upgrade-blockchain-game-changer/

发文时比特币价格 ¥28722.01
作者:Leona 原文载于:BTCcom(微信公众号) 版权声明: by nc" sa 作者保留权利。文章为作者独立观点,不代表巴比特立场。

评论:1

您需要登录后才可以回复 登录|注册
    Author Image
    比特小鬼 25 天前

    一脸懵逼

    +1
    +1
    我要点评