如何解决“双花攻击”:比特币的SPV机制

作者: 贝壳儿说 | 来源:发表于2018-03-09 00:02 被阅读604次


    防御

    1.什么是“双花攻击”?

    提到比特币等数字加密货币,很容易联想到交易安全问题。首先想到的就是“双花问题”和“拜占庭将军问题”。那么,什么是“双花问题”和“拜占庭将军问题”呢?

    “拜占庭将军问题”以及比特币如何完美解决该问题,本专栏其他文章(如何解决“拜占庭将军”问题:比特币的POW共识机制)中会做详细介绍,敬请期待(预计2018年3月15日20:00发布)~

    “双花攻击”(double spend attack)又叫“双重消费攻击”。

    通俗的理解,就是一笔资金,通过某种方式(有可能是欺骗的手段或者支付系统bug问题)被花费了两次,取得了超过该笔资金的服务。

    下面举一个极端的例子:

    个体户TT银行有存款100万,向商户A购买了一匹钢材,价值100万;商户A支持通过支票支付的方式。

    那么商户A是如何确认这张支票不是“空头”的呢?

    他会向对应的银行(中心化的有认证资质的机构)去查询这张支票的拥有者是否账户上有足够100万的余额可供提取。商户A查询的即时结果是:足额。所以商户A就(基于某种信任)向个体户TT发货。

    然后,个体户TT 又到了商户B去购买了价值100万的实木家具,同样是采用支票支付方式。过程同上。

    上述过程中,个体户TT通过欺诈的手段(借助于可信任的中心化认证机构),将银行中的100万资产消费了两次,获取到了两次的收益,这就是“双花攻击”。

    说到“双花攻击”,大部分都发生在“数字货币”领域,因为数字货币,因为数据安全性的问题,很容易被“伪造”“复制”“篡改”。

    而物理货币(特指可见的物理货币:比如纸币,硬币,黄金等)就极少存在“双花攻击”问题。因为,物理货币很难被复制篡改,因为交易的参与者会很容易而且很快的验证交易中的物理货币的真伪。

    像比特币,莱特币,EOS币等虚拟数字加密货币,由于其“去中心化”的属性,导致没有一个中心化的机构能够对虚拟货币进行认证“该货币只被消费一次”,所以比特币等都是把如何解决“双花攻击”问题放在最高优先级。

    ---转译自investopedia(投资百科) 《Double-Spending》

    比特币等虚拟加密货币确确实实完美解决了“双花攻击”问题,虽然无需任何中心化的机构背书,那么,究竟是如何解决该问题的呢?


    2.比特币的SPV机制

    可以简单的理解为,比特币采用的是一种基于交易日志记录跟踪的机制,来验证每一笔交易的真实性,以此来避免“双花攻击”;

    比特币系统要求所有的交易毫无例外的都要被记录在一个公开的,可分享的,去中心化的“账本”上(这个“账本”,其实指的就是区块链)。

    我们在什么是UTXO?浅谈比特币“账户”模型一文中,初步介绍了下,比特币交易底层原理。

    我们知道,每一个区块中的每一笔交易都是“链条”式的前后相连(通过唯一的交易ID和hash值)。

    也就是说,原则上最安全最可靠的验证方式是:验证当前笔交易所位于的“链”上的所有交易详情(包括交易的鉴权,交易的净UTXO,交易的可消费证明等等),类似于所有相关联的交易日志追踪,就可以保证交易的可靠安全性,杜绝重复消费问题。

    但是,如果这么做的话,成本有多高呢?

    1)容量限制

    需要同步所有的区块信息(包含区块大小数据,区块头数据,交易大小数据,区块体数据等),虽然每一个区块大小被严格限制在1MB内,但所有区块的总需要同步大小上百G。在比特币网络中,不是每个节点都有能力储存完整的区块链数据。大多数是普通用户(俗称“韭菜”,即只有基本的比特币投资及消费支付需要的用户),他们可能没有矿机,甚至连高端配置的电脑都没有,那么他们是否也要运行一个全节点程序呢?。

    PS :在升级到Bitcoin Core 0.13版本之后,增加隔离见证技术(Segregated Witness),每个区块大小理论上被“软扩容”到4MB。

    2)网络压力

    毋庸置疑,超大数据量的同步,对比特币网络的拥堵会造成很大的压力。

    3)比特币节点的CPU压力

    所以,中本聪是怎么解决这个问题呢?

    SPV(Simplified payment verification)机制

    SPV:简单支付认证

    先一句话介绍下,比特币区块的打包机制:比特币的每一个区块在打包的时候,会将该区块包含的所有交易(一般是2000笔以内)进行简单的支付认证,认证的方式就是,通过某种机制来验证,每一笔交易都曾经出现在主“链”上,也就意味着曾经被验证过。

    那采用什么方式去验证呢?

    基于各种顾虑,比如上文说的上百G容量限制。Satoshi(中本聪)在论文中提出了:“节点无需下载所有的区块数据,而只需要加载所有区块头数据(block header的大小为80B),即可验证这笔交易是否曾经被比特币网络认证过。”

    ---摘自BitcoinWiki《Scalability#Simplified payment verification》

    用户虽然不能自己验证交易(因为没有完全的交易信息详情),但如果能够从区块链的某处找到相符的交易(区块头中包含的Merkle Tree 的hash值,就可以链式最终定位到该笔交易是否曾经出现过),他就可以知道网络已经认可了这笔交易,而且得到了网络的多个确认。

    截止2018年3月8号上午10点10分,最新区块高度为:512563。也就是说,就算一个普通节点进行SPV认证需要下载所有的区块头数据,那么总容量也只有40MB。(连诺基亚板砖都能运行了吧?)

    PS :关于比特币“区块”数据结构详细解析,将在本专栏比特币的“区块”中到底藏着什么?Block Structure解析?文章中详细介绍,敬请期待(预计2018年3月13日20:00发布)。

    PS: 在比特币区块浏览器:https://blockchain.info/zh-cn/可查询所有区块播报详情。

    高度512563的比特币最新区块播报详情信息

    3.SPV认证,需要下载所有的区块头信息吗?

    ---完美的“布隆过滤器”!

    什么是“布隆过滤器”?

    可以把“布隆过滤器”理解为:水管与水管连接处的“滤网”,符合“滤网”过滤规则(滤网眼的大小)的水流才会通过。

    类比"布隆过滤器"的滤网

    上文算过,就算全部区块的header信息均被下载,也才40MB,但是真的有必要吗?

    这里面设计到了中本聪在比特币系统中增加的一个功能:布隆过滤器(Bloom Filter);节点会在通信链路上建立一个布隆过滤器,过滤掉那些不包含有目标地址的交易信息,这一步能避免掉大量不相关的数据下载。

    基于SPV机制和布隆过滤器功能,市面上出现了很多“轻钱包”,使得“轻钱包”在手机上就能运行,比如:ImToken,火币钱包等等。


    以上内容,如有不当之处,欢迎Diss指正~

    【简亿区块链时间】本期到此结束!

     另附预告:

    1)预计发布日期:2018年3月15日 20:00

    如何解决“拜占庭将军”问题:比特币的POW共识机制

    2)预计发布日期:2018年3月13日 20:00

    比特币的“区块”中到底藏着什么?Block Structure解析


    欢迎关注微信公众号:【简亿区块链】,新鲜出炉的文章会同时发布!

    微信公众号二维码

    相关文章

      网友评论

      本文标题:如何解决“双花攻击”:比特币的SPV机制

      本文链接:https://www.haomeiwen.com/subject/bpghfftx.html