宇宙链 宇宙链
Ctrl+D收藏宇宙链

详尽解释隔离见证

作者:

时间:1900/1/1 0:00:00

比特币的可扩展性问题是其面临的主要问题之一,也是许多人努力的方向。比如说,有个设想是 “闪电网络”;但是,要在比特币网络中实现闪电网络,条件似乎还不具备,因为比特币自身的一些缺陷。另一个解决方案 “隔离见证(Segregated Witness)” 也致力于提高可扩展性,但它同时也解决了许多问题,包括闪电网络实现所需修补的一些缺陷。本文中我们会讲解隔离见证的优势及其工作原理。

隔离见证(SegWit)是一个由多个 BIP(141、142、143、144 和 145)描述的软分叉,其主要用意是优化比特币交易和区块的结构,将交易的签名(也叫 “脚本签名(scriptSig)”、“witness” 或 “解锁脚本”)从交易中移到一个独立的结构中。它不仅允许降低比特币交易的数据量大小(因此能让一个区块塞下更多的交易),也能解决 “交易熔融性(transaction malleability)” 问题(也就是我们开头提到阻碍闪电网络实现的缺陷),对支付通道和闪电网络这样基于比特币交易结构的技术来说极为关键。

在开始之前

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

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

知情人士:数字英镑路线图将于本周推出:2月6日消息,据每日电讯报援引消息人士报道,英国央行(BoE)和英国财政部认为,到2030年英国可能需要创建一种央行数字货币(CBDC),其中数字英镑路线图将于本周推出,同时进行联合公众咨询,英国央行副行长Jon Cunliffe定于2月7日就CBDC的最新工作发表讲话。[2023/2/6 11:49:18]

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

有关比特币交易和锁定脚本、解锁脚本功能的更多细节,可看此处。

后向兼容性

实际上,隔离见证不仅改变了交易的结构,也改变了交易的输出。不过,这不是说传统类型的 UTXO(未花费的交易输出)和 SegWit 类型的 UTXO 无法在同一笔交易中花费:这种情况下,传统类型的 UTXO 将在输入(脚本签名字段)内加载所有权证明,而隔离见证类型的 UTXO 将在交易输入以外的结构中加载证明。

不管怎么说,隔离见证的定位是一个软分叉,这个升级应该是可以忽略,无需强制的,而且,这也意味着,未升级的节点应该可以处理隔离见证类型的输出。实际上,旧的节点和钱包将以为任何人都能花费这些 UTXO,也即这些 UTXO 是空签名也可花费的,因此即使在交易中没有看到签名,交易也仍然是有效的。而升级后的节点和钱包将在交易输入以外的地方,一个专门的 “witness” 字段寻找签名。

Pay-to-Witness-Public-Key-Hash

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

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

而隔离见证之后的锁定脚本如下所示:

Neutrino关于将USDN转变为具有软锚定的多抵押资产的提案已获投票通过:12月27日消息,Waves生态稳定币协议Neutrino关于将USDN转变为具有软锚定的多抵押资产的提案以99%的支持率获得投票通过。根据提案,项目不仅会得到WAVES的支持,还将通过接受WX、SWOP、VIRES、EGG和WEST作为抵押品,Waves生态系统团队将把每个项目的代币总计1500万美元直接捐赠给Neutrino作为支持,稍后可以通过投票在抵押品中添加其他生态系统代币。此外,该项目将重新激活USDN和WAVES生态系统代币之间的交换以激励用户销毁USDN。

Chainlink数据显示,USDN价格目前跌至0.4720美元,脱锚状况加剧。

此前12月22日消息,Waves发布USDN恢复锚定计划提案,拟将WX、VIRES、SWOP、EGG和WEST作为抵押品。[2022/12/27 22:10:38]

如你所见,隔离见证的输出比传统类型的输出要简单很多:只有两个值会被推入脚本执行栈中。如我们上面说得,旧版本的比特币客户端会以为这个输出是掉在地上的钱 —— 无需提供签名就能花费这个输出。不过,新的客户端会将第一个数字解释为版本号,而第二个则对应着一个锁定脚本(witness 程序)。在现实中,只有压缩公钥(compressed public key)的哈希值可以用在这里。这一点我们后面再说。

再来看看这个输出被花费时的情形。传统交易的输出在花费时的数据结构如下:

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

虽然传统的客户端可以处理隔离见证的交易(再次提醒,他们会把这些输出当成人人都可以花的钱),但他们自己没法花这些钱:旧型的钱包可能会尝试用空签名来花用一个隔离见证的输出,但这笔交易在现实中是无效的(更新之后的节点不会允许这样的交易上链)。这就意味着,发送者必须知道接受方的钱包支不支持隔离见证,这样才能为之创建合适类型的输出。

所有主要借贷协议中仅有MakerDAO收入超过了其代币激励:9月29日消息,据token terminal统计,在所有主要的借贷协议中,只有MakerDAO的收入超过了代币激励。据Variant投资合伙人Mason Nystrom分析称,代币激励是一种新的获客成本(CAC)形式。每一美元的代币激励对应一个新客户或费用/收入。项目应确保其代币获取成本(TAC)和代币激励与转速比率在其市场内具有竞争力。[2022/9/29 6:02:10]

由 BIP 143 定义,隔离见证的输出应该用?压缩公钥?的哈希值来创建。如果你用的是传统类型的地址或者非压缩公钥的哈希值,这个输出将变得不可用(你的币会锁死)。

Pay-to-Witness-Script-Hash

另一个关键的交易类型是 P2SH。它让交易可以发送给脚本的哈希值(而非公钥的哈希值,也即比特币地址)。要花费 P2SH 交易的输出,花费者需要提供一个脚本(叫做 “赎回脚本”),其哈希值应该与 UTXO 中的脚本哈希值匹配,并基于这个脚本提供 签名/口令/别的东西。这个用法可以把解锁脚本保护起来,让发送者无从知晓一个地址的内容,并且也能节约空间:举个例子,一个多签名钱包的锁定脚本可能非常长,这样我们就必须把整个锁保存起来;有了 P2SH 可以只保存一个哈希值。

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

要花它的时候,花费的人(也是上一笔交易的接收方)需要提供一个赎回脚本,这个脚本定义了花费条件(多签名,2-5),还有两个签名。所有这些都要放在交易的输入中:再来看看使用隔离见证后的发送者和接收者。输出的锁定脚本如下:

Web3初创公司zbyte完成1000万美元私募融资:7月12日消息,Web3初创公司zbyte宣布完成1000万美元私募融资,具体融资信息暂未披露。该公司计划利用这笔融资构建基于低代码、无代码(low-code, no-code)接口的去中心化区块链平台,并推出Dapp应用商店。

此外,zbyte还将在今年第四季度推出公共Token ZBYT,加速推动开发人员社区和企业对区块链技术的采用。(Inc42)[2022/7/12 2:08:25]

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

使用这一输出的交易如下所示:

我们已经看到,使用隔离见证是有好处的。不过,上面的例子只对发送者和接收者都有升级软件的情形才适用。但现实并不总是如此。考虑这样一种情形:

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

这时候,Bob 可以创建一个包含了 SegWit 脚本的 P2SH 地址、Alice 会把这个地址当成一个普通的 P2SH 地址,因此可以直接向这个地址转账而没有任何问题。但 Bob 可以使用 SegWit 交易来使用这个输出,并获得手续费折扣(下文我们会解释 SegWit 交易的手续费的新的定价方式)。

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

想在 P2SH 交易中实现一笔 P2WPKH 交易,Bob 需要使用其公钥创建一个见证程序。然后把结果哈希、转码成一个地址:

Terra创始人Do Kwon:即将尘埃落定,大家坚持住:5月11日消息,Terra创始人Do Kwon在社交媒体上宣布:即将尘埃落定,大家坚持住。

此前报道,据三位消息人士透露,Luna 基金会 LFG 正在向机构寻求筹集超过 10 亿美元来支持 UST。据 The Block 研究员 Larry 表示,目前了解到的融资细节是:LFG 寻求的这笔融资约 10 亿美元至 15 亿美元,目前 Jump Trading、Celsius,以及 Jane Street 已经同意了这笔融资,承诺金额约 7 亿美元,Alameda Research 尚未同意。机构的条件是以 50% 的价格折扣拿到 LUNA 现货,锁仓一年,一年后按月线性解锁。Larry 强调这笔融资尚未确认,一切都有可能发生变动。[2022/5/11 3:05:46]

第一个数值是版本号,而第二个数值是 20 字节的公钥哈希值。这个脚本先做 SHA256 哈希运算,再做 RIPEMD160 运算,就可得到一个 20 字节的哈希值。

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

转化成一个地址:

发送给这个地址的输出的锁定脚本,看起来也就跟一个普通的 P2SH 地址的脚本没啥区别:

那么 Bob 花费输出的时候,交易的结构会像这样:

在一开始,我们创建的赎回脚本(也就是那个见证程序)会经过一次哈希计算,如果结果符合锁定脚本中的哈希值,这个脚本就会得到执行,程序会验证放在 witness 字段的签名。

P2SH(P2WSH)

P2WSH 脚本也可以用 P2SH 来实现。我们考虑上面所说的 2-5 多签名钱包的例子。所有的步骤都跟 P2SH(P2WPKH) 没什么区别:

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

梳理清楚技术的部分之后,我们就可以理解隔离见证的主要优点了。

交易熔融性漏洞

SegWit 解决的一个关键问题就是比特币交易的 “熔融性”,也即比特币交易的 ID 是哈希值这一点所带来的问题。我们详细说一下。

在以往的比特币交易中,签名是放在交易的输入部分的,第三方可以更改签名且不会让交易失效。这使得第三方可以在完全不更改交易的 “关键” 字段(比如输入、输出、转账的数量)的前提下更改交易的 ID(也就是交易的哈希值)。这样一来,交易还是有效的,含义也还是一样的,但是有了另一个 ID,这可以用来执行另一种攻击,比如 DoS 攻击(拒绝服务式攻击)。

SegWit 解决了这个问题,因为所有的签名都是放在交易外面的,因此签名的变动不会导致交易的哈希值变动,也就不会影响交易的 ID。隔离见证还引入了一个专门的标识符,叫做 “wtxid”:它是交易和整个 witness 部分的哈希值,所以如果一笔交易在传播时没有附带任何 witness 数据,交易 ID(txid)就等于 wtxid。

这个解决方案使得我们可以创建一系列前后相继的未确认交易,而无需担心任何风险,这对闪电网络这样的协议来说是非常重要的。(译者注:这里的意思可能是,如果不解决交易熔融性问题,支付通道的参与者就无法快速检索对手有没有把一笔过时的通道交易上链,因为同样内容的交易可能会以完全不同的 ID 出现)。

网络和存储的扩展

Witness 数据往往是交易数据中占比最大的一部分。在使用多签名脚本的交易中,witness 最多可能占据交易数据量的 75%。感谢 SegWit,签名的传输变成了一个可选项:只有节点想要验证交易时,才需要请求这些数据。而没有支持 SegWit 的 SPV(简易支付验证)客户端和节点也无需下载额外的数据,可以节省硬盘空间。

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

SegWit 类型的交易比以往的交易类型更便宜,因为它减少了需要存储的 witness 数据。准确来说,“Size”(数据量大小)的概念在 SegWit 类型的交易上略有不同。它引入了一个 “虚拟大小(virtual size)” 的概念:所有放在 witness 部分的数据都会乘以 0.25 来计算数据量大小,从而一个区块中可以塞进更多的交易。来看一个例子。

假设我们有一笔传统类型的交易,数据量大小为 200 字节。那么 1MB 的区块里面可以放进 5000 笔这样的交易。而一笔等效的 SigWit 交易有 120 字节是放在 witness 区域的,因此其虚拟大小为 80 + 0.25 * 120 = 110 字节,所以区块可以放入 9090 笔这样的交易。如果上链的手续费是每字节 40 聪,则交易费会从 8000 聪减低到 4400 聪,几乎打了个对折。(译者注:“聪” 为比特币的数量单位,是 btc 的亿分之一。)

脚本版本

你可能已经注意到了,每个锁定脚本都会有 1 个字节来表示脚本的版本。使用不同的版本号就能以软分叉的形式增加或变更功能(语法改变、新的操作符,等等)。

签名验证的效率优化

隔离见证也优化了签名算法的效率(如 CHECKSIG、CHECKMULTISIG,等等)。在 SegWit 之前,哈希计算的次数与签名数量的平方成正比,但有了隔离见证后,算法的计算复杂度就减低到了 O(n) (与签名的数量成正比)。

如果百利而无一害,怎么还有人会觉得有问题呢?比特币社区有许多人反对这一升级,因为,即使它有这么多长处,它也有一些缺点。我们来看看反对方提出的一些意见。

因为 SegWit 是一个软分叉,许多客户端可能不会升级,因此两种类型的 UTXO 会在网络中同时存在;诸如消除交易 ID 熔融性以及哈希计算次数线性上升这样的重大变更对非 SegWit 输出无效,因此网络仍会暴露在交易 ID 熔融性和哈希时间平方级上升的风险中。

SegWit 会降低网络的安全性,执行完全验证的节点会大幅减少,因为只有那些适配了 SegWit 的节点才有能力验证交易的 witness 部分。

SegWit 不能被废除。如果废除了它,所有变更都撤销,那么所有的 SegWit 输出就会变成大街上任人捡拾的钱。

SegWit 希望一次解决所有问题,也正因此,它导致了大量的代码改动。它会让未来的工作更加负载,而且提高了出现驱之不去的软件 bug 的机会。

虽然由 SW 解决的问题很有可能有更优雅的解决方案,我们仍然相信,在当前,这是提高网络的可扩展性并开启闪电网络等技术实现的最佳办法。更详细的分析我们放在下一篇文章。

参考文献

Lightning network in depth, part 1: payment channels

“Mastering bitcoin” — Andreas M. Antonopoulos

Bitcoin Core blog

Many segwit resources

Good article about txn malleability

原文链接:

https://medium.com/softblocks/segregated-witness-for-dummies-d00606e8de63

作者:?Magomed Aliev

翻译:?阿剑

标签:WITSEG比特币ESSProject WITHSEG币买比特币的人是不是都发财了CryptoXpress

狗狗币价格热门资讯
波卡的跨链是如何实现的?

“波卡知识图谱”是我们针对波卡从零到一的入门级文章,我们尝试从波卡最基础的部分讲起,为大家提供全方位了解波卡的内容,当然这是一项巨大的工程,也充满了挑战,然而我们希望通过这样的努力让大家能够正确认知波卡.

1900/1/1 0:00:00
OpenSea以12亿美元月成交量引领以太坊NFT复兴

本文来自 Decrypt,原文作者:Andrew HaywardNFT 加密收藏品市场 OpenSea最近交易活动和成交量激增。在过去的一个月里,它已经处理价值超过 12 亿美元的交易.

1900/1/1 0:00:00
那些爆火的 NFT 头像为何会成为一种新型文化范式?

人们通过共享共识赋予 NFT 价值。原文标题:《从 Punks、 Apes 到 Penguins:头像型 NFT 如何成为新文化范式 | 链捕手》近期,以 CryptoPunks 为代表的头像类 NFT 项目尤其火爆,平均成交价格甚至.

1900/1/1 0:00:00
金色前哨 | Coinbase CEO Brian Armstrong:再购买超5亿美元的加密货币

8月20日消息,Coinbase联合创始人兼首席执行官Brian Armstrong发推称,我们最近获得了董事会的批准,在我们的资产负债表上购买超过5亿美元的加密货币,以增加我们现有的持有量.

1900/1/1 0:00:00
BHEX Chain BBS跨链桥上线 打造DeFi世界的交通系统

原始社会没有交通工具,人类活动被限制在一定区域。随着人类文明的进步,交通工具逐渐演化,由最初的轮子,到独轮手推车,再到四轮马车、船舶、火车,汽车、飞机,纵观人类发展,交通运输推动着人类文明进程.

1900/1/1 0:00:00
黄金和比特币:是敌是友?

市场上总是有人把比特币看作是一种“新黄金”或“数字黄金”。首先先来了解一下,为什么大家总喜欢把比特币和黄金放在一起做比较。简单说,两者之间有很多相似性.

1900/1/1 0:00:00