"分久必合,合久必分"數據庫
區塊鏈(block chain)狹義來說,區塊鏈是一種按照時間順序將數據區塊以順序相連的方式組合成的一種鏈式數據結構。廣義來說是用分佈式數據庫識別、傳播和記載信息的智能化對等網絡, 也稱爲價值互聯網。bash
區塊鏈的核心價值在於去中心化
,這也是區塊鏈技術最根本最重要的性質。 互聯網從設計初始其實就是去中心化的,網絡架構的原始設計中並無中心服務器的概念,MAC地址、ip路由、傳輸層報文等等對於每一個網絡節點都是對等的,每一個人均可以以相同的權益瀏覽和共享文件。然而如今,咱們的互聯網能夠說是重度中心化,絕大多數的信息來源都依賴於各大公司的服務器。某個爆款話題的出現、局部天氣緣由致使的傳輸故障都會致使服務器出現問題。服務器一旦掛掉,就會影響不少的用戶,這也是中心化顯而易見的弊端。服務器
而去中心化帶來的好處就是沒有權利中心,節點之間是對等的,每一個節點都享有相等的權益,沒有欺騙,公平公正公開。那麼運做在這樣一個性質的系統就可能受到更多人的青睞。網絡
然而這只是理想狀況,由於網絡自己的性質就是不可信的,存在着信息盜取、惡意篡改等問題。如何解決在去中心化不可靠的網絡上保持各節點信息同步,而且不可篡改,使各節點按照相同的規則維持系統的良好運轉的問題,比特幣這一應用帶來了開創性的解決方案。數據結構
若是對於不瞭解區塊鏈的人來講,比特幣的名氣彷佛要大一些,畢竟你們都見證了幣圈的瘋狂。事實上,比特幣和區塊鏈的概念同時誕生與2008年,隨着一位化名爲中本聰的人(也有消息說是團隊)在比特幣白皮書:一種點對點的電子現金系統中提出。區塊鏈是比特幣應用的底層技術,比特幣是基於區塊鏈技術的加密數字貨幣。接下來用不涉及技術(技術實現可能和直觀認知有出入)的角度說明一下比特幣大體的工做形態。架構
相信每一個人都不一樣程度上的記過帳,多是以下形式:併發
- 買火車票 300元
- 和朋友看電影 40元
- 買幾個橘子😏 10元
相似這樣的記帳方式稱爲單式記帳,只記錄了單方面的資金流向,平時咱們記帳用這種形式就夠了,形式不會有太大變化。由於對咱們我的來講,並不須要關心資金流向了哪裏,只須要知道本身剁了多少手╮(╯_╰)╭。electron
而對於一種貨幣系統來講,就要從整個系統角度來出發,當產生一筆資金流的時候,一定會有輸入和輸出,拿買橘子爲例,我的的帳戶裏能夠記錄減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%攻擊。
假如又有人想參與進來怎麼作?
直接參與便可,假如沒有金幣,就能夠求解問題發佈結果賺取金幣;也能夠私下交易讓其餘人先轉帳給他。新加入的人不影響整個遊戲的運做。
讓咱們把剛纔的遊戲和比特幣對應上:
這樣就相對好理解了。
每個運行着完整比特幣客戶端的都是一個比特幣節點,節點能夠產生交易、傳播交易、進行挖礦來賺取比特幣。它們不須要信任彼此,只要它們保持着相同的共識規則,整個系統能夠良好的抵禦惡意節點的攻擊。
隨着比特幣的第一個創始區塊的誕生,整個比特幣系統也隨之開始運轉。比特幣規定剛開始時的貨幣發行量是每一個區塊50個比特幣,以後大約每4年減半,如今(2018)已是每一個區塊產生12.5個比特幣了,所以貨幣的總髮行量是必定的,大約2100萬個比特幣。
每個新區塊在網絡上被髮出,節點驗證後就會把此區塊連接到本身所保存的區塊鏈上,沒有中心服務器,沒有權威機構,每一個節點都擁有相同的權利,同時區塊鏈也具備不可更改的特性。
挖礦的行爲其實就是使得哈希運算的結果小於特定值,只能反覆的計算,沒有任何捷徑。每個節點都力求爭取這份"礦工費"。
區塊鏈分叉分爲硬分叉和軟分叉兩種,硬分叉指的是主鏈和側鏈的共識機制不一樣,分別延伸兩條鏈,永遠分歧下去,這是硬分叉。硬分叉形成的後果是使得每條鏈的算力降低,形成對系統的負面影響。而軟分叉指的是暫時分叉,以後會側鏈從新會合併到主鏈上來,通常用於比特幣系統的版本升級,畢竟這是一個去中心化的系統,不能強制每一個節點都升級,同時還要保證系統的良好運做,兼容舊版本,因此說"共識"軟件的開發也是一門學問。
至此從非技術角度已經把比特幣的運做原理描述的差很少了,從技術角度出發能夠拓展不少東西,好比爲何系統能抵禦惡意節點的攻擊?爲何它能在不信任的網絡上運轉?挖礦究竟是求解什麼問題?每一個節點是怎麼鏈接起來的?如何證實金幣是我本人而不是僞造的?(事實上在比特幣系統中中沒有餘額這個概念)這些往後我會從技術角度說明一下,算是本身對區塊鏈的總結。
最後可能會問:爲啥這個數字貨幣這麼值錢? emmmmmmm.... 爲何一張紙作成了鈔票之後就是錢了呢?由於人們相信它有那個價值呀。