最近很火的區塊鏈

阿曌發表於2019-03-01

最近無論是在技術論壇,還是群分享會,都在熱火朝天地聊著區塊鏈,那麼今天我就自己的理解和大家分享一下什麼是區塊鏈。

不得不聊的比特幣

這裡寫圖片描述

之所以區塊鏈突然火起來,是因為比特幣在2017年年底突然暴漲,可以看到圖中從11月份開始到12月份的暴漲,加劇了人們對比特幣的認識,不過也因為投機的人多了,最近開始跌了。

可以點這裡看看它值多少錢。

比特幣其實就是一種流通於網路的虛擬貨幣。區塊鏈是比特幣的底層核心技術,因為對比特幣關注增加,間接導致人們對區塊鏈技術的興趣探索。

接下來我們還是先從比特幣源頭聊起。

從最原始的交易談起

問:如果兩個陌生人要進行遠距離交易,要怎麼保證信任?

答:通過第三方——比如某寶。

這裡寫圖片描述

買家轉賬給第三方,賣家發貨,然後第三方付款給賣家。

這種需要第三方參與的交易模式成為“中心化交易模式”。

目前大部分的交易都是中心化模式的,比如銀行轉賬,證券炒股,證明這種模式在現實世界確實是目前最優的解決方案,但是它也有缺點。

中心化交易模式的缺點

1.必須有個可靠的中心——如果中心不可靠,帶著錢跑了怎麼辦?

2.中心要獲取不必要的個人資訊來構建信任——中心和不認識的甲乙雙方也需要構建信任,這個信任就是你的個人資訊(身份證,手機號等)。(而且這一過程也是一種資源的浪費)

3.受中心的制約——你給別人轉帳,可能因為記帳機構放假而延遲幾天到帳,可能因為記帳機構要盈利而付高額手續費,可能因為記帳機構作弊或系統崩潰而受到損失。

那麼問題來了——

能否實現在不需要第三方的情況下完成交易呢?

有人就提出了一個新方案,中本聰在2008年11月1日發表了一篇論文《比特幣白皮書:一種點對點的電子現金系統》,提出了一種完全通過點對點技術實現的電子現金系統,它使得線上支付能夠直接由一方發起並支付給另外一方,中間不需要通過任何的金融機構。

這時候去中心化借貸模型就出現了。舉個例子——

這裡寫圖片描述

A借了B 100塊錢,這個時候,A在人群中大喊“我是A,我借給了B 100塊錢!”,B也在人群中大喊“我是B,A借給了我100塊錢!”,此時路人甲乙丙丁都聽到了這些訊息,因此所有人都在心中默默記下了“A借給了B100塊錢”。

這個時候一個去中心化的系統就建立起來了,這個系統中不需要銀行,也不需要借貸協議和收據,嚴格來說,甚至不需要人與人長久的信任關係(比如B突然又改口說“我不欠A錢!”,這個時候人民群眾就會站出來說“不對,我的小本本上記錄了你某天借了A100塊錢!”)。

在上述的模型中,所謂的“100塊錢”已經不重要了。換句話說,任何東西都可以在這個模型中交換,甚至你可以憑空杜撰一個東西,只要大家承認,你就可以讓你杜撰的東西流通。

這裡寫圖片描述

比如我在人群中高喊一聲“我創造了1w個騰訊幣!”,我甚至不需要知道騰訊幣是什麼,也不需要關心世界上是不是真的有騰訊幣,只要大家都聽到,然後在自己的小本本上記下“A有1w個騰訊幣”,於是我就真的有1w個騰訊幣了。

從此以後,我便可以聲稱我給了某人xxx個騰訊幣,只要路人甲乙丙丁都收到並且承認了這一資訊,那我就算完成了這次交易,哪怕世界上沒有騰訊幣。

沒錯,比特幣也是這麼來的。

甲乙丙丁就是網路上的其他結點地址。

AB君就是兩個結點地址,任意兩個結點發生交易都會廣播給所有結點。

甲乙丙丁:我憑啥給你們記賬???

你們可能會問:“憑啥你喊一句話我就幫你記?我不要面子的嗎”。為了激勵大家幫我傳話和記賬,我決定給第一個聽到我喊話並且記錄在小本本上的人一些獎勵:你就憑空得到了50騰訊幣,這個是整個系統對你幸苦記賬的報酬,而你記錄了這句話之後,要馬上告訴其它人你已經記錄好了,讓別人放棄繼續記錄這句話,並給你自己的記錄編號讓別人有據可查,然後你再把我的話加上你的記錄編號一起喊出來,供下一個人記賬。
當這個規則定下以後,這個系統中一定會出現一批人,他們開始豎著耳朵監聽周圍發出的聲音,以搶佔第一個記賬的權利。

這個就是比特幣去中心化的運作機制,當全網任意結點發生交易時,都會有其他結點幫忙記賬。

爭取第一個記賬並獲得獎勵的行為稱為“挖礦”

  • 一般十分鐘可以挖出一個區塊,這個區塊是1M容量大小,用來記著十分鐘裡的所有交易(如果沒記下來的就延後)
  • 最開始挖礦獎勵50個
  • 每產生21萬個區塊(大約每四年)挖礦獎勵減半一次
  • 按上述規則計算,幣總量不超過2100萬個,預計2140年挖完(這也是比特幣保值的原因,不會有通貨膨脹的問題)
  • 最近一次減半在2016年7月9日,2017年流通的有1600萬+
  • 用於挖礦的裝置稱為“礦機”,運作的人稱為“礦工”

誰都可以說“我”有一萬個騰訊幣咯?

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

這裡寫圖片描述

為了防止這種現象發生,我決定在我創造騰訊幣的時候給我喊的那句“我創造了1W個騰訊幣”打上標記,比如標記為001),這樣以後在每一筆交易的時候,我在高喊“我給了某某1個騰訊幣!”的時候,會附加上額外的一句話:“這1個騰訊幣的來源是記為001的那條記錄,我的這句話標記為002!”。我們再抽象一點,某人喊話的內容的格式就變成了:“這句話編號xxx,上一句話的編號是yyy,我給了某某1個騰訊幣!”,這樣就解決了偽造的問題。

這裡寫圖片描述

其實上述模型就變成一個簡化的中本聰第一版比特幣區塊鏈協議。

比特幣的誕生

2009年1月3日,中本聰創造了第一個區塊——創世區塊,裡面有50比特幣。並附帶了一句話:

“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks”,這一句話是當天泰晤士報的頭版文章標題,確認了比特幣的誕生時間。

這裡寫圖片描述

甲乙丙丁:第一個由誰記帳誰說了算?

那你們又要問了,大家都說自己是第一個記賬的怎麼辦?

於是一種新的規則——共識演算法產生了。

列舉兩種方法:

工作量證明:我規定,只有做對一套五年模擬、三年高考試卷的第一名,才有權利記賬。

工作量證明機制是算出答案很困難,但是檢驗答案很容易的一種機制。

比特幣使用的是工作量證明,讓每個想要挖礦的計算機結點先去做一道有難度的計算題,先算出來的有權利記賬。計算難度大概使得需要花費10分鐘才能算出來。這就是為什麼前面說每10分鐘挖出一個區塊。

但是工作量證明的毛病是帶來不必要的消耗,因為只有一個人是第一名,其他人完成的工作量都是徒勞的。

因此有人提出了權益證明:

權益證明:我規定,持有騰訊幣最多且持有天數最多的人,才有權利記賬。

這個也有問題,就是強者越強的問題。

工作量證明(Proof-of-Work)

挖礦的人需要求出一個隨機值,使得:SHA256( 隨機值 + H( 區塊頭 ) ) < 某目標值

這裡寫圖片描述

系統每產生 2,016 個區塊,會動態調整目標值(難度),使得每產生一個區塊需要約十分鐘。

難度值公式可以想象成:

新難度值 = 舊難度值 * ( 20160 分鐘 / 過去2016個區塊花費時長 )


目標值的計算公式可以想象成:

1.目標值 = 最大目標值 / 難度值

2.其中最大目標值為一個恆定值:
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

目標值可以想象成:
0x00000000000000000000000000000000000000000000000017268d8a21a

難度的調整是在每個完整節點中獨立自動發生的。每2016個區塊,所有節點都會按統一的公式自動調整難度,這個公式是由最新2016個區塊的花費時長與期望時長(期望時長為20160分鐘即兩週,是按每10分鐘一個區塊的產生速率計算出的總時長)比較得出的,根據實際時長與期望時長的比值,進行相應調整(或變難或變易)。也就是說,如果區塊產生的速率比10分鐘快則增加難度,比10分鐘慢則降低難度。

我們也可以簡單理解成,比特幣工作量證明的過程,就是通過不停的變換區塊頭(即嘗試不同的nouce值)作為輸入進行SHA256雜湊運算,找出一個特定格式雜湊值的過程(即要求有一定數量的前導0)。而要求的前導0的個數越多,代表難度越大。

區塊頭部結構

這裡寫圖片描述

區塊頭裡麵包含了版本號,父塊的雜湊值,還有Merkle根,還有時間戳,還有難度值,還有nonce(number once,只有一次的數字,密碼學專用名詞)……

等等,Merkle根是什麼??

Merkle(默克爾樹 or 梅克爾根)

這裡寫圖片描述

Merkle是一種二叉樹,在每個區塊中有若干交易,將每個交易做一次Hash0,然後每兩個交易的Hash0再合併Hash1,再把兩個合併的Hash1再合併Hash2……用上圖舉例,就是交易1和2各自雜湊後再合併雜湊變成Hash12,再和Hash34合併雜湊變成Hash1234,再和Hash5678合併雜湊變成Hash1-8……

特點:

  1. 快速比較大量資料:當兩個默克爾樹根相同時,則意味著所代表的資料必然相同。

  2. 快速定位修改:例如上例中,如果 N4 中資料被修改,會影響到 N34,N1234 和 Root。因此,沿著 Root —>N1234 —>N34,可以快速定位到發生改變的 D1;

  3. 零知識證明:例如如何證明某個資料(H1-8)中包括給定內容 交易6,很簡單,構造一個默克爾樹,公佈 H1-8,H5678,H56,H6,交易6 擁有者可以很容易檢測 交易6 存在,但不知道其它內容。

算力

我們最開始說了比特幣這麼值錢,而且誰都可以去挖礦,那我們是不是現在就可以回家挖礦了呢?

理論上是的,實際上,要考慮計算機的算力(計算能力),前面我們也說了挖礦的難度很大……淘寶搜一下挖礦機,你看到的會是這樣的。

1T算力 = 1秒鐘內進行1012次數的運算

但是確實有人不幹別的,就挖礦,有的公司僱人專門維護這些礦機的正常執行。這些礦機的電力消耗可能就要幾十萬。

分叉問題

「中國上海浦東新區張衡路」上的節點和「美國紐約曼哈頓第五大道」上的節點異口同聲喊出來:“我挖到區塊了!裡面的交易都是有效的!獎勵歸我!”。其他節點也幾乎同時參與了對這兩個區塊的校驗,結果發現這倆都沒毛病。

這裡寫圖片描述

這已經嚴重違背了區塊鏈世界裡第一大最基本原則——所有節點共同維護同一份資料。所以,為了解決這個問題,區塊鏈世界引入了一條新的規則——

擁有最多區塊的支鏈將被認可,較短的支鏈將會被直接棄掉。

我們大夥都知道挖礦的過程存在巨大的工作量,並且在計算機的矽基世界裡,不可能出現所謂 “同時” 的概念,哪怕納秒的差別,那也總是會有先後順序。所以理論上,“分叉”的這種僵局很快會在下一個區塊被挖掘出來(以及校驗區塊)的時候被打破,實在不行下下個,或者下下下個……總之機制可以讓整個分叉的區塊鏈世界迅速穩定下來。

這裡寫圖片描述

另外,同一時間,較短分支上的區塊會立即丟棄,而裡面的交易也會隨之釋放出來,被重新標記上“未確認”。

雙花問題和51%攻擊

從前,有一個很有錢也很聰明的人——X-Man,他說:“

我是X-Man,我很有錢,擁有一個強大算力的計算機群。

我先從某個區塊創造了一條獨立的含有多個區塊的鏈條,然後裡面記錄著我轉給自己1000個比特幣。

這條獨立的區塊鏈先不廣播給全網。然後我找到張三,給了他1000比特幣買他1000萬人民幣,

當這筆交易被三次確認後(三個區塊被挖出),張三給了我1000萬。

這個時候我再把我獨立的區塊鏈條廣播出去,我的鏈變成了最長鏈,我和張三的交易就被棄掉了,但是我卻拿到了他的1000萬。”

這裡寫圖片描述

這個就是雙花問題——即利用系統漏洞來使得貨幣重複花費。

X-Man的想法確實可行,但是他的計算機群要對抗的是全世界的計算機,除非 X-Man 擁有全網 51% 的算力,否則構想不可能實現。這就是51%攻擊,擁有51%算力已經是不太可能的事情了。

但即便 X-Man 真擁有全網 51% 的算力,在真實世界中,用這 51% 算力做其他事(比如挖礦或者其他算力服務)都比攻擊比特幣系統划算。

說了那麼多,區塊鏈到底是什麼?

區塊鏈(Blockchain)是一種防篡改、共享的、可追溯的分散式賬本資料庫技術

防篡改:單點的修改,必須通過其他多個節點共識認可後,才能成功
可追溯:區塊鏈賬本,只允許寫入,不允許刪除
共享:賬本對參與節點透明

這裡寫圖片描述

為什麼叫“區塊鏈”?

比特幣網路裡,每十分鐘誕生一個新的區塊,區塊裡打包了網路裡最近十分鐘內產生的交易。某一個礦工做Hash運算獲得這個區塊的記錄權,同步到其他礦工節點去。

每個區塊都新增在上一個區塊的後面,形成一條長鏈條,所以稱為“區塊鏈”。

這裡寫圖片描述

區塊鏈的技術分類

公有鏈: 1、無官方組織及管理機構維護 2、所有節點許可權一致 3、自由加入和退出

典型應用:比特幣、以太坊

(公有鏈有它的價值,但是太極端了,於是產生了稍微弱中心化一點的聯盟鏈。)

聯盟鏈: 1、由若干機構聯合進行發起和維護 2、節點許可權通常是混合型 3、通過授權加入和退出

典型應用:騰訊區塊鏈(trustSQL)

區塊鏈應用價值舉例——公益尋人

公益尋人平臺眾多,就鵝廠都不止如下:

這裡寫圖片描述

存在的問題:

同步不及時
重複報案 & 多方撤案
解決方案:使用區塊鏈讓大家共用一個鏈條,資訊同步快,一方報案,多方廣播。

這裡寫圖片描述

區塊鏈遊戲價值舉例——以太坊擼貓

這裡寫圖片描述

最近在幣圈,有一款擼貓的遊戲在網路也很火(我們之所以沒有感覺到是因為這是個土豪的遊戲,我們玩不起)。

如何開始玩:玩家用ETH作為“貨幣”來買賣貓,先去市場上買一隻貓。先挑便宜的買,買貓需要手續費(為了防止以太坊區塊鏈擁堵)。

這裡寫圖片描述

買了兩隻後:就可以讓它倆生小貓。每隻貓都有256個屬性,控制著毛色、花紋、鬍鬚、牙齒等等,可以理解成256種不同的基因。兩隻貓繁殖的時候,基因以一定的概率遺傳。基因也會突變,如果遇到基因突變,就會生出奇形怪狀的小貓。

這裡寫圖片描述

這些小貓由於基因突變,往往能賣出高價。

每次生完小貓後,父母就會進入Cooldown模式,必須“恢復”一段時間才能繼續繁殖小貓。每隻貓恢復的時間有長有短,而且越生得多恢復的時間就越長。恢復時間長短也是影響貓價的一個因素。

如果只有一隻貓,想跟別人的貓配種,也可以到市場上看看。玩家1可以標一個“配種價”,玩家2如果想配種,需要支付給玩家1這個價格,生下來的貓歸玩家2所有。基因優秀的貓可以在配種市場上標個高價。

配種成功後,生育也需要一段時間(幾個小時不等)。小貓出生後,就可以在My Kitties頁面看到新出生的小貓。

每隻貓都有Gen標識,Gen 0表示這是創世貓,Gen 1是第一代,Gen 2是第二代,以此類推。每隔大約15分鐘,會產生一隻Gen 0的創世貓,並通過合約自動拍賣,拍賣所得進入開發商的錢包。

區塊鏈擼貓和雲擼貓有啥區別?

最大的區別是,遊戲規則確立後,你的貓永遠是你的貓,開發商無權也無法剝奪任何人的貓。而云擼貓是一箇中心化的遊戲,所有的貓都登記在開發商的資料庫中,開發商可以隨時篡改、剝奪任何人的貓,開發商也可以任意給自己建立高價貓。想想看,線上遊戲中的道具不過就是開發商自己建立並拿來出售的數字資產,沒有任何方式可以保證開發商不作弊。


Refrences:

《區塊鏈是什麼,如何簡單易懂地介紹區塊鏈?》- 知乎

《區塊鏈(Blockchain)和比特幣(Bitcoin)是什麼關係?》- 知乎

《比特幣》-維基百科

《分散式一致性與共識演算法》

《揭祕比特幣和區塊鏈(一):什麼是區塊鏈?》- InfoQ

《深度解讀區塊鏈擼貓》- 廖雪峰

《工作量證明 | Proof Of Work》- 《 Bitcoin Developer Guide》中文版

相關文章