定义
隔离验证,又称隔离见证(segregated witness)是由Bitcoin Core(比特币核心软件)维护者之一Pieter Wuille提出的比特币扩展性方案,简单来讲,这种方案就是通过改变比特币交易结构的方式,将交易中签名的部分单独拿出来,放到另一个叫 witness 的结构当中。
比特币交易数据结构是:
TxIn+交易签名+TxOut
交易ID计算公式:TxId=hash(TxIn+交易签名+TxOut)
现在的问题是,签名为什么要在这里,在这里有什么好处?
答案是:中本聪是这么设计的,所以签名在这里。好处嘛,没什么好处,不止是没有好处,缺点却还不少。
1、由于这种设计,比特币的交易结构中就凭空的隐藏了不少“秘籍”,比如说:未签名交易其实就是用了另一个叫 ScriptPubKey 的内容,先占据着签名所需的位置,然后对这个未签名的交易做签名,再把签名的结果替换进去。这其实是很麻烦的一件事,既不容易说清楚,也很难用代码去实现。当一个交易中有多个输入(TxIn)的时候,又要有一套“秘籍”来依次准备未签名交易,依次把签名替换回去;而当一个交易中又涉及到多重签名的交易时,则有需要另一套约定好的规则来准备未签名交易,再进行签名后的数据替换工作;如果一个交易既涉及多个输入,又涉及多重签名呢?那就是秘籍套秘籍,反正是麻烦的要死;有兴趣且有能力的童鞋们不妨去翻翻比特币协议在各种语言中的实现部分,就会发现,无论是 C++、Java、Python 等语言所编写的比特币协议库,通常都需要写非常多的、混乱不堪的代码来做上述的交易数据构造工作,很头疼,写过的都懂。
2、将签名放在交易结构中,由于签名的可塑性,使得交易也就有了可塑性,比如说,很早以前我就给大家讲过的因为椭圆曲线的对称性,s和s’都是能被验证通过的签名,这种情况下,任何接收到你所广播的交易的节点,都有能力用s’来替换掉s,然后重新广播,重新广播的交易其实有着相同的内容(输入 TxIn 和输出 TxOut),但却有着不同的 tx_id (tx_hash),这样就能达到混淆视听的目的,甚至影响到一些比特币企业(如交易所)的服务。交易延展性不会直接导致您丢币,但会影响到个人和企业对于比特币交易状态的判断,进而可能导致可能出现的资产管理风险。之前,bitcoin-core 在 BIP62 中进行过一些试图努力解决交易延展性问题的尝试,但从某种意义上来讲,交易延展性其实是无法彻底根治的,至少私钥拥有者可以重新生成一个签名,交易不变但签名变了,最终的 tx_id 也就变了,这种情形应用于多重签名的场合,甚至可能会影响到其它钥匙的持有人对于交易的判断,导致一些潜在的资产风险,在当前的交易结构下,我们是无法彻底杜绝这种情况的发生的;
3、当我们需要对交易进行签名时,对每个 TxIn 进行签署的 hash 都是不同的(参见上述的“秘籍”),所以对于“冷钱包”这种离线签名的实现方式其实增加了很大的难度,无论是数据结构还是代码的层面;
也就是说,将签名放在交易内容中其实没有任何好处,反而增加的结构的复杂度和交易延展性的风险,这显然是得不偿失的。
那么,最合理的交易结构到底应该是什么样子的呢?其实很简单:
TxIns + TxOuts [签名]
隔离验证前后比特币交易结构对比
image.png
隔离验证其实就是把原来的比特币交易中签名的部分单独拿出来放到另一个叫 witness 的结构中,实现交易ID仅仅与交易内容有关,解决了同一交易,会有不同ID问题,隔离验证实施后,交易ID算法变为 TxId=hash(TxIn+TxOut) 。
签名就是要用来进行“验证”的数据,放在另一个地方就是要“隔离”出来,所以给这件事情起名为“隔离验证”也就再合理不过的了。
隔离验证的好处
交易是交易,签名是签名,对于交易来说,只关心 TxIn 和 TxOut 就好了,我们都清楚一个比特币交易其实就是花一笔之前收到的钱,也就是说要用之前收到的 TxOut 作为这一笔交易的 TxIn 然后发给后续的 TxOut,隔离之后的交易结构使得当您决定好花哪一笔钱、要花给谁的时候,交易的内容就已经是确定了的,交易的数据就不会再发生改变了,最终的 tx_id 也就是不变的了。想要验证签名?那就去 witness 里找到对应的签名数据验证一下合法性即可,又简单、有没有交易延展性的问题。
总结
隔离验证其实是对之前不太合理的比特币交易结构的一次优化,开发者们试图用一种影响尽可能小的、尽可能向下兼容的、“软分叉”的方式来实现,这种改进本身(就像是“压缩格式的公钥”一样)是非常合理的,与块大小之争没什么直接的关系。
参考资料:
请关注我的微博:瑞波支付
加入我的QQ群:56937187
我的数字货币小密圈邀请链接,http://t.xiaomiquan.com/N7UNvRV
或者微信扫描小密圈二维码加入
网友评论