比特币内部:隔离见证(SegWit)。第8B部

比特币隔离见证

本文是B的第八部分-这次专门讨论SegWit-有关比特币技术性更强的部分的一系列深入说明,甚至对于那些不是编码专家的人也可以使用。

下面继续介绍一种旨在逐步进入许多人称为“兔子洞”的指南。

就书目而言,有必要提及Andreas M. Antonopoulos所著的“ Mastering Bitcoin”(精通比特币)一书,并从中拍摄了图像。

隔离证人(SegWit)

这是协议和共识规则的升级,提出并实施为2017年8月1日在主网上激活的软分叉(BIP-9)。在密码术中,见证人一词用于描述密码解决方案难题:在比特币中,见证人符合UTXO上设定的条件。

数字签名是见证人的一种类型,但是“见证人”一词被广泛用于满足UTXO上设置的条件的事物,因此通常是对解锁脚本或scriptSig进行操作。在SegWit之前,每笔交易输入之后都是解锁它的见证人:见证数据作为每笔输入的一部分嵌入到交易中。隔离见证一词仅表示分离特定输出的签名或解锁脚本,将其从scriptSig字段移至随交易进行的单独见证数据结构。客户可以请求带有或不带有见证数据的交易数据。

SegWit是一项结构性变更,修改了比特币可扩展性,安全性,经济激励措施和性能的多个方面。

  • 交易延展性。交易的哈希不再包含见证(仅交易的一部分可以由第三方修改),因此消除了可延展性攻击的可能性(只有交易的创建者可以修改数据),极大地改善了基于高级比特币交易结构的其他协议的实现(支付渠道,链接交易,LN…)。
  • 脚本版本控制。使用SegWit脚本时,每个块脚本之前都带有许多版本脚本,从而可以向后兼容升级脚本语言(例如,使用forks)以引入新的操作数,语法或语义。以无中断方式改进脚本语言的能力将极大地提高比特币的创新速度。
  • 网络和社交扩展。见证数据是交易规模的决定性贡献,在某些情况下(多重签名或支付渠道)超过75%。节点可以在验证签名后“修剪”见证数据,或者在简化的支付验证(SPV)中完全忽略它们:不必将见证数据传输到所有节点(并“扭曲”)。
  • 签名验证优化。它改进了签名功能(CHECKSIG,CHECKMULTISIG等),从而降低了算法的复杂性。在SegWit之前,用于生成签名的算法需要一定数量的散列操作,这些散列操作与事务的大小成正比:相对于签名操作的数量,散列增加了O(n2),而所有验证签名的节点(使用SegWit算法已更改,将复杂度降低到O(n))。

  • 脱机签名改进。 SegWit签名将每个输入的值(量)合并到签名的哈希中。以前,脱机设备(硬件钱包)必须在签署交易之前验证每个输入的数量(这是通过在以前称为交易的输入上传输大量数据来完成的)。由于该金额是签名哈希的一部分,因此脱机设备不需要之前的交易。如果金额不匹配,签名将无效。

隔离见证是UTXO使用方式的改变,因此是每输出功能。当交易花费UTXO并因此必须提供见证时,交易可以花费传统的SegWit输出或同时使用这两者(谈论SegWit交易没有意义,而谈论SegWit输出)。在传统的UTXO中,阻止脚本要求在UTXO花费的部分交易输入中以内联方式提供见证数据。取而代之的是,UTXO SegWit指定一个块脚本,该块脚本可以用输入(“隔离”)之外的见证数据满足。

这是产出和交易构建方式的重大变化。此类更改通常需要同时更改每个比特币节点,钱包等,以更改共识规则(硬分叉)。 SegWit以更轻便,向后兼容(软分叉)的方式引入:这种升级使未升级的软件可以忽略更改并继续运行而不会受到干扰。构建SegWit输出,以便即使“旧”系统(不支持SegWit的系统)也可以对其进行验证。这些输出可以使用空签名使用,因此事务内没有签名(被隔离)的事实不会使事务无效。但是,新的钱包和矿工会看到SegWit输出,并等待在交易见证数据中为他们找到有效的见证人。

P2PKH输出脚本的示例:

DUP HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 EQUILVERIFY CHECKSIG

隔离见证将创建“付费见证公开密钥哈希”(P2WPKH)输出脚本:

0 ab68025513c3dbd2f7b92a94e0581f5d50f654e7

它比传统的输出脚本简单,它包含两个值,这些值被推入验证脚本的堆栈中。对于旧的(非SegWit)比特币客户端,这两个推入的值看起来像是任何人都可以使用且不需要签名(或者可以使用空签名使用)的输出。新客户端(SegWit)将第一个数字(0)解释为“版本”(见证版本),将第二个部分(20字节)解释为等效于称为“见证程序”的块脚本(公钥的哈希值,如P2PKH脚本中所示)。

为了使用SegWit输出,该事务在输入上没有签名,但是在事务本身之外具有空的scriptSig并包括“隔离见证”。

重要的是要注意,P2WPKH仅应由接收方创建,因为发送方无法知道接收方钱包是否具有建立SegWit交易和消费P2WPKH输出的能力。此外,这些输出必须从压缩的公共密钥的哈希值构建,非压缩的输出在SegWit中不是标准的,并且可以由以后的软分叉禁用。

见证程序的第二种类型对应于按脚本付费(P2SH)脚本。这些脚本引用了赎回脚本的哈希值,该哈希值定义了花费资金所需的多个签名(M-of-N)。兼容SegWit的钱包可以创建“付款至见证脚本哈希(P2WSH)”输出脚本:

0 a9b7b38d972cabc7961dbfbcb841ad4508d133c47ba87457b4a0e8aae86dbb89

与P2WPKH中的脚本一样,该脚本比传统脚本更简单,并且由堆栈中的两个推入值组成:见证脚本的见证版本(0)和32字节哈希SHA256。

可以将两种形式的见证脚本P2WPKH和P2WSH插入P2SH地址:P2SH(P2WPKH)和P2SH(P2WSH)。即使在激活SegWit之后,升级大多数钱包也要花费一些时间(SegWit可以嵌入到P2SH中,这使其很容易与不支持SegWit的钱包兼容)。一旦SegWit得到广泛支持,就可以将见证脚本编码为本机SegWit地址,而不是将其嵌入P2SH:这种本机SegWit地址格式在BIP-173中定义。

比特币内部帖子:隔离见证(SegWit)。第8B部分首先出现在The Cryptonomist上。

资讯来源:由0x资讯编译自CRYPTONOMIST。版权归作者Alessio Salvetti所有,未经许可,不得转载
提示:投资有风险,入市需谨慎,本资讯不作为投资理财建议。请理性投资,切实提高风险防范意识;如有发现的违法犯罪线索,可积极向有关部门举报反映。
你可能还喜欢