比特幣需要每個block(區塊)證明在建立它們的過程中投入了足夠都的工作量,從而確保那些想篡改曆史區塊資訊的惡意節點必須要付出更多工作量的代價,而不是只是修改一條記錄那麼簡單——工作量證明。
將區塊鏈在一起(hash相連相扣)使得只修改一個交易而不修改所有後續交易成為不可能。 工作量證明(Proof-of-Work)
使用SHA-256對一個value進行hash,看結果是否擁有所要求數量的前置字元為零,比如我們要求hash得到的值為 0000……,擁有四個前置字元為零。在比特幣中,我們是對一個block進行SHA-256雜湊,為此我們將一個nonce加入到block中,你可以理解為這個nonce是一個值可以變得整數,這樣我們就可以不斷遞增這個nonce,直到整個block的hash結果擁有所要求的前置字元為零。
有人想惡意篡改某一個block上的交易資訊,因為這是一個前後相接的區塊鏈,他就不得不把該block之後的所有區塊都以他惡意篡改後的block為基準重新計算一遍,代價巨大。與一IP一票不同(惡意攻擊者如果掌控大量IP發放權十分危險),比特幣是一CPU一票的機制,意味著算力擁有決定權,網路中以最長的那條區塊鏈為合法鏈,它代表著最大的工作量證明。如果網路中大多數(51%以上)的算力由誠實節點掌控,那麼這些誠實節點產生的合法鏈會增長的最快,超過任何一條與之競爭長度的鏈,進而防止惡意發生。正如前面所說,如果一個攻擊者要修改過去的某一個block,他需要重新做這個block以及它之後所有block的工作量證明,然後需要趕上並超過那條由誠實節點們打造的合法鏈。但是隨著合法連繼續添加新的block,該攻擊者追上的可能性是指數下降的。 交易網路 新的交易被廣播給所有的節點 每一個節點將該交易納入一個block中 每個節點開始了自己這個block的工作量證明工作,它們都希望能夠出一份難度大的工作量證明,這樣好讓全網接受和信服 當某個節點完成了自己的工作量證明,就會廣播自己的這個block給其他所有節點 收到這個block的節點會判斷這個block中的所有交易是否合法和是否已經發生過,如果合法並且沒有發生過,就接受這個block 節點接受這個block後就會以這個block的hash為前一個hash繼續去挖接下來的block
節點們總是認為最長的鏈為合法的鏈,並努力去擴大這條鏈。如果兩個節點同時廣播出各自挖出的block,其他節點以自己最先收到的block為準開始自己的挖礦,但同時會保留另一個block。所以就會出現一些節點先收到A的block並在其上開始挖礦,同時保留著B的block以防止B的block所在的分支日後成為較長的分支。直到其中某個分支在下一個工作量證明中變得更長,之前那些在另一條分支上工作的節點就會轉向這條更長的。
交易的廣播沒有必要讓所有的節點都收到,只要其中很多節點收到就可以,收到的節點致力於block的挖礦。而block的廣播也同樣能容忍丟失,即沒有必要所有的節點都必須收到,如果一個節點沒有收到這個block,當它收到下一個block的時候會意識到它錯過了這個block,並主動請求這個遺失的block。 區塊
一般比特幣網路會使得每產生2016個區塊的耗時在兩周,即每十分鐘產生一個區塊,如果時間短於兩周,難度會增長,如果超出了兩周,難度會遞減,因此無論整個網路中的挖礦能力多強,每十分鐘只會產生一個新區塊。比特幣的區塊由區塊頭和該區塊所包含的交易列表組成,區塊頭的大小為80位元組,由4位元組的版本號碼、32位元組的上一個區塊的散列值、32位元組的Merkle Root Hash、4位元組的時間綴(目前時間)、4位元組的當前難度值、4位元組的隨機數組成。區塊包含的交易列表則附加在區塊頭後面。我們僅對區塊頭進行雜湊。
隱藏在背後的不利原理
如果每個人都是可信並且為他人著想的好人,其實這個世界就會很簡單,不會有這樣那樣的約束,但現實是我們需要制定一套又一套的法律和規約來讓這個複雜的社會安全運作,不失控。比特幣網路也是如此,每個節點本質上都會存在潛在的道德問題,因此達成共識就會變得很困難,總會有惡意節點為了自身利益而搞破壞。
生物學上有一個原理叫做不利原理(the Handicap Principle),該原理可以協助我們解釋工作量證明的過程。這個原理說,當兩隻動物有合作的動機時,它們必須很有說服力地向對方表達善意。為了打消對方的疑慮,它們向對方表達友好時必須附上自己的代價,使得自己背叛對方時不得不付出昂貴的代價。換句話說,表達方式本身必須是對自己不利的。
比特幣的工作量證明很好的利用了不利原理解決了一個自己網路裡的社會問題:產生一個新區塊是建立在耗時耗力的巨大代價上的,所以當新區塊誕生後,某個曠工要麼忽視它,繼續自己的新區塊尋找,要麼接受它,然後接著它再繼續自己的更新區塊的挖掘。顯然前者是不明智的,因為在比特幣網路裡,以最長鏈為合法鏈,這個曠工選擇忽視而另起爐灶,就不得不說服足夠多的曠工沿著他的路線走,相反要是他選擇接受,不僅不會付出額外的辛苦,而且照樣可以繼續自己的更新區塊的挖礦,只利不害,而且這屬於全網成員在遵守一個不成文的規定,對之後該曠工自己發現新區塊更有利,不會再出現你走你的我走我的,是一個全網良性建設。比特幣通過不利原理約束了節點行為,十分偉大,因為這種哲學可以用到如今互連網建設的好多方面,比如防垃圾郵件、防DDoS攻擊,我們有理由相信,互連網或者分布式網路系統與現實的社會運作有著千絲萬縷的聯絡,正因為如此,區塊鏈的發展並不是冥冥之中的產物。