比特幣是如何防範雙花的?

假設我有1個比特幣,在兩台機器上同時轉給a和b兩個人,那系統如何判斷哪人接收? 另外,每個節點如何判斷我發出的合法性? 每個節點是否要向後追溯,一直到挖礦挖出的那筆記錄?還是說,只要驗證我提供的那筆utxo就行了? 多謝


  1. 首先,要檢查這筆錢是不是沒有被花費過。方法是查看你的這筆交易的來源是否在UTXO(未花費交易列表)中。不需要追溯到挖礦挖出的coinbase交易。

  2. 然後要看你提交的交易里有沒有包含有效鑒權。如果這筆錢之前是通過P2PKH交易付給你的,那就是看交易里有沒有這筆錢所在地址的對應私鑰的簽名。P2SH、P2MS類型的交易的鑒權規則類似。

  3. 如果你用同一筆UTXO構造了兩筆分別付給A和B的交易。那麼bitcoin-core客戶端的規則(截止2016.2)是只轉發先偵聽到的那個。但至於哪筆交易會被包含進未來區塊,則取決於礦工。

  4. 礦工的挖礦程序一般是定製開發的,礦工可以自主任意選擇這兩筆交易里的一筆。比如有的礦工會選擇先看到的交易,有的礦工會選擇交易手續費更高的那個。

  5. 當這兩筆相矛盾的交易中的一筆被寫入區塊鏈,並且深度達到6後(6個確認後),可以認為這筆交易獲得了最終的確認。等待6個確認的情況下,比特幣是幾乎絕對不可能被雙花的。一個確認都不等待,則有相當的可能被雙花攻擊。通常,3個確認已經相當安全。

作者:Ke Jiang
鏈接:https://zhuanlan.zhihu.com/p/25692826
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

對於雙花問題,比特幣網路,或者說區塊鏈網路,是這麼應對的

-每筆交易都需要先確認對應比特幣之前的狀態,如果它之前已經被標記為花掉,那麼新的交易會被拒絕。

-如果先發起一筆交易,在它被確認前,也就是這個時間段的交易還未被記賬成區塊block時,進行矛盾的第二筆交易,那麼在記賬時,這些交易會被拒絕。

-上面只是小伎倆,現在tricky的部分開始了。如果詐騙者刻意把第一筆交易向一半網路進行廣播,把第二筆交易向另一半網路廣播——這個詐騙者智商還挺高——然後兩邊正好有兩個礦工幾乎同時取得記賬權,把各自記的block發布給大家的話(這個概率很低),網路是不是會混亂呢,區塊鏈的規則是這樣的:先選擇任意一個賬本都可以,這時候原來統一的賬本出現了分叉:

但是在兩個賬本中各只有一筆交易,詐騙者不會有好處。接下來,下一個礦工選擇在A基礎上繼續記賬的話,A分支就會比B分支更長,根據區塊鏈的規則,最長的分支會被認可,短的分支會被放棄,賬本還是會回歸為一個,交易也只有一筆有效:

-那麼如果這個詐騙犯真的智商非常高,他會這麼做:如果是A分支被認可(B也一樣),相應交易確認,拿到商品之後,立刻自己變身礦工,爭取到連續兩次記賬權,然後在B分支上連加兩個block,就像這樣:

於是B分支成為認可的分支,A被捨棄,A分支中的交易不再成立,但他已經拿到商品,詐騙成功。

在B分支落後的情況下要強行讓它超過A分支,其實是挺難的,假設詐騙者掌握了全網1%的計算能力,那麼他爭取到記賬權的概率就是1%,兩次就是10的負4次方。但這個概率還沒有太低。

應對辦法呢?建議大家在一筆交易確認後,也就是一個block被記下來之後,再等5個block,也就是等6個block被確認後再把交易對應的商品交付。這樣,詐騙者還能追上的概率就幾乎為0了。除非……

如果詐騙者掌握了全網50%以上的計算力,那麼,即使落後很多,他追上也只是時間問題,這就是比特幣的「51%攻擊」。

這就是區塊鏈需要警惕的問題。雖然在比特幣網路中,用戶已經極多,全網算力總和非常大,如果真掌握50%以上,也不用靠這個詐騙了,挖礦的收益都更高。但是在小的區塊鏈網路中呢?況且,沒有50%以上的算力,還是有機會成功的,只是概率低而已。

不知道神龍見首不見尾的中本聰,會不會重現江湖,再一次驚艷世界。


以比特幣為代表的數字貨幣,關鍵的創新是通過時間戳(Timestamp)和工作量證明(Proof of Work)機制解決雙重支付(Double Spending)和拜占庭將軍問題(Byzantine Generals』 Problem),即保證同一筆比特幣不會同時出現在兩個地址,並且在信道可靠的基礎上,所有節點都可以讓其它節點接收到自己的真實意圖,並最終一致行動。這一技術方案最早見於化名為中本聰(Satoshi Nakamoto)的個人或團體在2008年發表的論文Bitcoin: A Peer-to-Peer Electronic Cash System。

一方面,每一筆付款都會被廣播給系統中所有節點,任何人都可以使用收款者的公鑰來驗證這個交易的合法性,如果付款者試圖雙重支付,就必須先刪除這個交易記錄,否則新交易無法通過驗證。中本聰在論文中寫道:

「時間戳伺服器為一個區塊的數據的哈希計算結果加上時間戳,並大範圍發布這一哈希計算結果,好比在報紙或新聞網上發表。顯然,時間戳證實這些數據一定在這一特定時間存在,只有這樣才能得到哈希計算結果(A timestamp server works by taking a hash of a block of items to be timestamped and widely publishing the hash, such as in a newspaper or Usenet post. The timestamp proves that the data must have existed at the time, obviously, in order to get into the hash)」。

另一方面,工作量證明機制使得生成下一個區塊的節點和礦工幾乎無法被預測到,所以刪除交易記錄幾乎不可能。系統中的節點將過去約10分鐘內的比特幣交易進行打包,而只有獲得有效哈希值的礦工才能生成新區塊,並得到挖礦獎勵;礦工除了打包比特幣交易,還要結合隨機數來完成有效哈希值的創建工作,獲得以要求的數量的0作為開始的哈希值。中本聰在論文中寫道:

「工作量證明本質上是一CPU一票(Proof-of-work is essentially one-CPU-one-vote)」;「如果兩個節點同時廣播不同版本的新區塊,那麼一些節點會先收到其中一個的廣播。在這種情況下,節點在先收到的區塊基礎上工作,並保留另外一個分支,以防後者變成較長的鏈。這個僵局要等到發現下一個工作量證明才能被打破,其中一條鏈將成為較長的鏈,在另一個分支上工作的節點將切換到較長的鏈上繼續工作(If two nodes broadcast different versions of the next block simultaneously, some nodes may receive one or the other first. In that case, they work on the first one they received, but save the other branch in case it becomes longer. The tie will be broken when the next proof-of-work is found and one branch becomes longer; the nodes that were working on the other branch will then switch to the longer one)」;「節點永遠認為最長的鏈是正確的鏈,並將持續在它上面延長(Nodes always consider the longest chain to be the correct one and will keep working on extending it)」,所以除非永久控制整個系統中超過一半的節點,才能阻止礦工把這個交易添加到新區塊中。

最後,考慮到硬體運算速度的增長和節點參與程度的變化,中本聰用移動平均目標來確定工作量證明的難度,使得兩個區塊生成的時間間隔約為10分鐘。

參考文獻:

論文Bitcoin: A Peer-to-Peer Electronic Cash System 網址:https://bitcoin.org/bitcoin.pdf

原文鏈接:從技術角度告訴你,區塊鏈到底有哪些特點和運作機制


沒有樓上大家講的那麼簡單,問題其實很複雜,有很多情景。

我比較懶,直接貼鏈接,樓主先大致看看感受一下,然後再一起交流交流好不好。

http://blog.csdn.net/zhangzq86/article/details/51943853

除了上還有下,講的很清楚。


上面的回答要不就是在copy,要不就是理解不夠深,簡單問題複雜化。第一,任何節點都可以發出任何交易,只要你有私鑰你可以double pay , triple pay。

2.舉個極端的例子 你同時發出2個交易,一個被一些節點接收,一個被另外一些接受,甚至 還有節點接受了2個,甚至有記賬(挖坑節點)接受了同時接受了2個。記住任何一個節點可以做任何事。

3.先問自己一個問題,一個交易被確認是什麼意思。簡單點說一個交易被確認被記錄進區塊鏈,更嚴格點說是交易被記錄進區塊鏈而且你的區塊還向後5個區塊。原因自己百度。

4.所以有個最終問題就是能不能雙花就看能不能進區塊鏈。一個區塊怎麼產生呢?產生的區塊怎麼能被大部分節點接受呢?產生一個節點的過程簡單點就是把一些交易數據再加一些別的數據生成一個符合

特定要求的hash值。但是你能計算出符合要求的值要符合區塊鏈客戶端裡面的規則的驗證。其中就有對utxo的驗證。舉個極端例子你把 2個交易都打包進區塊並且算出符合要求的值。你也過不了所有節點的驗證。

所以你不可能雙花。

5.另外舉個例子,我有 我的1個比特幣 同時發出2筆交易,一筆買杜蕾斯交易a 一比買岡本交易b 一些挖坑節點接受了交易1,一些接受了交易2,記賬節點A把交易1打包進區塊延伸了鏈,後面又有一個記賬節點給予前面的記賬節點A的鏈有延伸了一個區塊。這條鏈是最長的鏈。ok 商家確認了交易a。我拿到杜雷斯。過了30分鐘,有個超級nb的量子計算機哥們以交易b構造的區塊後面還加了6個區塊。成為目前最長的鏈。so 岡本也可以拿回家。你們說這算不算雙花。

比特幣的鏈其實在不斷切換中。但是幾乎沒有超出現有鏈2個區塊以上。所有能不能雙花一個取決於交易所在的區塊後面還有幾個區塊就算做確認。如果後面還有6個。理論上很難。如果記錄的區塊是最高區塊就確認,肯定可以雙花。如果說雙花的意思是一筆錢存在2筆以上的交易成功記錄。那是不可能。因為比特幣的機制決定了。如果是在現實生活中有一筆錢花費2次買東西有可能。


通過UTXO


最好的答案在中本聰的論文裡面。100%防止雙花是不可能的,但是在6個確認區塊之後的雙花是一個小概率事件。比特幣防範雙花的機制就是所有記賬節點一致地在自己認為當前最長的那條鏈上挖礦。


推薦閱讀:

區塊鏈的隱私性如何保護?
怎麼看矽谷投資大佬預言「比特幣價格將在20年內漲到100萬美元」?

TAG:比特幣Bitcoin | 區塊鏈Blockchain |