如何破解比特币双重支付?
在本文中,我将通过几个真实案例来进行讨论,并且阐述了几种方案。我也说过,这个比特币项目计划正在实施当中。
本文主要对比特币钱包开发商和付款系统进行研究。
首先,双重支付有多严重?
现实生活中存在的双重支付
有几种方法可以做到比特币的双重支付。一种是让矿工来帮实现,另一种就是成为一个矿工。2013年11月在 GHash.io 矿池就发现博彩网站BetCoin存在双重支付诈骗,网站使用的每一次交易都不需要等待确认就可以进行。
GHash.io 称:他们通过调查发现:那个在公司通过做双重支付来诈骗的员工已经被解雇了,但是却没有确切的证据证明解雇的那个人是诈骗犯,这件事也就成为了云里雾里。无论如何,这件事没有对市场造成很大的冲击,大部分的矿工几乎都没有听说过这件事。
该 Eligius矿池实现了一个在正常交易上面做的臭名朝著的交易确认。这个臭名昭著的交易被矿池所有者 (Luke Dashjr) 称为“非交易垃圾数据”(non-transactional data spam)。这个地址可以在这里找到。这笔交易直接被忽略掉了,就像这笔交易没有被广播出去:这意味着一个人通过制造一笔交易,然后被分成两个地址。就使得,内存池在 Eligius矿池和其他人之间变得不一致,这样一个双重支付就在Eligius里进行了,如果谁发现了这一个区块,那么这个区块上原来的交易将被取消。
该漏洞已经被用来从事一种准交易服务的双重支付。经过对这个臭名昭著的交易进行检查,一个诈骗者试图几次攻击之后就放弃了。
Eligius矿池运营商不希望看到犯罪分子犯下这样的罪行。事实上,他们对交易方式增加了一些补丁。Luke Dashjr告诉我说,他会解决这个代码的问题,但是他自己解决不了,这不像大多数矿池那样。Eligius和Luke是去中心化的,在(GBT)挖矿协议上工作,它可以让矿池变得更稳定。因此,除非 Eligius的矿工决定集体工作,这样才可能会让矿池变得不稳。
以上这两种是我最为熟悉的。不过在有关方面的要求之下,第二个省略了细节。可能有关双重支付没有进行过公开讨论,但是在2015年三月末没有过这样的讨论。我检查支付处理器和双重支付系统:他们告诉我这不是他们的问题。
有很多的双重支付发生在比特币网络上。
让我们假设双重支付变得很糟糕, 并且提出一系列关于双重支付问题的解决办法。
分析交易风险 支付渠道 由受信任的第三方签名 远程认证 ID验证 等待确认 处罚双重支付的区块协议的风险分析
值得一提的是,Eligius 采用的是双重支付的第二种情况,是基于一个协议的漏洞:
Eligius用的不是相同代码的内存池,不过它的使用规则是公开度,并且很容易进行检查。
这里有两个错误:
交易A链是在底部进行的自由交易。这保证了Eligius有足够多的时间找到新的区块。 给这个臭名昭著的骰子地址进行交易。这两个的代码都很简单,这就是为什么是商家能够如此迅速的作出检查的原因。
矿工所在大多数内存池的差异是由于版本的差别所致。比特币核心开发者公布了新版后,总有一些矿工能够快速的进行升级,同时也有升级慢的。但是区别基本上都是不容易观察到的细节问题。正在进行更新的钱包可以检测到那些被改变了的交易,并且将其标记为待确认。
鉴于,今天要做一个双重支付的报告,我认为个协议风险分析会涉及很多
双重支付交易的广播
了解双重支付最好的方法就是自己尝试,如果你感觉他的速度不够快,你可以在交易完成之前的任何时候终止交易。
这就是为什么加文•安德森( Gavin Andresen)和汤姆•哈丁(Tom Harding)已经自己实现了。
无论是比特币核心钱包,还是下一个BitcoinJ 软件的钱包,都可以对未确认的交易进行通知。当一个交易没有被确认而通过双重支付交易得到了确认,这个时候BitcoinJ软件便会通知你。
比特币的核心系统没有双重支付交易的广播,因为关于打破双重支付那些无休止的争论是毫无意义的,但是我将它收录到我的Bitcoin XT补丁之中,以便帮助其他人使用XT。
Bitcoin XT是一个新软件,我没有做过任何形式的推广。不过它的代码适用于Windows,Mac和Linux。系统之间可以共享数据目录。所以如果你要使用的话,可以很轻松的进行来回的切换,而不需要重新下载数据。
Bitcoinj的风险分析
大多数的钱包如今已经不做协议风险分析了。而BitcoinJ却可以做到,只不过一些代码还不太详细。例如,它检查不到Eligius。
使用这个框架来建立一个交易风险分析,并通过HTTP将结果导出(使用JSON-RPC,protobufs或二者相结合)。如果对建立在Bitcoinj之上的热钱包和SPV钱包客户端进行相同代码的风险分析的话,那将会有效的多。
支付渠道
我在2011年描述的结构协议合同中有提到过支付渠道的使用,后来与杰瑞米•斯皮尔曼(Jeremy Spilman)进行了合同协议的调整。最初的描述没用到支付渠道术语:当我和马修•科拉罗(Matt Corallo)开始实施Bitcoinj.计划后,在开始使用的时候才会用得上。
简单的说,我认为的支付渠道是:你和卖家同时在SIG上锁定了价值,然后在进行交易。这一步会涉及到在比特币的网络上进行广播。然后便开始进行交易(给卖方),但是不通过P2P网络。其中最典型的就是微额支付:每次你用这种微服务或者你给他们一笔交易,这样都比以前快很多。最后买家和卖家进行确认在P2P网上进行结算:最终这笔信息将被广播出去并且通道被关闭。
根据观察这个方案早在一个中心分支系统中被应用,以实现商家付款处理器的支付渠道网络。而并不需要触发区块。这里可以很容易的看到,如果在之前你已经过有一个支付渠道被打开,那么你就不能再通过该渠道进行双重支付确认交易。
我是微额支付的狂热粉丝并且用微额支付进行过文件下载。我不太喜欢使用这种方法来抵制双重支付的原因如下:
支付渠道的协议是很复杂的,制作后想要实现的话是很槽糕的,但它处所有的边界情况还是很好的。在bitcoinj的代码处理当中,如果一方关闭了该通道,序列化的数据将保存到磁盘当中,因此在一方当事人消失之后,该应用程序将会重新启动。到目前为止,我认为只有bitcoinj才拥有这种支付渠道。如果要求所有的钱包来实现这个协议似乎很极端:钱包开发者最大限度的开发比特币协议,更不用说在协议合同上的众多复杂步骤了。 更糟糕的是:即使针对协议的所有边缘情况进行处理,用户也不愿意去知道他们是如何去支付的更多细节。因此建立、使用说明和渠道损毁都必须在用户界面中进行公开。这样也就变得更复杂。 如果只有一部分钱包实现了这个功能,那么商家还是愿意去接受以前的那种广播模式。因此,骗子们也是尽力的声称不建议使用该钱包,并说它也没有什么意义。 如果您没有与商家建立支付方式,或者通过中心分散网络的途径。 那么你就必须要组建这样一个渠道。在应用的时候,需要我们等待一个确认,用户有时候会一直的在等着。而避免这种情况的发生就是接受没有确认的交易。 很清楚的可以看到,这种支付渠道的方式占用了用户的资金。如果你有钱去做一个通道,然后你想用它在商家那里没有这种通道买东西,你就必须关闭通道,并要求他们为你关闭通道。但是如果他们没有这样做,或者做的很慢,那你就必须要等到这个通道到期才可以使用。在这种情况下你去向用户解释的话,那是很难的。另外值得一提的是,这种支付渠道受到了攻击延展性。但是固定的交易延展性仍在工作:因为支付渠道是如此复杂,任何试图去执行它的时候没我觉得它已经完成了它的工作。
信任的第三方签名
GreenAddress.提出了一个方案,其中多重签名的币被用户和可信任的钱包服务器所拥有。钱包服务发出付款通知的时候,它将不会出现双重支付。
实际上,这意味着将在可信任的第三方 (TTP)那里签名BIP70的付款信息;这个PKI可以很好的做到这一点。
虽然这个技术工作起来很简单,不过它将改掉传统银行的一些缺点:
用户使用 TTP的话会很倒霉的 这个币是 2-of-2,因为用户可以自己控制进行签名,其他的保护是行不通的。 GreenAddress 可以通过来锁定交易时间,这样如果对方离开的话或者拉黑你,你的币最终会被返回。这是一个完美的解决方案。但是目前没有任何商家使用,因此我不知道这个工具怎么样。 商家不得不了解和评价这个TTPs,然后他们必须去配置他们的系统来识别那些TTP。然后比特币用户还必须找到一个TTP,并对其进行评估,选择一个币进行配置。这种不灵活的工作给在职人员提供了优势。 理想情况下 如果该TTP违反规定的话,是会有一个自动的系统来保留证据的。但这不是specced.这个方法在某些方面像是不匿名的矿工网络系统,他们使用一般的签名,而不是POW形式的”signatures of effort“(Blockstream 称其为动态多重签名)。但是目前比特币框架具有相当多的优势,即市场流动性很强。在通常情况下,我们会尽最大努力来维持市场的平衡。
远程认证
在GreenAddress方案里有一个转变就是利用一个可信计算机进行远程认证,而不是通过一个值得信赖的钱包公司。
可信计算机的一个特性就是现代芯片组。CPU或TPM芯片的一份声明中显示:“我是一个真正通过X制造的硬件,我在Y上面运行软件”。远程认证是一个很复杂的技术,我隐藏了很多细节问题,但总的来说——这将通过你的电脑来证明这不是双重支付。
实际上,你的计算机成为可信赖的第三方,除非不知道该怎么做,因为整个过程无需在本地的任何服务器上运行。
和TC有关的问题是,运行AMD,英特尔和ARM的计算机都可以建立远程证明系统。这项技术尽在服务器市场就被很好的利用了。
即使执行该方案也是有同样的问题:如果不是所有用户都可以做到这一点,那么骗子就不会在假装他们没有收到正确的交易以及以前交易多双重支付问题。除非所有的交易都会签名,并且不限制以前的交易。
ID验证
一个解决双重支付非常简单的方法那些信用卡受理商已经在做了:买家进行ID验证来解决诈骗问题。例如,使用Javascript,evercookies等一些付款处理器,在信用卡的空间里使用IP地址分析,计费/交易地址匹配,来抓住骗子的信息。在极端的情况之下,用户完全可以阻止交易发生或者提交文件进行审核。
这种方法既简单又行之有效,但是额度较高的交易却是不方便的。不过先进的技术可以把这个问题给解决,但是我们希望这不会发生,因为这样的话会影响正常的交易。
等待确认
这一个看起来会明白很多了。理想状态下,如果你能等待交易的确认,但是商家却不会这样做,甚至你可以把这个事儿想象成从一个仓库里运物品一样,那是不可能的事情。
我怀疑它的主要原因是现有的基于付款的这个流程主需要几秒钟的时间,双重支付的发现是在几个星期或者几个月。这是信用卡的使用模式。先前4、5个月的扣款信息被回滚也不是前所未有的。延迟几个星期的时间,是因为人们需要一段时间来获取和检查信息。所以除了像节假日和预订机票外,大部分商家就必须接受信用卡双重支付并承担商业风险和它的价格:他们通常不能在商品或者做服务之前撤销,是因为信用卡实在是太慢了。
因此很矛盾的一点是即使比特币的双重支付可以在几分钟内被泄漏出去,但是商家也不能用该信息,因为他们没有一个核实的工具或者程序来进行执行。商家在决定付款的时候区块链变做出 反映,数据库也开始更新,数据被分到指定位置,电子邮件也被发送出去。如果他们不想继续进行交易,就需要购买一个软件或者程序来取消。
商家可以通过用户的发票来进行修改,但会暂时中断用户的流量,可能也会让你觉得比特币的交易比信用卡还慢的多,但是在某种意义上来说,它比信用卡是快很多的。因此他们只接受BitPay和Coinbase的交易,目前还没有遇到过双重支付。
处罚双重支付的区块
挖矿的时候通过记录尽可能准确的事件信息,是为了防止双重支付的发生。然而矿工芬尼(Finney)没有这样做,他们集体给比特币社区发送服务,但是实际上是并没有提供挖矿补贴。
通常,当你收到一个东西都时候然后却不付款那是有后果。矿工同分叉的链和撤销交易的后果是失去他们的电费(即金钱),这样就能起到一个很好的激励作用。对于芬尼攻击而言。
Tom Harding 一直从事于研究 Finney攻击,使其产生轻微的波动尽可能的了解到更多的原理。当然了对于这种轻微的变化也不能忽视,这一切对于比特币的稳定运行至关重要。他写了一篇关于这些原理的分析文章并且针对此提出了很多建议。他的目的想让交易发生的30秒后变得更加稳定。
打破“0确认”交易
任何事情都无法做到完美,也许它就不应该全部都做到最好。
产生这种思维的原因之一是双重支付还没有整合到比特币的核心里去,必须要通过比特币XT来代替。
问题是在货币发展历史中没有出现过fraudless支付系统。银行电汇作假、信用卡回收、票据伪造、假币和重复区块。如果人们经常“保护”那些不太完善的支付系统,他们将不会在交易所里得到任何东西。因此在实际的交易中就会存在双重支付风险,企业就必须要虚如何管理和学习自己承受范围内的风险知识。
比特币没有什么与众不同的:只不过它涉及到很多不同的风险和管理技术。
截至2015年,许多商家都开始理解风险意识: 即接收没有被确认的交易是值得的。因此他们试图打破这个模式来保护人民财产的安全,使尽可能多的印制美元。不过这样的逻辑不仅荒谬,勇士也会伤及无辜的人,并且也是违法的。
这个观点行不通的另一个原因是,尽管这个处理潜在为题的功能是诱人的,但是这不适合比特币的模式。
如今,几乎所有的商家都接受这种交易,并把BitPay,Coinbase,Coinify和其他付款处理器设置为默认交易。 实体店需要他们 新的应用程序总是不会被人们所看到,其实它最终还是要给用户来用的。 根据我自己用比特币来买东西和买东西的销售经验来看。不管我们喜欢还是不喜欢,区块链算法是不是解决了所有的支付问题,我们也不会从市场中得到任何东西。我们会尽最大的努力去优化现有的系统,相信人们也会支持我们的这一努力。
----
原文:https://medium.com/@octskyward/double-spending-in-bitcoin-be0f1d1e8008
作者:Mike Hearn
译者:tomatocc
译者btc地址:1BQpsoxUq7N5Hv57QCnzLBbZSHGtqafaFy
微信掃描關注公眾號,及時掌握新動向
2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表比特範的觀點或立場
2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表比特範的觀點或立場