Segregated Witness(隔离见证)是一项旨在解决比特币区块链交易延展性(Transaction Malleability)问题的提案(BIP-141)。


1. 什么是交易延展性(Transaction Malleability)?

即交易内容没有变,但是交易id变了。在btc网络中使用的ECDSA签名算法,由于椭圆曲线的对称性,对某个交易进行签名,总是可以计算出两个有效的签名,并且这两个有效的签名还可以互相计算出来。在广播了一笔交易之后,再用不同的签名发布一笔相同内容的交易,这两笔交易内容一样,但交易id不同,会在网络中误导网络中的参与者。


2. 交易延展更改了签名,但交易内容没变,最后网络还是会确认这笔交易内容,第二笔签名不一样但交易内容相同也会被作废,对交易安全并没有影响,网络中实际也并也不会有双花问题(同一份钱被花了两次),那交易延展实际会对什么会有影响?

其实主要因为很多比特币服务(如交易所、第三方链上自动化服务)依赖交易id用作交易的标识。一个例子就是,小A从交易所发起提币,然后他提币这个交易就被广播出去了,在他这笔交易还没有被节点验证之前,小A进行了延展性攻击,恰好攻击产生的新交易先被确认,而新交易会让他获得币,老交易会被网络拒绝。小A却向交易所申诉自己并没有收到币,交易所看到之前给小A转币的那笔交易确实被拒绝了,因此又给他汇了一笔币。


3. 听起来问题其实是因为交易id被用作交易的标识才导致的问题,那不用交易id作为交易标识可行么?

分析下btc区块中的内容,比如使用块高度+交易位置确定标识?或者自己根据交易输入+输出散列确定标识?这些确实也可以作为可以唯一标识符,但要么在实践中效率低下,要么不如交易id来得方便和安全(交易id会直接记录在区块内容中,上链之后永远不可变)。


4. segwit怎么解决交易延展性这个问题?

segwit通过将交易签名数据(见证)从区块中分离出来,更改签名不会再影响交易id,有效地解决了这个问题。同时segwit也一定程度减少区块大小,提高交易处理能力(如spv可以在相同的带宽下处理更多的交易内容)。

segwit


5. 那在segwit之前是怎么解决这种问题?

交易失败后,需要根据区块链上的交易失败报错信息,并查看检查网络中是否在短时间内已经发起了这样的交易来分辨是否遭受了交易延展攻击。同时也应尽量避免在未确认的交易或少数区块确认的交易上做逻辑但这些方式并没有从根本上解决问题。

#BTC☀ #SegWit #技术学习