这是一个古老的话题,然而,我觉得它必须被分享,因为在Segwit实现之后仍然听到一些关于块容量和块载量的困惑。
要理解这些,我们必须首先了解在Segwit之后对事务结构所做的更改。
Segwit之前和之后的交易
· 在Segwit之前:每个事务都有一个事务哈希值、输入脚本、脚本签名和输出脚本。
· 在Segwit之后:为每个事务输入脚本和脚本签名,在Segwit中这些脚本签名被替换为EMPTY和OP_TRUE。在另一个名为Witness的部分中替换了输入脚本和脚本签名。Witness可选存储。这意味着您可以选择存储或不存储证人。这可能会提出一个问题,如果你不存储证人,你如何验证交易?事实上,我们不能。如果您不存储证人,您无法验证该事务,您的节点将把该事务视为空投。在我写这篇文章时,90%的节点是Segwit,其余10%不是。这意味着,这10%的节点不存储证人。
在Segwit中,证人用scriptSig分隔,input_script分别用块中的OP_TRUE和EMPTY替换
区块中的Segwit交易
众所周知,每个Merkle根是每次获取两个事务的哈希值。如前所述,除了输入脚本和脚本签名之外,witness与事务本身是分离的。 现在构造了一个单独的Witness trie,它附加在Coinbase事务的末尾。就像交易条件一样,证人也有证人条件。Witness Trie Root现在也包含在块头中。
如前所述,证人是可选的。这意味着,如果您正在运行非segwit或遗留节点,则可以删除/不下载图中绿色表示的Witness Trie。这样做是为了确保Segwit是向后兼容的,因此它是软叉。
交易容量和交易载量的概念
Segwit被引入后,一个新的载重概念被引入。
segwit交易分为两部分:
· 交易的Segwit部分:交易的证人被划分为交易的Segwit部分。
· 交易的Segwit部分:除证人外的所有其他部分都属于交易的非Segwit部分。
这意味着,Segwit事务有两个部分,即Segwit部分和非Segwit部分,而非Segwit事务只有一个部分(默认情况下,这是事务的非Segwit部分)
任何交易的载重由一个简单的公式定义:
3*(non-segwit-part-of-transaction) + 1*(segwit-part-of-transaction)
这意味着,如果一个交易是遗留交易,那么它的载重更大,因为它的所有部分都是非部分交易
Tx的总权值= 1*(segwit-data) + 3*(non-segwit-data)。
块权值定义为块中所有事务的权值之和。
块大小、Segwit块大小和区块重量
现在一个块可以包含遗留事务和segwit交易。
在我们继续之前,我们必须知道这三个术语的简单定义。(注:以上为粗略定义,仅供简单解释):
· 块大小: 块中所有非segwit数据的大小之和+ 块头。
· Segwit块大小: 块中所有非Segwit数据的大小之和+块中所有Segwit数据的大小之和+块头
· 区块重量: 块中所有事务的权值只和。
比特币对块大小的限制是1MB。在我撰写本文时,这里的示例块大小为1204.232 Kb。这是指Segwit块的容量。如果从这个块中删除segwit数据,那么块大小将小于1Mb。块的最大载重可以是4MBU
下面的图说明了一个块如何具有segwit和非segwit事务,以及如何计算块大小、segwit块大小和块载重。(本例中为2个Segwit事务和4个非Segwit事务)
实现segwit后的常规块,以及如何计算块遗留块大小、segwit块大小和块载重。
这表明,在遗留块的大小小于1MB之前,它是链上的有效块。其中segwit块大小可以大于1mb,但必须确保块载量小于4MB。
我们可以将图表等同如下:
legacy_block_size = Σ(size_of_non-segwit-data_of_each_transaction)
segwit_block_size = legacy_block_size + Σ(size_of_segwit-data_of_each_transaction)
一个块,non_segwit_weight segwit_weight被定义为
non_segwit_weight = 3*∑(size_of_non-segwit-data_of_each_transaction)
segwit_weight = 1*∑(size_of_segwit-data_of_each_transaction)
block_weight = non_segwit_weight + segwit_weight
一个块是有效的:
legacy_block_size <= 1 MB
block_weight <= 4MBU
结论
· 如果您运行一个Segwit节点,您将收到可能大于1MB的Segwit块,而如果您运行一个非Segwit节点,Segwit块中的所有证人都将被删除,该块将成为遗留块。这个遗留块小于1MB。
· Segwit是一个软分支,这意味着不从遗留节点更改为Segwit仍然会使您的节点在链上成为一个有效的、及时的节点。但是,您将无法验证该块中segwit事务的有效性。
· 对于非挖掘节点,segwit是一个优势,因为现在随着证人的移除,更多的事务被放入块中。
· 然而,这并没有被普遍接受,因为社区中的一些人对Segwit感到不舒服,原因是一些节点没有证人/签名。这导致了链分裂,并创造了比特币现金。比特币现金现在有一个可调整的块大小。
· 就像遗留地址一样,Segwit地址也存在。对于遗留地址,P2PKH和P2SH分别代表“支付到公钥哈希值”和“支付到脚本哈希值”。对于Segwit地址,P2WPKH和P2WSK分别代表“付费见证Pubkey Hash”和“付费见证Script Hash”。至于每一地址的制作方法将在另一篇文章中讨论。