摘要:铸块双花区块链『壹』双花理论是什么概念在学习区块链的过程中,大家一定对会听到“双花”这个词,意思就是双重支付,或者更直白点就是一笔资金被花费了两次。这篇文章我...
铸块双花区块链
『壹』 双花理论是什么概念
在学习区块链的过程中,大家一定对会听到“双花”这个词,意思就是双重支付,或者更直白点就是一笔资金被花费了两次。这篇文章我们来简单的分析一下为什么会有双花,比特币是如何避免双花的。
在传统的交易中,因为有银行这样的中心化机构,所以是不会存在双花问题的:每一笔支付都将从你的银行账户中扣除相应的资金,所有的明细在银行都有记录。但是在比特币中,因为没有账户的概念,而是引入了UTXO即未花费交易输出。因为没有银行这样的中心化机构的保证,当发生一笔交易时就可能存在着双花的危险:比方说A有一个比特币,然后他同时构造两笔交易T1和T2来花费这1个比特币,其中一个给了B,从B那里买件衣服,一个给了C,从C那里买双鞋。如果不引入某种机制来避免这种情况,那作为数字货币的比特币将没有任何存在的意义。接下来就来分析一下比特币是如何做到防止这种“双花”攻击的。
(1) 正常情况
首先我们来看看正常情况,说白了就是绝大多数时候,区块链的共识机制就能将双花消灭在萌芽状态。我们还是以上面提到的例子来做说明:
假设A构造了两笔交易T1和T2,将自己价值1btc的UTXO分别转给了B和C,妄图同时从B和C那里获得好处。然后A几乎在同一时间将构造好的这两笔交易广播至网络。
假设网络中的矿工节点先收到了交易T1,发现这笔交易的资金来源确实没有被花费过,于是将T1加入到自己的内存交易池中等待打包进区块。
大部分情况下,这个矿工节点会在不久后又收到交易T2,此时因为T2所指向的交易输入与已经加入交易池的T1相同,于是矿工节点会拒绝处理该交易。网络中其他的矿工节点都类似,因此A试图双花的尝试胎死腹中。
(2) 分叉情况
上面说的是正常的情况,但是也有非正常的情况要考虑:假设矿工节点M1和M2几乎在同一时间挖出了区块,并且很不幸M1挖到区块时只收到了交易T1,而M2挖到的区块时只收到了交易T2,这样交易T1和T2被分别打包进两个区块。因为这两个区块是差不多同一时间被挖出,于是造成了区块链的分叉:
网络中某些节点(可能是离M1近的)先收到了M1打包的区块BLK1,于是用该区块延长自己的区块链,而另外一些节点(邻近M2的)则先收到M2打包的区块BLK2,用该区块延长自己的区块链,于是整个区块链网络
『贰』 关于“双花”你需要知道的
如果小明使用的不是现金,而是数字货币呢?
“双花”问题
“双花”,即 一笔钱被花了两次或者两次以上 ,也叫“双重支付”。
在数字货币系统中,由于数据的可复制性,使得系统可能存在同一笔数字资产因不当操作被重复使用的情况。
1. 51%攻击
51%攻击,又被称为Majority attack。这种攻击是通过控制网络算力实现双花。如果攻击者控制了网络中50%以上的算力,那么在他控制算力的这段时间,他可以将区块逆转,进行反向交易,实现双花。
比如Bitcoin Gold发生的双花问题就属于51%攻击。 攻击者控制Bitcoin Gold网络上51%以上的算力,在控制算力的期间,他把一定数量的BTG发给自己在交易所的钱包,这条分支我们命名为分支A。同时,他又把这些BTG发给另一个自己控制的钱包,这条分支我们命名为分支B。
分支A上的交易被确认后,攻击者立马卖掉BTG,拿到现金。这时候,分支A成为主链。然后,攻击者在分支B上进行挖矿,由于其控制了51%以上的算力,那么攻击者获得记账权的概率很大,于是很快,分支B的长度就超过了主链,也就是分支A的长度,那么分支B就会成为主链,分支A上的交易就会被回滚(回滚指的是程序或数据处理错误,将程序或数据恢复到上一次正确状态的行为)。
也就是说,分支A恢复到攻击者发起第一笔交易之前的状态,攻击者之前换成现金的那些BTG又回到了自己手里。当然,这些BTG就是交易所的损失了。最后,攻击者把这些BTG,发到自己的另一个钱包。就这样,攻击者凭借51%以上的算力控制,实现同一笔token的“双花”。
2. 芬尼攻击(Finney attack)
“Finney”的名称来源于Hal Finney,Hal Finney是第一个描述双花攻击之0确认(未确认)交易的人。芬尼攻击主要通过控制区块的广播时间来实现双花,攻击对象针对的是接受0确认的商家。
假设攻击者挖到了区块,在区块中,包含了一笔交易信息,即地址1向地址2转了一定数量的token,不过这两个地址都是攻击者的。但是攻击者并不广播这个区块,而是立即找到一个商家,用他的地址1,把这些token发给商家的地址3。
发给商家的交易广播出去后,如果这个商家接受0确认,攻击者就把他自己之前挖到的区块广播出去,这时候发给自己的交易就先于发给商家的交易。对于攻击者来说,通过控制区块的广播时间,就实现了同一笔token的“双花”。
一般来说,为了节省时间而接受0确认,特别是对于大额交易而言,是非常不安全的,而且对于大额交易而言,多几次确认,将会降低交易被回滚的风险。
3.种族攻击 (Race attack)
这种方式主要通过控制矿工费来实现双花。
比如,攻击者把一定数量的token发给一个商家,我们命名为分支A。如果商家接受0确认,那么攻击者就会再把这笔token发给自己的一个钱包,我们命名为分支B。
不过,攻击者在发给自己的这笔交易中,加了较高的矿工费,从而大大提高被矿工打包的概率(也可以说间接提高了攻击成功的概率)。如果攻击者发给自己的这笔交易被提前打包,这时候这笔交易就先于发给商家的交易,也就是分支B的长度超过分支A的长度,分支A上的交易就会被回滚。对于攻击者来说,通过控制矿工费,就实现了同一笔token的“双花”。
4. Vector76攻击
Vector76攻击,是种族攻击和芬尼攻击的组合,又称“一次确认攻击”,也就是交易即便有了一次确认,交易仍然可以回滚。
如果电子钱包满足以下几点,Vector76攻击就容易发生。这几点即钱包接受一次确认就支付;钱包接受其它节点的直接连接;钱包使用静态IP地址的节点。
具体攻击方式如下( 感兴趣的可以点此查看 ):
攻击者控制了两个全节点,全节点A只是直接连接到电子钱包这个节点,全节点B与一个或多个运行良好的节点相连。
然后攻击者将同一笔token进行了两笔交易,一个是发给攻击者自己在这个钱包(接下来要被攻击的)上的地址,我们命名为交易1,另一个是发给攻击者自己的钱包地址,命名为交易2。但是攻击者给交易1的矿工费,要远大于交易2的矿工费。攻击者并没有把这两笔交易广播到网络中去。
然后攻击者开始在交易1所在的分支上进行挖矿,这条分支我们命名为分支1。攻击者挖到区块后,并没有广播出去,而是同时做了两件事:在节点A上发送交易1,在节点B上发送交易2。
由于节点A只连接到电子钱包的节点,所以当电子钱包节点想把交易1传给其它对等节点时,连接了更多节点的节点B,已经把交易2广播给了网络中的大部分节点。于是,从概率上来讲,交易2就更有可能被网络认定为是有效的,交易1被认定为无效。
交易2被认为有效后,攻击者立即把自己之前在分支1上挖到的区块,广播到网络中。这时候,这个接受一次确认就支付的钱包,会立马将token支付给攻击者的钱包账户。然后攻击者立马卖掉token,拿到现金。
由于分支2连接的更多节点,所以矿工在这个分支上挖出了另一个区块,也就是分支2的链长大于分支1的链长。于是,分支1上的交易就会回滚,钱包之前支付给攻击者的交易信息就会被清除,但是攻击者早已经取款,实现了双花。
5. 替代历史攻击(Alternative history attack)
如果商家在等待交易确认,alternative history attack就有机会发生,当然,这需要攻击者有较高的算力,对于攻击者来说,会有浪费大量电力的风险。
攻击者把一定数量的token发给一个商家,我们命名为分支A。同时攻击者又把这笔token发给自己的一个钱包,我们命名为分支B。在商家等待确认的时候,攻击者在分支B上进行挖矿。
商家在等待了N次确认后,向攻击者发送了商品。但是如果攻击者凭借高哈希率,挖到了N个以上的区块,那么,分支B的长度就超过分支A,分支A的交易就会被回滚,攻击者实现双花。如果攻击者挖到的区块数量没有超过N个,那么攻击失败。
Alternative history attack能够攻击成功的可能性在于两方面,一个是攻击者的算力在网络中的比例大小,另一个是商家等待的确认次数。 比如,攻击者控制了网络中10%的算力,如果商家等待了2个确认,那么攻击成功的概率低于10%;如果商家等待了4个确认,那么攻击成功的概率低于1%;如果商家等待了6个确认,那么攻击成功的概率低于0.1%。 由于该攻击存在的机会成本,所以如果代币交易金额与块奖励金额差不多,才有可能实现博弈。
目前,几个区块链项目的官方给出的解决方式,主要有如下几种:
1. 提高确认次数。比如LCC建议将确认次数提高为 100 个。
2. 在共识机制方面改善。比如 LCC表示可能会引入PoS机制。
3. 升级新的算法。比如Bitcoin Gold表示,正在开发新的 PoW 算法以替代原有的 Equihash 算法。
4. 与交易所等合作。比如Bitcoin Gold立即与合作交易所合作,阻断黑客的套现渠道。
链接:https://www.jianshu.com/p/56617e91b12a
链接:https://www.jianshu.com/p/0eb023e1d5dd
『叁』 Filecoin网络双花事件始末,什么是双花
3月18号,正在广大投资者沉浸在FIL币要突破100U新高的狂欢中时,晚间多个媒体报到出Filecoin主网疑似出现双花漏洞,多家头部交易所关闭了FIL币的充值功能,一度FIL币价下调到74U。
随后Filecoin官方立刻对此进行了调查,称并没有发现网络问题或者API漏洞,出现此问题的的根本原因是交易所Lotus API被不正确使用所导致,并且只有一个交易所受到这个问题的影响。Lotus团队正在与所有的交易所合作,纠正他们对API的使用,确定使用规范。
各大媒体相继转发官方报道澄清事实,到此,此次Filecoin主网双花问题基本告一段落。
大家或许有疑问,什么是“双花问题”?为什么会造成这么大的影响,简单的说按照字面意思,就是一笔钱花了两次或者多次,就好比我花100元用支付宝购物,结果支付宝系统出BUG,而我的余额中并没有扣款,接着我再用这100元去吃饭,这就是双花问题!如果这样也行的话,那区块链将没有任何信任可言了。
双花问题是怎么产生的
1、控制超过51%的算力:当第一次的交易通过验证并记录在区块中后,在该网络中以更好的算力验证出新的区块链条,并且在新的链条中将这笔数字资产第二次花费,因新的区块链条更长,这样就导致第一次交易所在的区块链条就被放弃,第一次花费的数字资产就会回到账户,这就造成了双花。所以在Filecoin网络,官方也控制了单一节点的有效算力不能超过全网的20%,这也是为了避免出现控制全网算力的现象,并且现在Filecoin网络有效算力已经达到3.377EB,进行算力的攻击成本太高;
2、时间差:由于共识机制,导致区块确认时间长,用一定数量的数字货币进行交易,在这笔交易还没有确认之前完成之前,再次进行二次交易;
历史 上出现过哪些“双花漏洞”
2018年一矿工控制至少BTG(比特黄金)51%算力,成功在交易所窃取38万枚BTG,现价值高达1200万美元;
2019年攻击者租借超过51%算力,进行双花攻击,获利最少5.4万枚ETC,现价值约65万美元;
『肆』 一句话解释区块链,你却为什么听不懂
区块链,现在这个概念异常火爆,几乎哪里都在讲,几乎人人都在谈。但是,真正懂的人似乎并不多。
你一定在网上看到过这样的文章:“X分钟告诉你什么是区块链”、“X张图讲清楚区块链”等等,但是看完后还是云里雾里。
你也一定听过,有人用一句话来解释区块链: 区块链,就是一个分布式账本。
确实是一句话,但是我知道,你还是没听懂。
你不懂什么是“分布式”,更不懂什么是“分布式账本”,尤其困惑的是:不就是个账本吗,怎么就成了要改变世界的技术了?
既然这样解释你听不懂,那么我尝试从另外一个角度来解释区块链。
当然,也是一句话。
让我们仔细想想,区块链技术无论多么高深莫测,也不过是一种工具而已, 只要是工具,就是用来解决某种问题的。
从这个角度说,区块链技术和你家里的榔头没有任何区别:榔头是种工具,要解决的问题就是墙上的钉子。
一种工具,如果它“ 是什么 ”很难解释清楚,那么就换个问题: 它解决了什么? 通过回答这个新问题,能否帮助我们最终理解这个工具?
举个例子:
艾卡哚司他尔(Epacadostater) 是一种极其复杂的分子化合物,代表了当今生物医学领域最高技术成果。如果讲定义,你几乎不可能给一个外行人说明白它是什么;但是从它所解决的问题出发,一句话就可以解释清楚这种神奇的药物: 它是一种治疗艾滋病的特效药物。
这次,我知道你一定懂了。不是因为你理解了 艾卡哚司他尔(Epacadostater) 的定义,而是因为你理解它所解决的问题:艾滋病。
所以,通过理解问题来理解工具,这种思维方式是完全可行的。
那么,区块链要解决的是什么问题?
简单的一句话解释: 区块链技术是一种解决双花问题的有效方案。
好吧,我承认骗你了,你还是没懂。不过先别打我,其实我们已经很接近了。
看看这两句话:
这两句话的关键在于:你明白 艾滋病 ,但你不懂“ 双花”问题 ,正是由于这种认知上的差异,导致你能听懂第一句,却听不懂第二句。
所以, 理解双花问题,是理解区块链的关键!
下面就解释下什么是“双花”问题”,虽然不是用一句话,但是也不难理解。
从我们日常用的微信开始,你一定熟悉下面两个场景:
表面看来,两种场景似乎差不多,但实际上,却有着巨大的差异!
你把照片发给别人,照片还在,但是发钱钱却没了,为什么?
也许你觉得本该如此:如果钱还在,人人岂不都有花不完的钱(梦想成真)!
不,这背后的道理一点都不平常。我来解释下为什么。
现在,我们每个人都要同时面对两个不同的世界:一个物理的现实世界,一个虚拟的网络世界(手机、电脑、互联网等),前者是由原子、分子组成,而后者的组成元素则是“数字”。我姑且把第二个世界称之为“数字世界”
“数字世界”是人类最伟大的发明之一,很多在现实世界中难以完成的任务,在“数字世界”中可以轻而易举的实现。
比如,在现实世界中,你有一张纸质照片,你希望分享给你远方的朋友,同时自己也想保留一份。要做到这点,你需要去照相馆复印,然后到邮局寄出。麻烦不说,还花时间。
而这一切在数字世界里,只需要你在手机上轻轻一点,一瞬间,你远方朋友就收到了这张照片。很方便。
为什么如此方便?
在现实世界中,分子原子是不容易复制的,也没有办法高速传输,而在数字世界里,数字极其容易复制,也可以高速传输(实际上,你在手机上发送照片,你是把这张照片的拷贝发出去,拷贝在数字世界是个很自然的事情)。
就是依赖这种特质,数字世界提供了远超现实世界的便利性,大大改变了我们的生活。
然而,人们发现这种便利性遇到一个巨大的困难: 如何在数字世界中传输“钱”?
在现实世界里,你把100元现金给你朋友,你的兜里自然少了这100元现金,而你朋友的兜里自然会多这100元现金。这种实物上的操作,不需要别人介入。
然而,在数字世界中,所有东西的组成元素都是数字,100元钱(或其他有价值的东西)和照片没有区别,都是数字。数字,就可以被轻易的复制和传输。
但是你显然不能用转照片的方法(复制数字拷贝)转钱,照片转走,你可以保留一份原件,但是钱转走了,你的钱不能保留。
换句话说, 数字世界中你的照片可以有无数份拷贝,而“钱”只能有一份。 “钱”在不同所有者之间流通的必须是它的“真身”,只是换了所有者而已,而不像照片一样可以有多个“分身”。
因为这种“唯一性”是和数字世界的天性不符,所以必须有额外的机制确保这点。否则,钱一旦可以被复制,那么你可以先把100元转给一个人,再把复制品转给其他人,等于一个100元被花了两次,这就是所谓的“双花问题(double spending)”。
综上,虽然“双花”问题可以让人人都有花不完的钱,但是,现代金融体系是绝对不能接受这点的。
怎么解决呢,之前的解决方案你很熟悉, 就是银行 ,由银行来负责记录每笔钱的所有者。
银行会给每人一个账户,在你交易完成后,银行会做如下操作:记录你的账户上少了100元,记录你朋友的账户上多了100元,100元只是换了所有者,并没有被复制。这里银行充当一个可信的中介。
但是银行系统有种种问题:
缓慢 ,转一笔钱可能要几天才能到账,这可不是数字世界该有的效率。
风险 ,银行对黑客攻击防不胜防。
昂贵 ,高昂的手续费,你懂得。
出于这些原因,我们不想让银行来做这个“中介”,那有没有其他办法,不需要任何中介,也能解决前面说的双花问题呢?
很长时间以来,答案是没有。
人们没有办法在一个没有银行的数字世界中解决双花问题。直到某天,一个天才想出了区块链技术,一切从此改变!
区块链技术就是解决双花问题的有效方案。它让人类第一次在交易方面充分享受到了数字世界的优势,快速、安全、可靠而且廉价。有了区块链技术,你可以像发送照片一样转账给朋友,更重要的是,整个过程中 ~没~有~银~行!
完美!
下面是这篇文章的总结:
1. 不要从区块链的定义来理解区块链,而要从它解决的问题入手。
2. 现实世界由分子和原子组成, 不容易复制和传输。
3. 数字世界一切皆由数字组成,解决了现实世界不易复制和传输的问题, 但是带来新的双花问题。
4. 构建一个以银行为中心的网络,可以解决数字世界的双花问题, 但是又带来其他问题:效率低,成本高,安全性差等。
5. 区块链技术,解决了上面的问题。一句话的解释就是:区块链,是一种工具,能够在去中心化的数字世界中解决双花问题。
希望读到这里,你可以通过理解“双花”问题来理解区块链是做什么的。至于区块链具体是如何工作的,我会在后续的文章给大家介绍。
最后,艾卡哚司他尔(Epacadostater)是我杜撰的,没有这种东西。
『伍』 ‘双花’攻击
什么是双花?
“双花”,即一笔钱被花了两次或者两次以上,也叫“双重支付”。通俗的理解,“双花攻击”(double spend attack)又叫“双重消费攻击”,即同一笔资金,通过某种方式被花费了两次,取得了超过该笔资金的服务。
在数字货币系统中,由于数据的可复制性,使得系统可能存在同一笔数字资产因不当操作被重复使用的情况。
双花是如何发生的?
众所周知,区块链节点始终都将最长的链条视为正确的链条,并持续工作和延长它。如果有两个节点同时广播不同版本的新区块,那么将在率先收到的区块基础上进行工作,但也会保留另外一个链条,以防后者变成最长的链条。等到下一个工作量证明被发现,其中的一条链条被证实为是较长的一条,那么在另一条分支链条上工作的节点将转换阵营。
双花简单说就是花两次。双花是如何实现的呢?分为两种情况:
(1)在确认前的双花。零确认的交易本来就可能最后没有写入区块链。除非小额,最好至少等确认即可规避此类双花。
(2)在确认后的双花。这就要控制超50%算力才能实施。即类似于一个小分叉,将给一个商店的交易放入孤立区块中。这种确认后双花,很难实施,只是理论上可行。
双花攻击案例
2018年曾经发生了比特币黄金(BTG)的双花攻击。BTG当时是全球第27大加密货币,流通市值为50亿人民币。2018年5月16日以来,攻击者对BTG网络成功实施了双花攻击,谋取了超过38.8万的BTG的暴利。
攻击者控制BTG网络上51%以上的算力,控制算力期间,把一定数量的BTG发给自己在交易所的钱包,这条分支我们命名为分支A。同时,又把这些BTG发给另一个自己控制的钱包,这条分支我们命名为分支B。分支A上的交易被确认后,攻击者立马卖掉BTG,拿到现金。随后,攻击者在分支B上进行挖矿,由于其控制了51%以上的算力,很快分支B的长度就超过了分支A的长度,分支B就会成为主链,分支A上的交易就会被回滚恢复到上一次的状态。攻击者之前换成现金的那些BTG又回到了自己手里,这些BTG就是交易所的损失。这样,攻击者就凭借50%以上的算力控制,实现了同一笔加密货币的“双花”。
『陆』 入门科普:什么是双花
想要了解区块链,首先要熟悉区块链相关的各种名词。就比如我们今天讲到的“双花”,可能有人就要问,双花是什么花?哈哈哈,开玩笑,让我们来学习一下什么是“双花”吧。
01
“双花”是什么?
双重支付又名“双花”,也就是双重花费的意思。 举个例子:如果我钱包里面有100元,我可以去购买等值的物品。当我去商店后,发现台灯和桌子都是100元,那我只能买其中一样东西。而我们所说的双花问题,正好与之相反,同样的100元,我可以购买两样东西。
在加密货币系统中,由于数据的可复制性,使得系统可能存在同一笔数字资产被重复使用的情况 ,这也称之为双花,又叫双重消费攻击。
02
双花问题是如何发生的?
在区块链系统中,双花问题会在以下情况下出现:
1、由于共识机制导致区块确认时间长,用一个数字货币去进行一次交易,可以在这笔交易还未被确认完成前,进行第二笔交易。
2、 控制算力来实现双花 ,第一次交易被验证通过并被记录入区块后,在该网络中有更高的算力验证出新的更长链条,在该链条中这笔钱被第二次花费,由于第二次花费的区块链条更长使第一次交易区块所在链条为无效链条,这样一来,第一次交易所在的区块链被区块链网络放弃,第一次花费的钱就又回到自己账户了,就导致了双花问题。
03
比特币如何避免双花问题?
为了解决双花问题,我们日常的数字资产使用依赖于第三方信任机构进行。这类机构对数据进行中心化管理,并通过实时修改账户余额的方法来防止双重支付的出现。而作为去中心化的点对点价值传输系统, 比特币通过UTXO、时间戳等技术的整合来解决双花问题。
1、首先每笔交易都要先确认对应比特币之前的情况,要检查它是否存在于用户的UTXO中。如果不在,那么该交易会被系统拒绝。
2、如果用户用同一笔UTXO付给两个人,系统中的节点只确认先接收到的那一笔。
3、当两笔时间上很接近的交易被不同节点确认,区块链将发生分叉。剩余节点选择在他们认为的最长链上构建新的区块。
4、当其中一笔交易被6个节点确认后,它将成为系统最长链,可以认为这笔交易获得了最终的确认。
『柒』 在区块链中,双花问题是什么问题呢
什么是双花问题呢?
双花问题,简单讲就是一笔钱能被花两次三次很多次。为什么双花问题会成为比特币系统里面一个这么重要的问题呢?
原因就在于:比特币,是虚拟货币,它是虚拟的,通过代码形式呈现出来的,是可以被复制下来的。一旦被攻破了代码漏洞,那么就可以循环使用同一笔比特币,这样一来,比特币这种“钱”就会变得很鸡肋。
我们想一下,要是一笔钱可以花很多次,你有500块钱,你去买一件500块钱的衣服,还能循环使用,再去买一双500块钱的鞋,这样一来,钱还能叫钱吗?
所以,中本聪在设定比特币系统的时候,他所有的技术手段基本上都是围绕着解决
“双花问题”的,来保护比特币作为一种货币,它自身的一个支付手段职能。
其实,这个双花问题在我们现在的中心化世界里面根本不是问题,因为有银行,钱的交易结算都是通过银行,很安全,有问题直接找银行。
但是,在去中心化世界里面呢,没有银行这样一个中心机构,还必须保证一笔钱只能花一次,怎么样实现在去中心化的前提下,杜绝“双花问题”呢,这是一个难题。
这里插一句,中本聪为什么如此执着的追求“去中心化”呢,自找烦恼吗?不是,他希望能够通过去中心化,来解决一些社会问题,其中最主要的问题就是:因为权力机构过量发行货币造成的通货膨胀。
所以,我们总结一下他的逻辑:中心化的货币增发导致通货膨胀——所以我们要实现去中心化——去中心化要面临很多问题,最大的问题是双花问题——所以我们要解决双花问题——怎么解决双花问题?
这里,中本聪就引入了UTXO和“时间戳”概念,依靠这两种手段来解决双花问题。
『捌』 区块链鼻祖比特币之8:分叉带来的双花支付、51%攻击与解决办法
分叉
前面讲到了比特币通过区块链+工作量证明的独特设计来解决了时间顺序,但是不能保证在同一时刻有两个节点算出了正确的解,虽然这种可能性很低很低。这就带来了区块的分叉。
虽然说几乎同时有两个节点计算出这一数学问题的可能性微乎其微,但是仍然存在这样的可能性,所以分叉就以为着同一个区块的后面可能会跟上两个不同的区块。
规则的打破一直要到下一个区块被人解开。则会立即转向最长的区块,而那些短的区块则会被抛弃。数学问题使得区块很难被同时拆解。要连续发生多次更是困难。最终区块链会稳定下来。也就是说所有人对最后几个区块顺序达成共识。分叉意味着,譬如,若你的交易出现在较短的支链,它就会失去进入区块链的位置。一般而言,只代表他会回到未确认交易池。然后被纳入到下一个区块。
比特币网络如何解决分叉带来的双花支付
可惜,交易失去区块位置的潜在可能,给了本来定序系统防范的重复支付攻击机会。考虑下面的一个攻击者A,其首先用自己的比特币交换B节点的货物,其立即又支付给自己。然后其通过努力的制造更长的链条来让自己的支付替代掉B节点的支付,从而实现了双重支付,B节点既得不到钱,还失去了货物。
这时交易会退回到未确认池中,因为A节点已经利用参照同样的input交易取而代之。节点就会认为Bob的交易无效。因为已使用掉。
你可能会猜测A节点会预先的计算出一支区块链,然后抓住时机发布到网络。但是每个区块的数学谜题阻挡了这个可能性。如前面所诉,解开区块是猜测出一个随机数的过程。一旦得出答案,解出的哈希值就会成为指纹一样的区块识别。只要区块内容有一丁点变化,下一个区块的参考值就会完全不同。此机制的结果就是无法在区块链中置换区块。在得到前一个区块之前,下位区块无法被解开。前一个区块的指纹也是杂凑函数的引数之一。
同时,该工作量证明机制还解决了在集体投票表决时,谁是大多数的问题。如果决定大多数的方式是基于IP地址的,一IP地址一票,那么如果有人拥有分配大量IP地址的权力,则该机制就被破坏了。而工作量证明机制的本质则是一CPU一票。“大多数”的决定表达为最长的链,因为最长的链包含了最大的工作量。如果大多数的CPU为诚实的节点控制,那么诚实的链条将以最快的速度延长,并超越其他的竞争链条。如果想要对业已出现的区块进行修改,攻击者必须重新完成该区块的工作量外加该区块之后所有区块的工作量,并最终赶上和超越诚实节点的工作量。我们将证明,设想一个较慢的攻击者试图赶上随后的区块,那么其成功概率将呈指数化递减。另一个问题是,硬件的运算速度在高速增长,而节点参与网络的程度则会有所起伏。为了解决这个问题,工作量证明的难度(the proof-of-work difficulty)将采用移动平均目标的方法来确定,即令难度指向令每小时生成区块的速度为某一个预定的平均数。如果区块生成的速度过快,那么难度就会提高。
如果有一台超级电脑,能够在区块解题中获胜?
即便是一台超级电脑,或者时几百上千台电脑也很难赢得解一个区块的胜利,因为竞争对手不是任一台电脑,而是整个比特币网络。你可以用买彩票来比拟。操作千百台电脑,如同买了千百张彩票一样。
51%攻击是指的什么
根据前面的例子,我们知道,要想有50%的概率领先其他人解题得到胜利,就需要掌握全网50%以上的算力。要连续领先他人解出区块,掌握的运算能力还需要高得多。所以区块链中的交易是受到数学竞赛所保护。恶意用户必须和整个网络较量。区块连接建立的结果,使得在支链越前方的交易越安全。恶意的用户必须在更长的时间赢过全网络,来达成重复支付,替换前面的区块链。所以,系统只有支端末尾易受到重复支付攻击。这也是为什么系统建议多等几个区块,才能确认收款成功。
个人博客:https://dreamerjonson.com/
『玖』 潜藏在货币流转特性中的秘密,DCEP如何优雅地解决“双花问题”
上一篇文章我们已经谈过,账户体系可以完美地解决数据作为货币会产生的双花问题,但由于这种账户机制,会使得货币的流转丧失并行的特征,很难在一个独立的系统当中容纳大量的交易同时进行。
那么,我们如何才能让这些账户可以实现数据的并行化处理呢?
换一个思路来思考账户结构。
我们之前的账户体系当中,不同的用户账户所记录的是一个数字,我们利用一个数字来表示一个用户手中所持有的货币的数量。但现在我们不再使用一个数字来表示账户的货币数额了,而是将每个货币都变为一个独立的数据段记录在账本当中。
当用户要进行交易的时候,只需要选择一部分货币,并将这这些货币复制给新的用户,同时将原本用户手里的货币标记为作废即可。
假设张三的账户中存在着100张代表着一元的货币,每一个一元货币都有着独一无二的编号,那么当张三向李四转移50块钱的时候,张三只需要在自己的账户当中选择出这50张货币,告诉账户的管理者,我要把这50张货币转移给李四。而账户的管理者在收到这样的一个信息请求之后,他就会把这50张货币在账户当中标记为作废。与此同时,在李四的账户当中产生50张新的一元货币。
这种处理方法也就是现在所谓比特币UTXO结构所采用的一种方式。它的优点在于可以允许货币同时由多个账户转向多个账户。交易过程中系统会自动加上时间戳,如果用户用同一笔UTXO付给两个人,系统中的节点只确认先接收到的那一笔。
然而,实际上比特币的交易实现,并没有采用 50 张一元这种做法,而是让每一个货币都有自己的面额。
这也很好理解,因为既然货币是可以被生成和销毁的,那么为什么不直接生成一张50元呢,更加简单便捷。
在比特币账户账本中,货币是以一个字符串的形式来进行记录的。每一个货币都有自己的独立ID。这个ID是由UTXO交易哈希值与UTXO中的位置索引决定。
这种记账方式的优势在于交易逻辑清晰。它可以通过算法分析出交易之间的依赖关系,并将可以实现一定程度上的交易并行化处理。
尽管并行化的问题得以解决,系统中也存在了真实货币的概念,然而用户并没有真实拥有这些货币,它们被存储在区块链上。
既然如此,为什么我们不让用户 “拿着” 这些货币呢?
听起来这似乎只是一个简单的操作,只要将这个货币的数据记录从我们的账本上拿到用户手中即可。
但这一个小小的变化,却能使我们整个系统实现了质的飞跃。
实际上,这就是 DCEP 的设计逻辑。
让用户手中真实持有代表货币的字符串。这些字符串数据通过数字签名技术进行签名,保证货币确实由央行发行。
如此,整个DCEP体系摆脱了原有的账本。体系中流转的不仅仅是价值,而是现金。用户的所有交易行为都会被表达为加密字符串的交换过程。通过这样的方式,真正的实现了货币的流转流程与现金的等价关系。
这种方式可以真正让数字货币的流转方式模拟了真实货币的流转方式,与现有的任何一种账本记录的方式有着本质的区别。
在原本的账本形式中,用户所拥有的只是一个证明你身份的字符串,并不是现金。现金是被放在账本管理机构手中的。换言之,用户拥有的仅仅是货币的价值,而不是货币的物理属性。用户永远不知道管理机构利用自己的现金做了什么。
另外,生活中用户也并不关注储存在银行中的货币的编号。他们只需要在使用时,考虑货币的面额即可。而这样的设计会使得货币展现出与真实现金的不同特征。
例如,账户中记录的货币是可以被分割的,理论上这种划分是可以无限进行下去的。账户系统中两个相同的一元并无区别,他们都只是一个在系统中记录的数字。
说到这里,不得不提及一个来自于区块链行业的概念——NFT。
这个概念与银行账户的价值记录方式有所不同。它的全称是非同质化代币。
简单来说,就是每一张货币都不一样。如同现金,虽然两张一百元货币的价值都是一百元,但是他们在物理上却是不相同的。
现实中,每张真实的货币都是可以被任何人真实拿在手中的。钱的物理属性与价值被统一管理。每张货币也都拥有一个唯一的编号,这个编号可以用于追踪货币,同时也保证了货币本身的独立性。每一张货币都是不可分的。我们不能把一样百元大钞撕成两半,把其中的一半当作五十元来用。那么,如果我们需要调整货币的面额,就要把手中的货币进行兑换。
以上这两种系统的区别,本质上是现金与账户的区别。
从这个角度来讲,DCEP的设计模式,说明了它就是一种真实的现金。
它的任何属性,包括流通特性都与真实的现金是一模一样的。
而在此基础上,由于数据可以被远程传输和管理,DCEP又比现金有了更大的优势。
DCEP作为现金的一种表现形式,它的技术设计当然不可能是账户机制完成的。
尽管数字货币在到达用户的手中后,可以实现货币流通的并行化,但是考虑到由于数据本身是可以被复制的,而用于保证DCEP真实性的数字签名即使是在被复制之后,也能被正确的验证,我们仍然需要解决数字货币“双花问题”。
解决这种问题的方法就潜藏在现金货币的流转特性中。
之前已经说过,每一张现金上都是存在一个唯一的编号。
事实上,这个编号就是解决DCEP双花问题的关键。通过编号,我们就能很优雅地解决“双花问题”。
“双花问题”问题简单来说就是,支付方已经将一笔钱付给接收方,但却依旧拥有被转移货币的支配权。换言之,这笔钱同时被两个人所拥有了。
从这个角度上来讲,避免货币“双花”的核心点,就是保证同一时间,一个货币只能被一个人拥有。
在DCEP场景下,通过DCEP本身所具有的编号,我们就可以成功实现追踪每一张货币的所有者。
因此,在 DCEP 体系下,解决问题的方式就是构造一个登记中心,记录 DCEP 字符串编号与所有者身份编号的映射关系。
正如图中所述的流程,当Alice向Bob发送一笔数字货币时,Alice先向Bob发送自己所拥有的数字货币字符串。同时 Alice 也会向数字货币登记中心通知,告知数字货币登记中心自己的这张货币0x001的所有权已经发生了转移。数字货币登记中心会根据Alice所发送的数字签名信息验证Alice的身份,确保Alice真实确实是货币0x001的所有者的情况下,把这张货币的所有权记录修改为Bob。
虽然我们使用了一个登记中心用于记录所有货币转移过程的身份变化,但是这个中心并不会限制整个数字货币的性能。因为数字货币的登记中心所管理的每一张货币都是相互独立的,天然满足成为 Stateless 的特性。在这个基础上,整个系统是可以无限并行化扩展的,这也就意味着DCEP的核心系统理论上是可以对外提供无限扩展的高性能支持的。
至于Stateless,这是一个计算机术语。
Stateless的设计可以保证整个系统中不存在性能瓶颈。任何一个系统的设计只要满足Stateless的特性,那么这个系统的性能便可以被无限的扩展。
在整个数字货币登记中心系统中,每一张货币的所有权记录都是独立的,正如同真实的现金在社会中流转的过程。
某种意义上,DCEP的设计目标是为了全国乃至全世界的货币流转过程提供支持。这对整个系统的性能有很高的要求。
而DCEP所采用模拟真实现金流转过程的技术方案,既能巧妙地解决数字货币可能产生的双花问题,同时又借助于货币流转的并行化特征,保证货币的流转结算过程可以被完美地并行化处理。
无论从区块链上加密货币的形态上来看,还是从实现的技术特性上来看,DCEP 的设计模式可以说是与区块链完全不相同的设计模式。
本质上,区块链无论采取什么样的形式,它都是一种账本的形态,而 DCEP 的实现则是一种真实的现金。
显然,DCEP 的设计更加符合数字货币这个场景的需求。