酸饼博客
关注区块链技术应用与数字货币

区块链入门100问(19):如何理解比特币的隔离见证(segwit)?

比特币系统中,每一笔比特币交易产生一个或多个交易输出。

每一个交易输出由两部分组成:
1. 一定数量的比特币,单位是“聪”
2. 锁定脚本。将来要使用这部分比特币,需要满足脚本的判断条件。

将来使用这个交易输出进行支付的时候,需要用解锁脚本进行解锁。解锁脚本和在前一个交易里的交易输出的锁定脚本,两者拼接在一起执行,结果为真时,表明这笔交易的执行者拥有所支付的资金的所有权。解锁脚本,用密码学术语来表示,即是“见证”。

在密码学中,术语“见证”(witness)被用于形容一个加密难题的解决方案。在比特币中,“见证”满足了一种被放置在一个未使用的交易输出(unspent transaction output, UTXO)上的加密条件。

在比特币语境中,“见证”是一个广泛的任意解决方案,能够满足加诸于一个UTXO的条件,使UTXO解锁后可被花费。

在引入“隔离见证”之前,每一个交易输入后面都跟着用来对其解锁的见证数据,见证数据作为输入的一部分被内嵌其中。

通过之前对比特币交易的数据结构,我们知道比特币交易的“见证”,即解锁脚本,是交易输出的一部分。解锁脚本的同一个执行结果,可以由多种实现。篡改解锁脚本,依然能够通过交易合法性校验;但解锁脚本也是交易整体的一部分,解锁脚本的改变,会导致txid也跟着改变。这就是比特币交易的延展性。利用这个特性,可以发动“延展性攻击”。

为了修复交易延展性的漏洞,提高安全性,比特币核心开发者提出了“隔离见证”的方案,将见证从交易移出,用作标识符的交易哈希不再包含见证数据。

这样的好处有:
1. 移除了交易延展性攻击的机会。通过隔离见证,交易变得对任何人(创建者本人除外)都不可变。
2. 引入脚本版本管理,每一个锁定脚本前也都有了一个脚本版本号,允许脚本语言用一种向后兼容的方式(也就是软分叉升级)升级,以引入新的脚本操作数、语法或语义。
3. 起到扩容的作用。一些关于见证隔离的文章,说到隔离见证能让区块大小不变的前提下,起到扩容的作用。实际上这个表述是不正确的。隔离见证把见证的内容从交易移除,交易的数据变小,一个区块包含的交易确实是增加了。但交易的见证内容放在区块的后面,整个区块的大小并没有变小,而是由于交易数量的增加而变大了。只是在校验区块大小的时候,只是计算区块里全部交易的数据大小,并没有把见证部分计算进来。
4.

并不是所有人都支持隔离见证。在比特币社区,有相当于一部分力量认为见证隔离把见证从交易移除,降低了比特币交易的安全性,存在着未可预知的安全漏洞;另外,见证隔离实际上也增加了区块的容量,区块的增大也会带来其他的问题。

如果对隔离见证规则的支持不足,则可能会引发争议导致分叉。其中网络一部分节点会进行更新并切换到新客户端,但仍有部分节点决定继续使用旧版本。这就导致同时存在使用不同规则,而且彼此竞相争取用户的两种加密货币。

这种情况可能会导致难以预料的结果,为了避免这种争议性质的分叉,SegWit的开发人员在软件中设置了一个特定规则,只有在获得网络(95%)全体一致地支持下才会激活SegWit。

目前隔离见证以“软分叉”的方式存在,即采用向后兼容的模式,老的“非隔离见证”系统仍然能够验证隔离见证的输出;新的软件也能验证老软件的非见证隔离的输出。

未经允许不得转载:酸饼 » 区块链入门100问(19):如何理解比特币的隔离见证(segwit)?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

留言联系关于酸饼