區塊挖出時並不等於你的交易被最終確認
區塊鏈最重要的一個特徵是記錄其上的交易資料,一旦確認後就不能更改,且永久儲存在上面。區塊鏈的這個特性被稱為“不可變性”。
由於區塊鏈是去中心化的,這種“不可變”是系統本身內建的。要理解這個機制,我們需要先深入瞭解區塊是如何建立的。
區塊是如何建立的?
在比特幣、以太坊以及其它依賴於工作量證明(PoW)機制來執行的區塊鏈中,建立區塊實際上是一場競賽,最快創建出區塊的人會得到系統的獎勵,因此每個礦工都試圖成為第一個“找到”下一個區塊的人。
這場競賽的比賽形式就是“做題”。沒錯,就像考試一樣,系統會給出一堆複雜難解的謎題,礦工們利用自己的計算機算力和硬體設施來解題,最先給出“合適答案”的人,就能成為第一個建立區塊的人。
既然是競賽,題就不會那麼簡單,出題一般遵循“一難一易”原則:
難以解開:礦工必須投入大量的計算資源來解決難題;
易於驗證:對於其他礦工來說,驗證“ 答案 ”是否合法非常簡單。
當區塊被挖出後,礦工會通知網路中的其他人,其他人對該區塊進行驗證,當確認它的答案是合法的,那麼這個塊就是“有效”塊。網路裡的其他人就會接受它,並將其編碼為第X個區塊,然後再繼續重複以上工作,找到下一個區塊,即第X+1個區塊。
如此迴圈往復。
區塊傳播延遲
資訊在網際網路基礎設施中傳播需要時間,並不是即時的。這個傳播時間,有可能是毫秒。
當礦工挖出一個區塊時,它會被傳播給網路上的所有人。這種傳播有點類似“八卦”的傳播方式,每個收到資訊的人都會把它傳給鄰近的人,最終,這條資訊會傳給網路中的每個人。
但這個傳播過程需要時間,它可以是幾秒,也可能用時更少,網路中的每個人都需要時間來了解最新訊息,且每個人接收到訊息的時間是不一樣的。這也是為什麼每個區塊的出塊時間會間隔幾秒鐘或者幾分鐘的原因。
區塊衝突
就像生活中的其他事情一樣,區塊與區塊之間有時也會發生衝突。因為礦工都是彼此獨立工作的,他們並不知道別人的“解題”速度,因此,有時兩個人會同一時間解出謎題,即在差不多的時間裡挖出同一個塊。
當兩個礦工將各自的塊傳播給網路中的其他人時,由於是先傳播給鄰近的人,因此每個礦工接收這兩個塊的時間是有先後順序的。接收人會先入為主,把先收到的區塊複製過來,然後開啟新的挖礦工作。這個時候,不同節點,同時有不同版本的區塊鏈,而這兩個版本的區塊鏈,都會被礦工們繼續開採。但是兩個版本的區塊鏈增長速是不一樣的,總有一條鏈的長度要超過另一條鏈。當礦工們發現網路中有一個條更長鏈的時候,他們會拋棄當前較短的鏈,轉到更長鏈上進行挖礦。而那些被拋棄的塊中的資料,需要等待重新被寫入區塊中。這個過程即所謂的軟分叉。
還有一種極少數的情況,之前被臨時分在兩條鏈上的礦工,從此就在各自的鏈上繼續工作,原本的一條鏈被分成了兩條,即我們所說的硬分叉。
但要注意的一點是,硬分叉極少發生,軟分叉卻時有發生。
這就將我們引到了本文的最後一個概念:
區塊的確定性
區塊的確定性是指最終的、不可逆轉的事實。
如前所述,因為網路中每個礦工收到新區塊的時間不一致,因此區塊有效性的確認需要一定的時間。對於比特幣區塊鏈來說,最終性確認通常在6個區塊後確認達到。換言之,在有連續6個區塊確認之後,就認為區塊資訊基本上沒法被篡改,這筆交易就算完成了。對於以太坊,使用的值通常在30左右。這個數字不是一成不變的,在高風險交易或關鍵系統中,值可能會增加。
在區塊鏈設定中,確定性保證了所有有效區塊一旦被提交到區塊鏈上就不會被撤銷。確定性非常重要,比如你在區塊鏈上進行了一筆交易,如果沒有最終確認,可能一個隨機產生的分叉就能撤銷這筆交易。
簡而言之,區塊鏈上的交易確認不是即時的,在確認你的交易之前,系統需要一些緩衝時間。
附註本文參考資料:
Miguel Palhas:《BlockchainFinality》, 原文連結:
https://medium.com/utrust/blockchain-immutability-823e1f3983eb
End
※———長按識別下方二維碼 關注我們———※