原文:http://8btc.com/forum.php?mod=viewthread&tid=23878&page=1#pid270878

1. 什么是延展性(Malleability,可鍛性):“延展性”指的是“在材质本身无损的前提下,可以通过外力改变为特定形状”的性质。
<ignore_js_op>

显而易见,黄金是具有延展性的。由于真实性比较容易验证,因而无论形状如何改变,只要验证了含金量相同,那么可以认为其价值相同。

比特币的交易(TXID)也具有延展性:比特币系统通过数字签名来认证所有者的权益,从而模拟了黄金的某些特性(几乎无法伪造)。只要保护好私钥,签名了交易后,其他人无法伪造或篡改交易的实质内容(比如,收款地址和收款金额)。但是,交易的标识(TXID)——含有数字签名脚本的交易的哈希值——有方法可以改变。

严格来说,并不是比特币的交易具有延展性,而是模拟黄金属性的”数字签名“具有延展性——可以改变”数字签名“的外观,而不影响数字签名的效力。这是如何实现的呢?

”数字签名“实质上是一个比较复杂数学计算——有限域下的加法和数乘运算。输入和输出实际上都是一些非常大的整数。在数学计算中,整数最高位前面的”0“是可以忽略的,比如 “100” 和 “0100”等价,然而这两种表示形式的哈希值不一样。另外,有限域下涉及到模运算,不如模为7的有限域下,4和11是等价的,但显然这两个数的哈希值也不同。
也就是说,具有在数学运算上等价的数字签名,可以存在多种输出格式,这就使得“数字签名”具有了延展性。

由于生成比特币的交易标识(TXID)的哈希运算中包含了数字签名脚本,所以比特币的交易也同样就具有了延展性。

2. 交易延展性攻击:
交易延展性攻击的对象一般是交易所(有人工客服)。因为延展性攻击无法篡改交易的实质内容,只要交易广播出去了,因为签名有效,最终还是会被确认的,因而黑客无法直接靠交易延展性攻击来获利。但是通过策划,可以有这样一种方式:
先了解某一交易所外联的节点主要有那些,DDOS瘫痪掉它们并伪造出一些节点和交易所的节点进行通讯。同时向交易所发起提币请求。当自己的节点侦测到交易所转给自己的交易(此时拿到了交易所的数字签名了)时,先扣留这些交易不对外广播,或是利用交易可锻性修改TXID,然后向人工客服投诉,声称款项未到帐。如果交易所在技术实现上存在漏洞,仅根据TXID来检索对应交易,此时可能会误以为发送失败,可能通过人工方式又重发一遍(很可能使用了其他UTXO)。黑客在受到第二份交易数据后,把两笔交易向全网广播,这样就收到两份钱。

3. 防范:
一是当使用TXID查找不到对应的交易时,需要用TXIN_OUTPOINT再查一下;
二是如果确实需要重发,引用的UTXO一定要与原来保持一致,把这种麻烦事儿交给比特币网络来处,系统规则确保了最终只会确认其中的一个(不会出现双花)。

什么是延展性(Malleability,可鍛性)的更多相关文章

  1. .Net微服务实战之DevOps篇

    技术只是基础 该系列的两篇文章<.Net微服务实战之技术选型篇>和<.Net微服务实战之技术架构分层篇>都是以技术角度出发描述微服务架构的实施. 如果技术选型篇叙述的是工具,那 ...

  2. Ctrip Mydream

    --我不知道以后如何,我不知道我做的事情能否持续,我只是希望有一天我真的在这条路上走下去了,我只希望去一次这里检验一下自己,我希望自己努力争取这个机会. .Net技术专家 岗位职责: 1.主导本领域的 ...

  3. .NET高端职位招聘要求

    系统架构师: 1.硕士及以上学历,博士有项目成果者优先: 2.五年以上工作经验,三年以上互联网经验,一年以上大型软件项目总体设计.分析.架构经验,有移动互联网或云计算虚拟化系统设计开发经验者优先: 3 ...

  4. mootools vs jquery

    大部分最近才剛接觸JavaScript的人會面臨到的困難是該選擇哪個套件(library)或是該先學哪個套件.如果你在一間公司裡上班,那麼可能公司已經有一套固定使用的套件,若是在這種情況下,問題就沒那 ...

  5. 代码的坏味道(17)——夸夸其谈未来性(Speculative Generality)

    坏味道--夸夸其谈未来性(Speculative Generality) 特征 存在未被使用的类.函数.字段或参数. 问题原因 有时,代码仅仅为了支持未来的特性而产生,然而却一直未实现.结果,代码变得 ...

  6. 2000条你应知的WPF小姿势 基础篇<78-81 Dialog/Location/WPF设备无关性>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  7. 浅谈 linux 例行性工作 crontab (linux定时任务)

    定时任务大家都挺说过,就好比你手机上的闹钟,到了指定的时候就会响起. 今天在对redis缓存进行定时储存时又操作了一把,发现一些细节,写的不好.大家就将就看吧, 首先 简单介绍一下linux 例行性工 ...

  8. 分享一实战性开源MVC框架<Linux、Windows跨平台开发so easy>

    一.引子   开源地址 https://github.com/564064202/Moon.Mvc 欢迎加入开发 .NET Core微软还在发力,但作为商用还有一段距离,很多开发库尚不能用于.NET ...

  9. 关系数据库SQL之可编程性触发器

    前言 前面关系数据库SQL之可编程性函数(用户自定义函数)一文提到关系型数据库提供了可编程性的函数.存储过程.事务.触发器及游标,前文已介绍了函数.存储过程.事务,本文来介绍一下触发器的使用.(还是以 ...

随机推荐

  1. windows下hla编译环境配置(转)

    原文地址:http://blog.chinaunix.net/uid-20548989-id-1667169.html HLA简介         HLA,英文"High Level Ass ...

  2. Monkey基本使用(转载)

    什么是 Monkey Monkey 是一个 Android 自动化测试小工具.主要用于Android 的压力测试, 主要目的就是为了测试app 是否会Crash. Monkey 特点 顾名思义,Mon ...

  3. Python+Selenium(webdriver常用API)

    总结了Python+selenium常用的一些方法函数,以后有新增再随时更新: 加载浏览器驱动: webdriver.Firefox() 打开页面:get() 关闭浏览器:quit() 最大化窗口:  ...

  4. 取消文件与svn服务器的关联

    在使用svn项目管理工具的时候,经常遇到这样的情况: 我从svn下载下来了一个版本,后面不在需要和svn进行同步版本管理,但是文件夹的上面总是有一个勾,显示同步状态,强迫症真的受不了. 效果见小图: ...

  5. HtmlUnit 开发网络爬虫

    网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源HtmlUnit包,几行代码就OK啦! 通常在一个页面中会包含别的Url,在别的Url当中又会包含更多的Url. ...

  6. Tcp参数优化

    net.core.netdev_max_backlog = 400000 #该参数决定了,网络设备接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目. net.core.opt ...

  7. django中多个字段的模糊查询

    django中多个字段的模糊查询 使用Entity.objects.filter(name_contains='kris').filter(address='beijing') 这个方法是指名字包含k ...

  8. uwsgi错误invalid request block size

    uwsgi错误invalid request block size 今天使用uwsgi启动django代码,然后打开浏览器输入http://localhost:8000/admin.后台出现下面错误 ...

  9. Java中break、continue及标签等跳转语句的使用[上]

    java 中跳转语句使用break.continue和标签,各自或组合完成相应的功能. 今天做题时遇到关于标签命名规范,顺便将跳转语句语法都看了一遍,很有收获. 在<Java编程思想>一书 ...

  10. [PY3]——内置数据结构(4)——字符串格式化(format)

    字符串格式化是拼接字符串的一种手段 join和+拼接字符串的方法,难以控制格式 printf style 字符串格式化 这种方法是从c语言继承过来的 # 待格式化的字符串:一个字符串存在占位符 In ...