主页 > 苹果可以下载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 可以在签名为空的情况下使用,因此即使在交易中看不到签名,交易仍然有效。升级后的节点和钱包将在交易输入之外的专用“见证”字段中寻找签名。

案例付费证人公钥哈希

比特币交易id查询网站_国外最大的比特币交易网站_如果国内比特币交易网站销户了,那以后怎么交易

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

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

SegWit 之后的锁定脚本如下所示:

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

让我们看看使用此输出时会发生什么。一个传统交易在花费时的输出数据结构如下:

但是,当花费隔离见证输出时,交易的 Sig 将为空,并且所有签名将转到一个专用位置:

警告

虽然传统客户可以处理隔离见证交易(同样,他们将这些输出视为每个人都可以花的钱),但他们不能自己花钱:旧钱包可能会尝试用空签名来消费 使用隔离见证输出,但这种交易是实际上是无效的(更新后的节点将不允许这样的交易上链)。这意味着发送者必须知道接收者的钱包是否支持 SegWit 才能为其创建适当类型的输出。

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

付费见证——哈希

国外最大的比特币交易网站_比特币交易id查询网站_如果国内比特币交易网站销户了,那以后怎么交易

另一种关键交易类型是 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 交易的新费用定价)。

如果国内比特币交易网站销户了,那以后怎么交易_国外最大的比特币交易网站_比特币交易id查询网站

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

P2SH(P2WPKH)

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

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

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

转换为地址:

发送到该地址的输出锁定脚本看起来像普通 P2SH 地址的脚本:

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

一开始,我们创建的赎回脚本(即见证程序)会经过一个哈希计算。如果结果与锁定脚本中的哈希值匹配,则脚本将被执行,程序将验证放置在见证字段中的内容。符号。

P2SH (P2WSH)

比特币交易id查询网站_国外最大的比特币交易网站_如果国内比特币交易网站销户了,那以后怎么交易

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)。

网络和存储扩展

比特币交易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 解决的问题很可能有更优雅的解决方案,但我们仍然认为,目前这是提高网络可扩展性和开放闪电网络等技术实现的最佳方式。更详细的分析我们放在下一篇文章中。