鑄塊雙花區塊鏈
『壹』 雙花理論是什麼概念
在學習區塊鏈的過程中,大家一定對會聽到「雙花」這個詞,意思就是雙重支付,或者更直白點就是一筆資金被花費了兩次。這篇文章我們來簡單的分析一下為什麼會有雙花,比特幣是如何避免雙花的。
在傳統的交易中,因為有銀行這樣的中心化機構,所以是不會存在雙花問題的:每一筆支付都將從你的銀行賬戶中扣除相應的資金,所有的明細在銀行都有記錄。但是在比特幣中,因為沒有賬戶的概念,而是引入了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 的設計更加符合數字貨幣這個場景的需求。