1. 程式人生 > >簡單理解“區塊鏈”

簡單理解“區塊鏈”

今年過年回家,小我一歲的堂弟問我你們做軟體的知不知道比特幣?“區塊鏈”啊?好尷尬,之前實習的時候有聽同事好像在玩比特幣但是一點都不瞭解。所以就讀了這篇文章寫了這篇讀書筆記。這篇文章避開了一些底層和演算法細節,採用比較主觀的方式來展示對區塊鏈的感性認識,這只是在別人問起的時候可以稍稍表現下的。之後還得深入對它進行學習跟了解。

(一)去中心化:

查了些資料反覆提到區塊鏈是一個去中心化的系統,那麼我們先簡單瞭解一箇中心化例子吧。

回憶一下我們在網上購買一本書的流程:

  • 第一步,你下單並把錢打給支付寶
  • 第二步,支付寶收款後通知賣家可以發貨了;
  • 第三步,賣家收到支付寶通知之後給你發貨;
  • 第四步,你收到書之後,覺得滿意,在支付寶
    上選擇確認收貨;
  • 第五步,支付寶收到通知,把款項打給賣家。流程結束

可以看出所有關鍵流程都在跟支付寶打交道。

那麼去中心化是什麼樣子呢?

第一步,你下單並把錢打給賣家;第二步,你將這條轉賬資訊記錄在自己賬本上;第三步,你將這條轉賬資訊廣播出去;第四步,賣家和支付寶在收到你的轉賬資訊之後,在他們自己的賬本上分別記錄;第五步,賣家發貨,同時將發貨的事實記錄在自己的賬本上;第六步,賣家把這條事實記錄廣播出去;第七步,你和支付寶收到這條事實記錄,在自己的賬本上分別記錄;第八步,你收到書籍。至此,交易流程走完(二)兩個基礎的信任問題——也就是後面解決的“聽誰的”的問題:

1、兩軍問題:

大致說的是有兩個相距很遠的軍隊要傳遞資訊,紅軍派遣一個信使去跟藍軍說:“你他孃的把義大利炮拿出來!”。藍軍收到資訊後又派了一個信使去紅軍說:“收到指令!”。然後紅軍又派一個信使去藍軍說:“知道你收到指令了!”。然後藍軍又派一個信使去紅軍說:“知道你知道我收到指令了!”。然後紅軍又派一個信使去藍軍說:“知道你知道我知道你收到指令了!”……然後就沒完沒了了。跟tcp傳輸協議有點像。

2、拜占庭將軍問題:

拜占庭羅馬帝國在軍事行動中,採取將軍投票的策略來決定是進攻還是撤退,也就是說如果多數人決定進攻,就進攻。但是軍隊中如果有奸細(比如將軍已經反水故意亂投票,或者傳令官叛變擅自修改軍令),那怎麼保證最後投票的結果真正反映了忠誠的將軍的意願呢?拜占庭將軍問題反映到資訊交換領域中來,可以理解為在一個去中心的系統中,有一些節點是壞掉的,它們可能向外界廣播錯誤的資訊或者不廣播資訊,在這種情況下如何驗證資料傳輸的準確性。

(三)模型對應比特幣解說:---------------------------------------------------------------------------------------------------------------------------------下面來看下去中心化借貸模型:如果A借了B 100塊錢,這個時候,A在人群中大喊“我是A,我借給了B 100塊錢!”,B也在人群中大喊“我是B,A借給了我100塊錢!”,此時路人甲乙丙丁都聽到了這些訊息,因此所有人都在心中默默記下了“A借給了B 100塊錢”。你看,這個時候一個去中心化的系統就建立起來了,這個系統中不需要銀行,也不需要借貸協議和收據,嚴格來說,甚至不需要人與人長久的信任關係(比如B突然又改口說“我不欠A錢!”,這個時候人民群眾就會站出來說“不對,我的小本本上記錄了你某天借了A 100塊錢!”)。 

----------------------------------------------------------------------------------------------------------------------------------

在上述的模型中,所謂的“100塊錢”已經不重要了。換句話說,任何東西都可以在這個模型中交換,甚至你可以憑空杜撰一個東西,只要大家承認,你就可以讓你杜撰的東西流通。比如:我在人群中高喊一聲“我創造了10個查克拉!”,我甚至不需要知道查克拉是什麼,也不需要關心世界上是不是真的有查克拉,只要大家都聽到,然後在自己的小本本上記下“LaiW3n有10個查克拉”,於是我就真的有100個查克拉了。從此以後,我便可以聲稱我給了某人1個查克拉,只要路人甲乙丙丁都收到並且承認了這一資訊,那我就算完成了這次交易,哪怕世界上沒有查克拉。

假設過了很長一段時間,我憑空創造的查克拉已經在這個系統中流通了起來,大家都開始認可了查克拉。但是這個系統中一共就只有10個查克拉,於是有人動了壞心思,他在人群中高呼“我有10個查克拉!”怎麼辦?大家是直接在本本上記下他有10個查克拉麼,這樣不是人人都可以偽造查克拉了麼?

為了防止有人偽造的現象發生,我決定在我創造查克拉的時候給我的查克拉打上標記(更準確地說,我是給我喊的那句“我創造了10個查克拉”打上標記,比如標記為001),這樣以後在每一筆交易的時候,我在高喊“我給了某某1個查克拉!”的時候,會附加上額外的一句話:“這1個查克拉的來源是記為001的那條記錄,我的這句話標記為002!”。我們再抽象一點,某人喊話的內容的格式就變成了:“這句話編號xxx,上一句話的編號是yyy,我給了某某1個查克拉!”,這樣就解決了偽造的問題。其實上述模型就變成一個簡化的中本聰第一版比特幣區塊鏈協議: 

這裡寫圖片描述 
圖4:查克拉模型和中本聰第一版區塊鏈協議對比圖

1.小本本記錄?——比特幣挖礦

你可能會問:“憑啥你喊一句話我就幫你記?我的小本本不要錢麼?”。為了激勵大家幫我傳話和記賬,我決定給第一個聽到我喊話並且記錄在小本本上的人一些獎勵:第一個聽到我喊話並記錄下來的人,你就憑空得到了1個查克拉,這個查克拉是整個系統對你幸苦記賬的報酬,而你記錄了這句話之後,要馬上告訴其它人你已經記錄好了,讓別人放棄繼續記錄這句話,並給你自己的記錄編號讓別人有據可查,然後你再把我的話加上你的記錄編號一起喊出來,供下一個人記賬。

2.聽誰的?——中本聰破解“拜占庭將軍問題”的演算法

在這個系統中,如果我和另一個人C幾乎同時地喊出一句:“為了艾澤拉斯!”。由於聽眾所處的位置不同,一定會有人先聽到我說的那句話,而另外一些人則先聽到C的那句話,如果我們規定只能有一個人說出這句話,那到底這句話是誰說的?

如果不加任何條件,那麼上述的情況一定會這樣發展:一部分人認為這句話是我說的,在聽到這句話之後開始記賬,之後他們所做的所有事情都是基於這個事實,並且隨著這個資訊一次次的傳下去,這條資訊鏈會越來越深;而另外一群認為是C先說這句話的人,也會按照這樣的趨勢發展。這樣,原本是一條唯一的資訊鏈,在我們喊出“為了艾澤拉斯”這句話之後,分叉了!? 

這裡寫圖片描述 
圖5:“區塊鏈”分叉

這會導致怎樣的情況呢?按照我們的設想,應該每個人的小本本上記錄的東西都是一樣的,都是一條可以把所有資訊串聯起來的鏈條。但是在這一刻,他們小本本上記錄的東西不一樣了!這還怎麼玩啊?以後還怎麼確定交易和資訊的真實性!?

3.新的規則——工作量證明鏈

為了解決這個問題,我又追加了新的規則:每個人在記錄小本本的時候,需要脫鞋然後用腳拿筆,在小本本上用正楷體書寫!有了這個規定,由於用腳寫字難度很大,每個人至少需要10分鐘才能寫完,而且由於每個人用腳寫字的熟練度不通,寫完這句話所用的時間也不同,因此一定會有人先寫完然後高呼“我寫完了!那句話是Ann喊的!”,這樣其它正在寫這句話的人便會停筆,然後在小本本上重新開始寫“那句話是Ann寫的,上一句的編號是xxx”。

4.脫鞋用腳寫字——比特幣挖礦的難度

5.脫鞋用腳寫字的速度——算力

---------------------------------------------------------------------------------------------------------------------------------