主页 > 苹果可以下载imtoken钱包吗 > 解读比特币的可扩展性解决方案:隔离见证
解读比特币的可扩展性解决方案:隔离见证
比特币的可扩展性问题是它面临的主要问题之一,也是许多人正在努力解决的问题。比如有“闪电网络”的想法;但是,要在比特币网络中实现闪电网络,条件似乎并不具备,因为比特币本身存在一些不足。另一个解决方案,隔离见证,也旨在提高可扩展性,但它也解决了许多问题,包括闪电网络实施需要修补的一些缺陷。在本文中,我们将解释 Segwit 的优势及其工作原理。
隔离见证(SegWit)是由多个 BIP(141、142、143、144 和 145) 描述的软分叉,主要目的是优化 bits 结构比特币交易和区块,将交易的签名(也称为“脚本签名(Sig)”、“见证”或“解锁脚本”)从交易中移到一个单独的结构中。它不仅可以减少比特币交易,而且还可以解决“交易延展性”问题(也就是我们开篇提到的阻碍闪电网络实施的缺陷),而支付渠道对于闪电网络等基于比特币的交易结构。
隔离见证如何在开始之前工作
让我们首先简要回顾一下比特币的支付系统。它不像银行,它是账户和余额的列表。相反,每个比特币地址的余额由发送到该地址的一系列交易表示;交易数据结构的主要部分是输入和输出。输入是我们要花费的预购交易(准确的说,输入不会是一笔完整的交易,而是某笔交易的输出,因为我们可能在一笔交易中将资金转移到多个地址),输出交易是我们的资金发送到的地址。下图显示了比特币交易的结构:
输出中的 PubKey 字段(以下简称“PubKey”)就是我们所说的“锁定脚本”。它用于保证只有接受地址的所有者才能使用此支出。Signature 字段(以下简称“Sig”)也称为“解锁脚本”,因为它是用于打开锁定脚本的密钥,用于证明地址所有权。
(编者按:这是一个 gif 展示了比特币的堆栈是如何工作的,但在微信公众号推文中看不到。强烈建议在网站上观看。)
有关比特币交易以及锁定和解锁脚本功能的更多详细信息,请参见此处。
向后兼容性
事实上,隔离见证不仅改变了交易的结构,还改变了交易的输出。然而,这并不是说传统类型的 UTXO(未使用的交易输出)和 SegWit 类型的 UTXO 不能在同一交易中使用:在这种情况下,传统类型的 UTXO 将在内部加载所有权证明输入(脚本签名字段),而 SegWit 类型的 UTXO 将在交易输入以外的结构中加载证明。
无论如何,Segregated Witness 的定位是一个软分叉,这个升级应该被忽略而不是强制,这也意味着没有升级的节点应该能够处理 Segregated Witness 类型的输出。实际上,旧节点和钱包会假设任何人都可以使用这些 UTXO,即这些 UTXO 可以在签名为空的情况下使用,因此即使在交易中看不到签名,交易仍然有效。升级后的节点和钱包将在交易输入之外的专用“见证”字段中寻找签名。
案例付费证人公钥哈希
让我们用一个例子来说明 SegWit 如何改变交易的数据结构。从标准的 Pay-to-Public-Key-Hash (P2PKH) 交易类型开始。
我们感兴趣的部分是输出,尤其是它的“PubKey”字段(锁定脚本字段)。让我们首先考虑一个标准的锁定脚本:
SegWit 之后的锁定脚本如下所示:
可以看到,SegWit 的输出比传统类型的输出要简单得多:只有两个值被压入脚本执行堆栈。正如我们上面所说,旧版本的比特币客户会认为这个输出是在地上掉下来的钱——在没有提供签名的情况下花费这个输出。但是,新客户端将第一个数字解释为版本号,而第二个对应于锁定脚本(见证程序)。实际上,这里只能使用压缩公钥的哈希值。我们稍后会谈到这个。
让我们看看使用此输出时会发生什么。一个传统交易在花费时的输出数据结构如下:
但是,当花费隔离见证输出时,交易的 Sig 将为空,并且所有签名将转到一个专用位置:
警告
虽然传统客户可以处理隔离见证交易(同样,他们将这些输出视为每个人都可以花的钱),但他们不能自己花钱:旧钱包可能会尝试用空签名来消费 使用隔离见证输出,但这种交易是实际上是无效的(更新后的节点将不允许这样的交易上链)。这意味着发送者必须知道接收者的钱包是否支持 SegWit 才能为其创建适当类型的输出。
根据 BIP 143 的定义,隔离见证输出应使用压缩公钥的哈希值创建。如果您使用传统类型的地址或未压缩公钥的哈希,则此输出将不可用(您的硬币将被锁定)。
付费见证——哈希
另一种关键交易类型是 P2SH。它允许将交易发送到脚本的散列(而不是公钥的散列,即比特币地址)。为了花费 P2SH 交易的输出,花费者需要提供一个脚本(称为“赎回脚本”),其哈希应该与 UTXO 中的脚本哈希匹配,并基于此脚本提供签名/密码/某些东西。这种用法保护了解锁脚本不让发送者知道地址的内容,同时也节省了空间:例如,多重签名钱包的锁脚本可能很长,所以我们必须保存整个锁;使用 P2SH 可以只存储一个哈希值。
假设现在有一个多重签名钱包,需要使用 5 个私钥中的 2 个签名。如果使用传统交易,P2SH交易输出的锁脚本如下:
要花费它,花费者(也是前一笔交易的接收者)需要提供一个赎回脚本,该脚本定义了花费条件(多重签名、2-5) 和两个签名)。所有这些都将放在交易的输入中:
让我们看看使用隔离见证后的发送方和接收方。输出锁定脚本如下:
就像 P2PKH 交易一样,这个输出的脚本也更简单。第一个值是版本号,第二个是兑换脚本(见证程序)对应的 SHA256 哈希(32 位)。此函数在某种意义上用于按长度区分 P2WPKH 见证与 P2WSH 见证(32 字节 SHA256 哈希与 RIPEMD160(SHA256()))。
使用此输出的事务如下所示:
在 P2SH 中嵌入隔离见证
我们已经看到使用 SegWit 的好处。但是,上述示例仅在发送方和接收方都已升级软件的情况下才有效。但现实并非总是如此。考虑这样一种情况:
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 花费输出时,交易的结构将如下所示:
一开始,我们创建的赎回脚本(即见证程序)会经过一个哈希计算。如果结果与锁定脚本中的哈希值匹配,则脚本将被执行,程序将验证放置在见证字段中的内容。符号。
P2SH (P2WSH)
P2WSH 脚本也可以用 P2SH 实现。让我们考虑上面描述的 2-5 多重签名钱包的例子。所有步骤都与 P2SH(P2WPKH) 没有区别:
首先,创建一个见证程序:
第一个值是版本号,第二个值是我们的签名脚本对应的 32 位 SHA256 哈希。然后我们把这个见证程序的 HASH160 哈希值转换成一个普通的 P2SH 地址。要使用发送到该地址的输出,我们需要在 Sig 字段中发布见证程序,并在见证字段中提供完整的多重签名脚本。
隔离见证的好处
梳理完技术部分,我们就可以了解SegWit的主要优势了。
交易熔断漏洞
SegWit 解决的一个关键问题是比特币交易的“可熔性”,即比特币交易的 ID 是哈希值所导致的问题。让我们详细介绍一下。
在以前的比特币交易中,签名是放在交易的输入部分,第三方可以在不使交易失效的情况下更改签名。这允许第三方在不改变交易的“关键”字段(例如输入、输出、转账的数量)的情况下更改交易 ID(即交易哈希)。这样,交易仍然有效,含义相同,但是有了另一个ID,这可以用来执行另一种攻击,例如DoS攻击(拒绝服务攻击)。
隔离见证解决了这个问题,因为所有的签名都放在了交易之外比特币交易id查询网站,所以签名的改变不会导致交易的哈希值改变,也不会影响交易的ID。Segwit 还引入了一个特殊的标识符,称为“wtxid”:它是交易和整个见证部分的哈希,因此如果在没有附加任何见证数据的情况下传播交易比特币交易id查询网站,则交易 ID(txid)等于 wtxid。
该解决方案允许我们创建一系列连续的未确认交易而没有任何风险,这对于像闪电网络这样的协议非常重要。(译者注:这里的意思可能是,如果交易熔断问题没有解决,支付通道的参与者无法快速检索到对方是否将过时的通道交易上链,因为相同内容的交易可能会被出现完全不同的 ID)。
网络和存储扩展
见证数据往往是交易数据的最大部分。在使用多重签名脚本的交易中,见证人可能占到交易数据量的 75%。多亏了 SegWit,签名的传输变得可选:节点只有在想要验证交易时才需要请求这些数据。不支持 SegWit 的 SPV(Simple Payment Verification)客户端和节点也不需要下载额外的数据,可以节省硬盘空间。
增加可用区块空间,降低交易费用
SegWit 类型的交易比以前的交易类型更便宜,因为它减少了需要存储的见证数据。准确地说,“Size”的概念对于 SegWit 类型的交易略有不同。它引入了一个“虚拟大小”的概念:所有放在见证部分的数据都会乘以 0.25 来计算数据大小,这样就可以将更多的交易打包到一个块中。让我们看一个例子。
假设我们有一个数据大小为 200 字节的传统交易类型。然后可以将 5000 个这样的交易放在一个 1MB 的块中。一个等价的 SigWit 交易在见证区有 120 个字节,所以它的虚拟大小是 80 + 0.25 * 120 = 110 个字节,所以该块可以容纳 9090 个这样的交易。如果链上费用是每字节 40 satoshis,交易费用将从 8000 satoshis 降低到 4400 satoshis,这几乎是一个折。(译者注:“Satoshi”是比特币的单位,是btc的十亿分之一。)
脚本版本
您可能已经注意到,每个锁定脚本都有 1 个字节来表示脚本的版本。使用不同的版本号可以以软分叉的形式添加或更改功能(语法更改、新运算符等)。
签名验证效率优化
Segregated Witness 还优化了签名算法(如 CHECKSIG、CHECKMULTISIG 等)的效率。在 SegWit 之前,哈希计算的数量与签名数量的平方成正比,但使用隔离见证,算法的计算复杂度降低到 O(n)(与签名数量成正比)。
所以有什么问题?
如果没有伤害,为什么会有人认为有问题?比特币社区中有很多人反对这种升级,因为即使它有这么多优点,它也有一些缺点。让我们来看看反对者的一些评论。
综上所述
虽然 SW 解决的问题很可能有更优雅的解决方案,但我们仍然认为,目前这是提高网络可扩展性和开放闪电网络等技术实现的最佳方式。更详细的分析我们放在下一篇文章中。