區塊鏈入門——比特幣科普

Rico_h發表於2018-01-12

區塊鏈入門——比特幣科普

"分久必合,合久必分"

什麼是區塊鏈

區塊鏈(block chain)狹義來講,區塊鏈是一種按照時間順序將資料區塊以順序相連的方式組合成的一種鏈式資料結構。廣義來講是用分散式資料庫識別、傳播和記載資訊的智慧化對等網路, 也稱為價值網際網路。

區塊鏈的核心價值在於去中心化,這也是區塊鏈技術最根本最重要的性質。 網際網路從設計初始其實就是去中心化的,網路架構的原始設計中並沒有中心伺服器的概念,MAC地址、ip路由、傳輸層報文等等對於每個網路節點都是對等的,每個人都可以以相同的權益瀏覽和共享檔案。然而現在,我們的網際網路可以說是重度中心化,絕大多數的資訊來源都依賴於各大公司的伺服器。某個爆款話題的出現、區域性天氣原因導致的傳輸故障都會導致伺服器出現問題。伺服器一旦掛掉,就會影響很多的使用者,這也是中心化顯而易見的弊端。

而去中心化帶來的好處就是沒有權利中心,節點之間是對等的,每個節點都享有相等的權益,沒有欺騙,公平公正公開。那麼運作在這樣一個性質的系統就可能受到更多人的青睞。

然而這只是理想情況,因為網路本身的性質就是不可信的,存在著資訊盜取、惡意篡改等問題。如何解決在去中心化不可靠的網路上保持各節點資訊同步,並且不可篡改,使各節點按照相同的規則維持系統的良好運轉的問題,比特幣這一應用帶來了開創性的解決方案。

比特幣

如果對於不瞭解區塊鏈的人來說,比特幣的名氣似乎要大一些,畢竟大家都見證了幣圈的瘋狂。事實上,比特幣和區塊鏈的概念同時誕生與2008年,隨著一位化名為中本聰的人(也有訊息說是團隊)在比特幣白皮書:一種點對點的電子現金系統中提出。區塊鏈是比特幣應用的底層技術,比特幣是基於區塊鏈技術的加密數字貨幣。接下來用不涉及技術(技術實現可能和直觀認知有出入)的角度說明一下比特幣大致的工作形態。

記賬

相信每個人都不同程度上的記過賬,可能是如下形式:

  • 買火車票 300元
  • 和朋友看電影 40元
  • 買幾個橘子? 10元

類似這樣的記賬方式稱為單式記賬,只記錄了單方面的資金流向,平時我們記賬用這種形式就夠了,形式不會有太大變化。因為對我們個人來說,並不需要關心資金流向了哪裡,只需要知道自己剁了多少手╮(╯_╰)╭。

而對於一種貨幣系統來說,就要從整個系統角度來出發,當產生一筆資金流的時候,必定會有輸入和輸出,拿買橘子為例,個人的賬戶裡可以記錄減10元,而水果店老闆的賬戶可以記錄加10元,這種同時記錄資金的輸入和輸出的記賬方式稱為複式記賬。複試記賬更多的是從整個系統的角度出發,類似物質守恆的觀念。

五個人的遊戲

有了上文的概念,現在我們假設A手裡有50個金幣,他發明了一種遊戲,於是他又召集了四個小夥伴,每個人分了10個金幣。說明了遊戲規則:

  • 每個人可以任意把手中的金幣轉賬給另一個人,並要把此條資訊迅速告知其他人,同時每個聽到訊息的人要記錄在一張草稿紙上,並且也要繼續告知給其他人。每個人只能產生從自己的手中轉賬的資訊。
  • 每個人在記錄聽到的轉賬資訊的同時,在努力的求解一道難題,最先算出這道難題的人要把最近獲得的轉賬資訊完整的記錄到A4紙上,並且馬上向他人宣佈這張記錄資訊的A4紙以及難題的答案,經過驗證正確以後,他可以無條件的獲得12.5個金幣(憑空產生)。
  • 當每個人收到其他人傳來經過驗證正確的A4紙的時候,要把這個A4紙放到資料夾中,連線到上一個A4紙後面,永久的儲存,以便日後查詢。同時抓緊時間和其他人競爭求解下一道難題,爭取把最近的新資訊記錄到A4紙上並儲存在資料夾中,獲得金幣

規則一看有點複雜,讓我們舉例說明。

開始的時候每個人有10個金幣。

名字 A B C D E
餘額 10 10 10 10 10

假設不一會就產生了一系列的轉賬記錄T1:

轉賬 額度
A --> B 3
C --> E 2
B --> D 1
D --> A 1
D --> E 2

與此同時大家都在求解某一題目,例如此時C得到了正確答案,並把T1記錄和求解答案同時告知其他人,其他的小夥伴都驗證正確之後,每個人就把這份T1記錄放在自己的資料夾中,永久儲存。

按照之前的規則,C此時應該得到12.5個金幣。事實上,在C釋出T1記錄的時候,會將此記錄中加一條特殊的轉賬資訊:
"?--> C 12.5"
因為每個人記錄的時候並不會記錄是誰算出了結果,所以需要這一條"無輸入"的特殊記錄
複製程式碼

此時每個人的餘額應該是這樣:

名字 A B C D E
餘額 8 12 20.5 8 14

於是開始新一輪的轉賬交易,以此類推。事實上,比特幣的主體工作形態就是這樣。

對遊戲的疑問

  • 如果A傳播假的轉賬資訊怎麼辦? 比如A-->B 10000,其實A並沒有這麼多金幣。

    因為每個人都掌握著所有的記錄,所以可以不依靠別人很輕鬆的查詢出A的餘額,一旦接收無效的交易,直接被pass掉。不會繼續傳播(如果此遊戲是依靠中心賬本或者第三方記錄機構,就有可能篡改中心賬本發生此問題)

  • 如果有人私自篡改自己資料夾中的歷史記錄怎麼辦? 例如把自己的餘額改寫。

    這個就是掩耳盜鈴了,更改自己的記錄並沒有用,每個人都儲存著自己的記錄。

  • 如果B更改A4紙上的轉賬資訊怎麼辦? 比如憑空製造A-->B 10,而且A確實滿足此條件。

    產生此條交易需要獲得A的許可,B不能產生此條資訊。

  • 既然B不能產生別人的轉賬資訊,但他可以操作自己的轉賬資訊,比如把B-->A 10的這條已經產生資訊撤銷掉,從而使自己的餘額增加?

    這個問題還是有可能發生的,下面詳細的分析一下這個問題:

    其實每張A4紙都記錄了上一張A4紙的標記,來說明這張A4紙連線到哪一張的後面。在這個遊戲中,其實每個人都不需要信任其他人,因為遊戲規則的設定,只要每個人對規則達成共識,就可以自動的避免一些惡意行為的產生。

    事實上在接收到符合規則的A4紙的時候,無論有沒有其它和這張A4紙指向同一張紙的A4紙,都將其連線到所指向的A4紙上。例如已經存在如下記錄:

    ```
    T1 ← T2 ← T3   (圖1)
    ```  
    複製程式碼

    此時又接受到一張符合規則的A4紙T3',它也指向T2。這時候依然要把它儲存起來。

    ```
    T1 ← T2 ← T3  (圖2)
          ↑
          T3'
    ```
    複製程式碼

    這是為什麼呢?

    因為有可能存在T3和T3'都是正確的。這是因為有其中兩個人同時求出了問題的解並告知其他人,對第三個人來說這兩個解都是正確的,所以都要儲存起來,等待下一個的A4紙的接收。接下來假如接收到了T4,它指向T3。那麼就將其自動連線到T3後面。

    T1 ← T2 ← T3 ← T4 (圖3)
          ↑
          T3'  
    複製程式碼

    每個人在計算新問題時,都按照自己最長的分支去延伸,這個共識是很重要的。也就是說自己在計算時,要基於T4計算而不是T3'。同時也承認最長的分支上的資料。

    此時,B產生了一個壞想法。基於上圖說明:假設B在T3賬單中付給了A 5個金幣買了一本書(圖1),而自己又製造了一份資料T3',裡面把這條給A付款的資訊抹去,並重新發布T3',並故意使其連結到T2併發布。其他人收到訊息後把T3'作為側鏈連結到T2上(圖2),此時B又算出了T4,使其指向T3',又釋出了出去,其他人收到了T4後,經過驗證連結到T3'上。變成了下圖(圖4):

    T1 ← T2 ← T3  (圖4)
          ↑
          T3'  
          ↑
          T4
    複製程式碼

    因為每個人都按照最長的分支去延伸,所以此時無惡意的人會計算下一個T5是連結到T4上,這樣原本的T3中的交易就丟失了。所以沒人會記得B給A付了5個金幣,這樣B白白賺到了一本書。

    其實,滿足上述條件的場景不是很容易發生。可能你也發現了,B必須要和其他所有人去比求解問題的速度,一旦別人(無惡意的)產生的新賬單T4比B快,它會連結到T3,這樣B的目的就沒有辦法達成。

    然而當你的算力大於全系統的一半時,理論上來說這種攻擊就一定會成功,因為你比別人算的都快,有權利發表新的賬單記錄。也就是說,假如B聯合了其它五個小夥伴共同實施這個行為的話,就會達到目的。上述的攻擊被稱作51%攻擊。

  • 假如又有人想參與進來怎麼做?

    直接參與即可,假如沒有金幣,就可以求解問題釋出結果賺取金幣;也可以私下交易讓其他人先轉賬給他。新加入的人不影響整個遊戲的運作。

比特幣運作原理

讓我們把剛才的遊戲和比特幣對應上:

  • 每個人 —— 網路節點
  • 金幣 —— 比特幣
  • 每張記錄交易資訊的A4紙 —— 區塊
  • 連線狀態下的A4紙鏈 —— 區塊鏈
  • 求解問題的過程 —— 挖礦
  • 記錄產生分歧 —— 分叉

這樣就相對好理解了。

每一個執行著完整比特幣客戶端的都是一個比特幣節點,節點可以產生交易、傳播交易、進行挖礦來賺取比特幣。它們不需要信任彼此,只要它們保持著相同的共識規則,整個系統可以良好的抵禦惡意節點的攻擊。

隨著比特幣的第一個創始區塊的誕生,整個比特幣系統也隨之開始運轉。比特幣規定剛開始時的貨幣發行量是每個區塊50個比特幣,之後大約每4年減半,現在(2018)已經是每個區塊產生12.5個比特幣了,因此貨幣的總髮行量是一定的,大約2100萬個比特幣。

每一個新區塊在網路上被髮出,節點驗證後就會把此區塊連結到自己所儲存的區塊鏈上,沒有中心伺服器,沒有權威機構,每個節點都擁有相同的權利,同時區塊鏈也具有不可更改的特性。

挖礦的行為其實就是使得雜湊運算的結果小於特定值,只能反覆的計算,沒有任何捷徑。每一個節點都力求爭取這份"礦工費"。

區塊鏈分叉分為硬分叉和軟分叉兩種,硬分叉指的是主鏈和側鏈的共識機制不同,分別延伸兩條鏈,永遠分歧下去,這是硬分叉。硬分叉造成的後果是使得每條鏈的算力下降,造成對系統的負面影響。而軟分叉指的是暫時分叉,之後會側鏈重新會合併到主鏈上來,一般用於比特幣系統的版本升級,畢竟這是一個去中心化的系統,不能強制每個節點都升級,同時還要保證系統的良好運作,相容舊版本,所以說"共識"軟體的開發也是一門學問。


至此從非技術角度已經把比特幣的運作原理描述的差不多了,從技術角度出發可以擴充很多東西,比如為什麼系統能抵禦惡意節點的攻擊?為什麼它能在不信任的網路上運轉?挖礦到底是求解什麼問題?每個節點是怎麼連線起來的?如何證明金幣是我本人而不是偽造的?(事實上在比特幣系統中中沒有餘額這個概念)這些日後我會從技術角度說明一下,算是自己對區塊鏈的總結。

最後可能會問:為啥這個數字貨幣這麼值錢? emmmmmmm.... 為什麼一張紙做成了鈔票以後就是錢了呢?因為人們相信它有那個價值呀。

相關文章