隔离见证(二):原理中有新知

首先,区块里有个区块头和一个区块体;
其次,区块体里除了一个标识该区块有多少笔交易的“交易数量”字段,其余的就是一笔一笔的交易了;
然后,每笔交易都是由输入和输出组成,除了“版本号”、“锁定时间”、“输入数量”、“输出数量”几个字段,剩下的就是每个输入和输出的详情;
最后,在每个输入里,都有一个解锁脚本,解锁脚本里有一个数字签名和一个公钥。

这个解锁脚本有一个很重要的作用,就是用来做见证:比特币节点们用此来验证这笔交易是否发起人发起。

隔离见证,顾名思义,就是通过把见证相关的部分,也就是解锁脚本隔离出去,来减小每笔交易的大小,从而让1M大的区块能容纳更多的交易。

一个区块里有这么多东西,光把见证部分移出去,能省很多空间吗?我们不妨找个具体的交易来看看。如图:
这里写图片描述

这笔交易的长度(红框)为666字节。然后,点开右下角(红圆)的脚本,看到了输入脚本和输出脚本的详情。如图:

这里写图片描述

我们来看看输入脚本有多长?其实不用一个个去数,在它前面有一条指令:PUSHDATA(71),这条指令的意思就是把它后面的数据推入堆栈,参数就是要推入的数据长度,所以第一个输入的数字签名长71字节,然后紧接着还有个PUSHDATA(33)将33字节公钥地址也推入堆栈,这两个加起来就有104字节了,另外,两个PUSHDATA指令还占2个字节,那就是106字节。我们把4个输入相加得到见证部分的总长度是424字节。424比666,已经接近70%了。

而且因为一个输入就有一个签名,一笔交易的输入越多,签名部分所占的比重可能就越高。有人专门统计了所有比特币区块的见证部分占比,发现平均高达60%-63%,所以,能把这部分空间省下来,效果还是不错的。

真正的问题来了。把这些解锁脚本从区块里拿出来,隔离到那个地方去呢?答案是。。。仍然在区块里!这不白忙活吗?当然不是。

我们暂且把支持隔离见证的节点叫新节点,支持隔离见证的区块叫新区块,同样,不支持隔离见证的叫老节点、老区块。

新区块里专门增加了一些空间,用于存放隔离出来的见证部分,就像在一列火车上加挂了一些车厢上去。新区块在每笔交易原来存放见证的那个地方,存了一个指针,根据这个指针可以找到它的见证部分在后面那3M空间的哪个位置。

从这一点来看,隔离见证方案和大区块方案是相同的,都必须扩大区块的容量,只不过大区块方案是简单的扩大,但隔离见证不光是扩大了容量,而且还改变了区块的结构,使之可以平滑过渡,无需硬分叉。

新节点将新区块播布出去,其他新节点收到,它们都认识新区块,能根据指针找到解锁脚本,没什么问题。如果老节点收到,也没多大问题,它们只认前面包含交易的那1M就行,后面的挂件直接忽略即可,当然,因为缺了见证部分,它们没办法去亲自验证那些支持隔离见证的交易。要验证的话只能依靠梅克尔树根了,具体原理见0628那篇文章。

另外,我们通常的比特币地址是1开头,但支持隔离见证的比特币地址是3开头,因为有大量多老地址在用,所以,一个支持隔离见证的新区块里不可能全部只包含新地址的交易,还得同时包含老地址的交易类型。也就是说,老区块里全是老式交易,新区块里既包含隔离见证交易,也包含老式交易。

在老区块里,衡量一个区块容量的参数就是区块大小,也就是区块长度,但在在新区块里引入了一个新的参数来表征区块容量,叫区块重量,简称“块重”。

顾名思义,块重是该区块所有交易的重量之和。
其中:老式交易的重量就等于它的长度的4倍(见第一图蓝框);新式交易的重量等于(交易长度-见证部分长度)*3+交易长度,比如一笔交易600字节,见证部分350字节,那么它的重量就是1350。以后,比较两个新区块的容量,就看谁的“块重”更大了。

猜你喜欢

转载自blog.csdn.net/weixin_42874184/article/details/81671689