隔离见证如何工作在开始我们先要简单回顾比特币交易结构

资讯 9个月前 manoon
0


隔离见证如何工作在开始我们先要简单回顾比特币交易结构

比特币的可扩展性问题是它面临的主要问题之一,也是很多人努力的方向。比如有“闪电网络”的想法;然而,由于比特币本身的一些缺点,闪电网络在比特币网络中实现的条件似乎并不具备。另一种解决方案,“隔离见证”也致力于提高可扩展性,但它也解决了许多问题,包括一些需要为闪电网络实施修复的缺陷。在本文中,我们将解释隔离见证的优势及其工作原理。

隔离见证(SegWit)是由多个 BIP(141、142、143、144 和 145))描述的软分叉。其主要目的是优化比特币交易区块交易的结构,将交易签名(也称为“脚本签名(scriptSig)”、“见证”或“解锁脚本”)从交易移到一个单独的结构中。它不仅可以减少比特币交易的数据量(因此,一个区块可以填充更多的交易),还可以解决“交易延展性”的问题(即阻碍比特币交易实现的缺陷)。我们在开头提到的闪电网络)。支付通道和闪电网络基于比特币交易结构的技术非常关键。

隔离见证在开始之前是如何工作的

让我们首先简要回顾一下比特币支付系统。它不像银行,它是一个账户和余额列表。相反,每个比特币地址的余额由发送到该地址的一系列交易表示;交易数据结构的主要部分是输入输出。输入是我们想要花费的前一笔交易(准确的说,输入不会是一个完整的交易,而是某笔交易的输出,因为我们可能在一笔交易中将资金转移到多个地址),交易的输出是我们的资金发送到的目的地地址。下图显示了比特币交易的结构:


隔离见证如何工作在开始我们先要简单回顾比特币交易结构

输出中的PubKey Script字段(以下简称“scriptPubKey”)就是我们所说的“锁定脚本”。它用于确保只有接收地址的所有者才能使用支出。 Signature Script 字段(以下简称“scriptSig”)也称为“解锁脚本”,因为它是用于打开锁定脚本的密钥,用于证明地址的所有权。

(编者注:这里有一个gif动画,展示了比特币栈是如何执行的,但在微信公众号推文中无法显示。强烈建议在网站上观看。)

关于比特币交易的更多细节以及锁定和解锁脚本的功能,请看这里。

向后兼容性

实际上,隔离见证不仅改变了交易的结构,还改变了交易的输出。然而,这并不是说传统的 UTXO(未花费的交易输出)和 SegWit UTXO 不能在同一个交易中使用:在这种情况下,传统的 UTXO 会在输入(脚本签名字段)中加载所有权证明,而Segregated Witness 类型的 UTXO 将在交易输入以外的结构中加载证明。

反正隔离见证的定位是软分叉。这种升级应该可以忽略不计,不需要是强制性的。此外,这也意味着未升级的节点应该能够处理隔离见证类型的输出。事实上比特币交易原理,老节点和钱包会认为任何人都可以花费这些 UTXO,即这些 UTXO 可以用空签名来花费,所以即使在交易中没有看到签名,交易仍然有效。升级后的节点和钱包将在交易输入之外的特殊“见证”字段中寻找签名。

Case Pay-to-Witness-Public-Key-Hash

我们用一个例子来说明隔离见证如何改变交易的数据结构。从标准的 Pay-to-Public-Key-Hash (P2PKH) 交易类型开始。

我们感兴趣的部分是输出,尤其是它的“scriptPubKey”字段(锁定脚本字段)。让我们首先考虑一个标准的锁定脚本:

Segregated Witness 后的锁定脚本如下:

如您所见,Segregated Witness 的输出比传统类型的输出简单得多:只有两个值会被压入脚本执行堆栈。正如我们上面所说,旧版本的比特币客户端会认为这个输出是掉在地上的钱——这个输出可以在不提供签名的情况下花费。但是,新客户端会将第一个数字解释为版本号,而第二个数字对应于锁定脚本(见证程序)。实际上,这里只能使用压缩公钥的哈希值。我们稍后再谈。

我们来看看这个输出用完的情况。传统交易在花费时输出的数据结构如下:


隔离见证如何工作在开始我们先要简单回顾比特币交易结构

但是,在花费隔离见证输出时,交易的scriptSig将为空,所有签名都会放在一个特殊的地方:


隔离见证如何工作在开始我们先要简单回顾比特币交易结构

警告

虽然传统客户端可以处理隔离见证交易(再次声明,他们会将这些输出视为成年人可以花的钱),但他们不能自己花这些钱:旧钱包可能会尝试使用空签名来花隔离见证的输出,但这个交易在现实中是无效的(更新的节点不允许这样的交易被链接)。这意味着发送方必须知道接收方的钱包不支持隔离见证才能为其创建适当类型的输出。

根据 BIP 143 的定义,隔离见证的输出应使用压缩公钥的哈希值创建。如果您使用传统类型的地址或未压缩公钥的哈希值,则此输出将无法使用(您的硬币将被锁定)。

支付给见证人脚本哈希

另一种关键交易类型是 P2SH。它允许将交易发送到脚本的哈希值(而不是公钥的哈希值,即比特币地址)。为了花费 P2SH 交易的输出,花费者需要提供一个脚本(称为“赎回脚本”),其哈希值应与 UTXO 中的脚本哈希值匹配,并基于此脚本提供签名/密码/其他东西。这种用法可以保护解锁脚本,让发送者无法知道地址的内容,也可以节省空间:例如,多签名钱包的锁定脚本可能很长,所以我们必须保存整个锁;使用P2SH,只能保存一个哈希值。


隔离见证如何工作在开始我们先要简单回顾比特币交易结构

假设有一个多重签名钱包,需要提供 5 个私钥中的 2 个签名才能使用。如果使用传统交易,P2SH交易输出的锁定脚本如下:

当你想要花费时,花费者(也是最后一笔交易的接收者)需要提供一个赎回脚本,该脚本定义了花费条件(多重签名,2-5),和两个签名)。所有这些都必须放在交易的输入中:


隔离见证如何工作在开始我们先要简单回顾比特币交易结构

我们来看看使用隔离见证后的发送方和接收方。输出锁定脚本如下:

就像P2PKH交易一样,这个输出脚本变得更简单了。第一个值代表版本号,第二个是赎回脚本(见证程序)对应的SHA256哈希值(32位)。某种意义上,这个函数是用来区分P2WPKH的witness program和P2WSH的witness program(32-byte SHA256 hash value vs. RIPEMD160(SHA256(script)))的长度。

使用此输出的交易如下所示


隔离见证如何工作在开始我们先要简单回顾比特币交易结构

在 P2SH 中嵌入隔离见证

我们已经看到使用隔离见证有很多好处。但是,上面的例子只适用于发送方和接收方都升级了软件的情况。但现实并非总是如此。考虑这种情况:

Alice 想转移一些 btc 给 Bob。 Bob 有支持隔离见证的钱包软件,但她没有。显然他们只能使用标准的交易形式,但 Bob 希望使用 SegWit 来降低手续费。

此时,Bob 可以创建一个包含 SegWit 脚本的 P2SH 地址,Alice 会将此地址视为正常的 P2SH 地址,因此他可以直接向该地址转账,没有任何问题。但是 Bob 可以使用 SegWit 交易来使用这个输出并获得佣金折扣(我们将在下面解释 SegWit 交易佣金的新定价方法)。

这就是在 P2SH 中实现两种类型的 SegWit 交易,P2WSH 和 P2WPKH。

P2SH(P2WPKH)

要在 P2SH 交易中实现 P2WPKH 交易,Bob 需要使用他的公钥来创建见证程序。然后将结果散列并转码为地址:

第一个值是版本号,第二个值是 20 字节的公钥哈希值。该脚本先进行SHA256哈希运算,然后进行RIPEMD160运算,可以得到一个20字节的哈希值。

这个P2WPKH见证程序的HASH160结果:

转换为地址:

发送到这个地址的输出锁定脚本好像和普通P2SH地址的脚本一样:

然后当 Bob 花费输出时,交易的结构将如下所示:


隔离见证如何工作在开始我们先要简单回顾比特币交易结构

一开始,我们创建的赎回脚本(即witness program)会进行hash计算。如果结果与锁定脚本中的哈希值匹配,则执行脚本,程序将验证它是否放置在见证字段的签名中。

P2SH(P2WSH)


隔离见证如何工作在开始我们先要简单回顾比特币交易结构

P2WSH 脚本也可以用 P2SH 实现。让我们考虑上面提到的 2-5 多签名钱包示例。所有步骤都和P2SH(P2WPKH)没有区别:

首先,创建一个见证程序:

第一个值是版本号,第二个值是32位SHA256哈希值,对应我们的签名脚本。然后我们把这个见证程序的HASH160哈希值,转换成一个普通的P2SH地址。为了使用发送到这个地址的输出,我们需要在scriptSig字段中发布witness程序,并在witeness字段中提供完整的多重签名脚本。

隔离见证的好处

梳理技术部分后,我们可以了解隔离见证的主要优势。

交易融合漏洞

SegWit 解决的一个关键问题是比特币交易的“可熔性”,即比特币交易的 ID 是哈希值导致的问题。详细说一下吧。

在之前的比特币交易中,签名被放置在交易的输入部分,第三方可以在不使交易无效的情况下更改签名。这允许第三方更改交易 ID(即交易的哈希值),而无需更改交易的“关键”字段(例如输入、输出和传输的数量)。这样交易还是有效的,意思还是一样的,但是有了另一个ID,就可以用来进行另外的攻击,比如DoS攻击(拒绝服务攻击)。

SegWit 解决了这个问题,因为所有的签名都放在交易之外,所以签名的改变不会导致交易的哈希值改变,也不会影响交易的ID。 Segregated Witness 还引入了一个特殊的标识符,叫做“wtxid”:它是交易的哈希值和整个见证部分,所以如果一个交易在没有任何见证数据的情况下传播,交易 ID(txid)等于 wtxid。

这个解决方案让我们可以创建一系列连续的未确认交易,而无需担心任何风险,这对于闪电网络等协议非常重要。 (译者注:这里的意思可能是,如果交易融合的问题不解决,支付渠道参与者将无法快速检索到对方是否将过时的渠道交易上链,因为内容相同的交易可能会出现完全不同的ID)。

网络和存储扩展

见证数据通常是交易数据的最大部分。在使用多重签名脚本的交易中,见证人可能会占到交易数据量的 75%。多亏了 SegWit,签名的传输成为了一种选择:只有节点在想要验证交易时才需要请求这些数据。而不支持SegWit的SPV(Simple Payment Verification)客户端和节点不需要下载额外的数据,可以节省硬盘空间。

扩大可用区块空间,降低交易费用

SegWit 类型的交易比以前的交易类型便宜,因为它减少了需要存储的见证数据量。准确地说比特币交易原理,“大小”(数据大小)的概念在 SegWit 类型的交易中略有不同。它引入了“虚拟大小”的概念:所有放置在witness部分的数据都会乘以0.25来计算数据大小,这样可以将更多的交易打包到一个区块中。我们来看一个例子。

假设我们有一个传统类型的事务,数据大小为 200 字节。那么 5000 个这样的交易可以放在一个 1MB 的块中。一个等效的 SigWit 交易在见证区有 120 个字节,因此其虚拟大小为 80 + 0.25 * 120 = 110 个字节,因此该块可以包含 9090 个这样的交易。如果链上交易手续费为每字节40satoshis,交易手续费将从8000satoshis降低到4400satoshis,几乎是半折。 (译者注:“Satoshi”是比特币的单位,是比特币的十亿分之一。)

脚本版本

您可能已经注意到,每个锁定的脚本都有 1 个字节来指示脚本的版本。使用不同的版本号可以以软分叉的形式添加或更改功能(语法更改、新运算符等)。

签名验证效率优化


隔离见证如何工作在开始我们先要简单回顾比特币交易结构

Segregated Witness 还优化了签名算法(如 CHECKSIG、CHECKMULTISIG 等)的效率。在 SegWit 之前,hash 计算的次数与签名数量的平方成正比,但使用 Segregated Witness,算法的计算复杂度降低到 O(n)(与签名数量成正比)。


隔离见证如何工作在开始我们先要简单回顾比特币交易结构

那有什么问题?

如果利润没有坏处,为什么会有人认为有问题?比特币社区中有很多人反对这种升级,因为尽管它有这么多优点,但也有一些缺点。我们来看看反对者提出的一些意见。

结论

虽然 SW 解决的问题很可能有更优雅的解决方案,但我们仍然认为,目前这是提高网络可扩展性和实现闪电网络等技术的最佳方式。更详细的分析我们会放在下一篇文章中。


隔离见证如何工作在开始我们先要简单回顾比特币交易结构

参考资料

暂无评论

暂无评论...