解读:本次MTGOX曝光比特币漏洞的真相

2014-02-10 14:07:54

 
刚刚研究了一下mtgox的声明(https://www.mtgox.com/ press_release_20140210.html),根据我对btc网络的理解,简单解释一下。
 
技术原因:
 
本质上源于比特币转账函数的返回值,即交易序号tx。简单来说是这样,在btc世界中,假设A用户(地址)发送给B用户(地址)n个比特币,改行为需要A用自己的私钥签名认证才能有效,这个行为无法伪造。但有个问题,就是为了跟踪该交易是否被整个btc世界确认,需要有个交易序号tx来描述这件事情。但注意,这个交易序号tx是可以伪造的。为什么tx在设计的时候不做成无法伪造的呢,部分原因是如果tx仅仅由交易本身+确定的算法来生成,那么相同的转账行为会生成同一个交易序号。所以tx就没这么严格,而btc网络只会验证交易行为的真伪而不会去验证tx号的真伪。(PS:不过可以用签名过的hash数来做tx啊,大概中本聪认为没必要吧)
 
一旦欺诈者可以伪造交易号tx,那么他就可以做这件事:1.到mtgox申请提现;2.mtgox会显示提现账户A和目标账户B以及tx;3.到btc网络找到这个交易的全部数据,替换tx为另外一个数,同时用一定的手段快速广播。由于该交易本身是经过签名的,而tx的真伪是无法验证的,所以只要欺诈者的网络足够快,运气足够好,他就可以把这个伪造的交易让全网确认(注意,交易本身是真实的,只是交易号是伪造的。你永远无法用这个方式从一个0余额的钱包里面提出来钱)
 
然后就是MTGOX愚蠢的地方了,它只跟踪tx。当伪造的tx被全网确认后,MTGOX发现自己的tx并没有被接受,所以他会认为没有给用户B成功支付BTC。于是B用户可以重新要求MTGOX提现,于是MTGOX就损失了这部分钱。 
 
那么,这是不是漏洞?
 
首先,所有的交易必须由发起人确认,全网来确认发起人是否有足够余额。这个btc基础的生存法则没有任何漏洞。如果这个有问题,我建议大家100RMB/BTC赶紧抛了吧。其次,tx可伪造这件事情,确实是btc设计本身的“问题”,但是否可解呢?其实非常简单,那就是不要依赖tx做验证,而是用交易行为验证就行了。mtgox只需要把自己从A钱包到B钱包转账这件事情在blockchain里面检索一遍即可。等等,重复交易怎么排重的?更简单了,每次用不同的A给B打钱就行啦啊。那MTGOX怎么至今搞不定的,我还真不知道。
 
最后,这个“漏洞”到底对btc世界有什么影响? 
 
第一,这个事儿只对中心化服务的交易网站、钱包托管网站有影响,对分布式的个人没有任何影响。第二,即便对于交易网站,这个问题也早就有人提出来了,大家也都纷纷提出解决方案了,比如刚刚我提的那个可能就行(估计有很多东西没考虑,真实情况肯定更复杂)。第三,其他网站都没遇到这个问题,估计别人也知道tx不靠谱,都自己过了一遍交易数据,只有门头沟……
btc世界依然很牢固,不必恐慌。算法万岁! 

转自:王博Oxyful

OKEX下载欧易下载OKX下载

okex交易平台app下载