原文:http://8btc.com/forum.php?mod=viewthread&tid=23878&page=1#pid270878php
1. 什么是延展性(Malleability,可鍛性):“延展性”指的是“在材质自己无损的前提下,能够经过外力改变为特定形状”的性质。
<ignore_js_op>网络
显而易见,黄金是具备延展性的。因为真实性比较容易验证,于是不管形状如何改变,只要验证了含金量相同,那么能够认为其价值相同。
比特币的交易(TXID)也具备延展性:比特币系统经过数字签名来认证全部者的权益,从而模拟了黄金的某些特性(几乎没法伪造)。只要保护好私钥,签名了交易后,其余人没法伪造或篡改交易的实质内容(好比,收款地址和收款金额)。可是,交易的标识(TXID)——含有数字签名脚本的交易的哈希值——有方法能够改变。
严格来讲,并非比特币的交易具备延展性,而是模拟黄金属性的”数字签名“具备延展性——能够改变”数字签名“的外观,而不影响数字签名的效力。这是如何实现的呢?
”数字签名“实质上是一个比较复杂数学计算——有限域下的加法和数乘运算。输入和输出实际上都是一些很是大的整数。在数学计算中,整数最高位前面的”0“是能够忽略的,好比 “100” 和 “0100”等价,然而这两种表示形式的哈希值不同。另外,有限域下涉及到模运算,不如模为7的有限域下,4和11是等价的,但显然这两个数的哈希值也不一样。
也就是说,具备在数学运算上等价的数字签名,能够存在多种输出格式,这就使得“数字签名”具备了延展性。
因为生成比特币的交易标识(TXID)的哈希运算中包含了数字签名脚本,因此比特币的交易也一样就具备了延展性。
2. 交易延展性攻击:
交易延展性攻击的对象通常是交易所(有人工客服)。由于延展性攻击没法篡改交易的实质内容,只要交易广播出去了,由于签名有效,最终仍是会被确认的,于是黑客没法直接靠交易延展性攻击来获利。可是经过策划,能够有这样一种方式:
先了解某一交易所外联的节点主要有那些,DDOS瘫痪掉它们并伪造出一些节点和交易所的节点进行通信。同时向交易所发起提币请求。当本身的节点侦测到交易所转给本身的交易(此时拿到了交易所的数字签名了)时,先扣留这些交易不对外广播,或是利用交易可锻性修改TXID,而后向人工客服投诉,声称款项未到账。若是交易所在技术实现上存在漏洞,仅根据TXID来检索对应交易,此时可能会误觉得发送失败,可能经过人工方式又重发一遍(极可能使用了其余UTXO)。黑客在受到第二份交易数据后,把两笔交易向全网广播,这样就收到两份钱。
3. 防范:
一是当使用TXID查找不到对应的交易时,须要用TXIN_OUTPOINT再查一下;
二是若是确实须要重发,引用的UTXO必定要与原来保持一致,把这种麻烦事儿交给比特币网络来处,系统规则确保了最终只会确认其中的一个(不会出现双花)。对象