關於比特幣的一些疑問,比如挖礦塊鏈等等?
我查閱了一些資料,大致了解了一下比特幣的運作過程,不過還是存在一些疑問。
比如,挖礦:這裡的挖礦是指所有人將自己的CPU貢獻出來合併在網路上所有節點的交易單嗎?這個如何做到?中間有一個伺服器做統籌嗎?不然最後的結果是誰來宣布?塊連:每十分鐘就會誕生一個比特礦區,這裡的礦區是指每次合併所有交易賬單後出來的新的記錄嗎?然後得到最多人承認的就有50比特幣(或者更少)?還有的就是快連以前的記錄保存在哪裡,沒有一個統一託管的中心嗎?
其實一直有個疑問就是,都說沒有官方中心,那麼這些數據到底託管在哪裡,而且是由誰來權衡呢?而且節點和節點之間不會出現各種衝突嗎?
很顯然你查閱的資料完全不靠譜。
1,挖礦不是把CPU貢獻出來合併在網路上所有節點的交易單。打包交易是非常非常容易的事情,根本用不著那麼多CPU。那麼燒CPU或者說挖礦的本質是幹嗎呢?簡單說就是競爭一個打包交易並且上傳到區塊鏈的權利,而燒CPU比誰算力高是在所有人身份都是不明的情況下最公平的方法。飛行棋你玩過吧,扔出6的人可以走出大本營對吧,挖礦性質和這個差不多,只不過要求扔100個骰子扔出100個6。結果不是某個中心節點會驗證,而是誰先扔出來,把扔出來的東西做個視屏發到網上說「你們看我扔出來了」,大家驗證過看沒錯你是扔出來了,你運氣比較好,這個主席就你當吧,於是你可以上傳新的區塊,加入你打包的交易,然後獲得一筆費用獎勵你扔了那麼多次骰子。
從原理上說的話,是所有的人算哈希函數,哈希函數Y=H(X)有個性質是你輸入Y永遠猜不到X是啥。然後大家規定說我們只認Y小於某個值的區塊,於是每個人都開始用窮舉法試各種X,直到試出一個X把這個放到他們區塊開頭。然後,哈希函數還有個性質是雖然通過Y猜X無限難,但是有了X求Y非常快,於是大家可以用哈希函數去驗證他的結果,如果對了就接受,就這麼簡單。
2,理論上來講,所有記錄保存在所有節點那裡,你沒聽錯,就是從第一筆交易到現在的交易,到現在為止超過100G的記錄,理論上來講應該保存在所有節點。
至於每10分鐘一個區塊,是指之前扔骰子的難度設置為大概全網的人都一起扔的話,差不多每十分鐘會有一個走狗屎運的傢伙扔到。這個難度會根據區塊產生的速度每幾個月調整一次,但是盡量控制在大約10分鐘有人算出來一個。
3,數據存在在所有節點。節點和節點之間不會有衝突嗎?這個問題問得很好——的確會,但是不大。
首先,區塊鏈里每個區塊是用哈希函數鏈接起來的,簡單來說,就是任何一丁點改變都會導致哈希校驗通不過,然後後面的都要改,這是超出任何人計算能力的。所以,100多G的數據里,除了最新的幾個區塊可能會有區別,其他的都是一樣的,因為有一點差別就會導致你要重寫後面的所有區塊,否則通不過校驗。
其次,雖然每個節點在最新的區塊判斷上會有差別,但是有個原則是,每個人都只接受最長的鏈。也就是說,如果有節點之間存在不一致,那麼也最多是在最後幾個區塊不一致,而且,通常是網路延遲造成的,如果這些鏈放在一起,只有最長的鏈是有效的。
當然,網路里也可能有不止一個同樣是最長的鏈存在,這個叫分叉,假設兩條鏈前面的區塊都一樣,就最後3塊不一樣,這個就是深度3的分叉。這種情況是可能出現的,這是因為之前我說的那個扔骰子的遊戲沒有一個中心節點來判定誰獲勝了——運氣好投出100個6的人要自己把證據廣播出去,而如果兩個人同時丟出來了,由於網路延遲有的人聽到了這個有的人聽到的那個,這就可能導致分叉。這並沒有關係,大家繼續往他們認為是最長鏈的那條上加區塊,如果這次又有兩個人同時投出來,就再分叉。這個分叉不會無限繼續下去,因為同時扔出來的概率會越來越低。
這就是一般比特幣的交易要延遲一小時才能確認,因為交易所在的區塊如果剛剛放在鏈上,很可能由於這種分叉而被丟棄。但是如果等一小時它後面加了6個區塊了它還在鏈上,那麼它就已經被所有的節點接收了無法修改了。
說了一大堆,其實最簡單的回答應該是——
數據會不一致,會有衝突。
但是,排除最新的6個區塊,所有的節點擁有的數據是一致沒有衝突的。
推薦閱讀:
TAG:虛擬貨幣 | 比特幣Bitcoin | 比特幣礦池 | 比特幣Bitcoin交易平台 |