如果你是一位女性,在某年某月某日的某個晚上,你男票給你說了一句“我愛你一生一世”离熏,然后你的小助手征得你男票簽名同意后,把這句話做保密處理戴涝,并自動發(fā)給了你的閨蜜滋戳、爸媽朋友圈公眾號微信群等,你男票再也無法抵賴啥刻,你打賞點小費感謝他們給你記住并作證奸鸯,這個小費就是token,你可帽、你男票娄涩、“我愛你一生一世”這句話、說這句話的時間地點等信息映跟,打包起來形成一個結構化信息包蓄拣,這個信息包就叫“區(qū)塊”,而你的閨蜜努隙、爸媽球恤、朋友圈、公眾號和微信群等節(jié)點就是“鏈”荸镊,最后你男票不承認說過這句話咽斧、當了負心漢,你翻出這個賬本對質贷洲,把他臭罵一頓收厨,這就是區(qū)塊鏈應用晋柱。
以上是通俗易懂的區(qū)塊鏈概念舉例优构,更多信息請關注以太貓星球公眾號
下面請看專業(yè)解釋:
區(qū)塊鏈(blockchain)是眼下的大熱門,新聞媒體大量報道雁竞,宣稱它將創(chuàng)造未來钦椭。
可是,簡單易懂的入門文章卻很少碑诉。區(qū)塊鏈到底是什么彪腔,有何特別之處,很少有解釋进栽。
下面德挣,我就來嘗試,寫一篇最好懂的區(qū)塊鏈教程快毛。畢竟它也不是很難的東西格嗅,核心概念非常簡單番挺,幾句話就能說清楚。我希望讀完本文屯掖,你不僅可以理解區(qū)塊鏈玄柏,還會明白什么是挖礦、為什么挖礦越來越難等問題贴铜。
需要說明的是粪摘,我并非這方面的專家。雖然很早就關注绍坝,但是仔細地了解區(qū)塊鏈徘意,還是從今年初開始。文中的錯誤和不準確的地方轩褐,歡迎大家指正映砖。
一、區(qū)塊鏈的本質
區(qū)塊鏈是什么灾挨?一句話邑退,它是一種特殊的分布式數(shù)據(jù)庫。
首先劳澄,區(qū)塊鏈的主要作用是儲存信息地技。任何需要保存的信息,都可以寫入?yún)^(qū)塊鏈秒拔,也可以從里面讀取莫矗,所以它是數(shù)據(jù)庫。
其次砂缩,任何人都可以架設服務器作谚,加入?yún)^(qū)塊鏈網(wǎng)絡,成為一個節(jié)點庵芭。區(qū)塊鏈的世界里面妹懒,沒有中心節(jié)點,每個節(jié)點都是平等的双吆,都保存著整個數(shù)據(jù)庫眨唬。你可以向任何一個節(jié)點,寫入/讀取數(shù)據(jù)好乐,因為所有節(jié)點最后都會同步匾竿,保證區(qū)塊鏈一致。
二蔚万、區(qū)塊鏈的最大特點
分布式數(shù)據(jù)庫并非新發(fā)明岭妖,市場上早有此類產(chǎn)品髓迎。但是炕矮,區(qū)塊鏈有一個革命性特點笨奠。
區(qū)塊鏈沒有管理員瞻润,它是徹底無中心的。其他的數(shù)據(jù)庫都有管理員废离,但是區(qū)塊鏈沒有侄泽。如果有人想對區(qū)塊鏈添加審核,也實現(xiàn)不了蜻韭,因為它的設計目標就是防止出現(xiàn)居于中心地位的管理當局悼尾。
正是因為無法管理,區(qū)塊鏈才能做到無法被控制肖方。否則一旦大公司大集團控制了管理權闺魏,他們就會控制整個平臺,其他使用者就都必須聽命于他們了俯画。
但是析桥,沒有了管理員,人人都可以往里面寫入數(shù)據(jù)艰垂,怎么才能保證數(shù)據(jù)是可信的呢泡仗?被壞人改了怎么辦?請接著往下讀猜憎,這就是區(qū)塊鏈奇妙的地方娩怎。
三、區(qū)塊
區(qū)塊鏈由一個個區(qū)塊(block)組成胰柑。區(qū)塊很像數(shù)據(jù)庫的記錄截亦,每次寫入數(shù)據(jù),就是創(chuàng)建一個區(qū)塊柬讨。
每個區(qū)塊包含兩個部分崩瓤。
區(qū)塊頭(Head):記錄當前區(qū)塊的元信息
區(qū)塊體(Body):實際數(shù)據(jù)
區(qū)塊頭包含了當前區(qū)塊的多項元信息。
生成時間
實際數(shù)據(jù)(即區(qū)塊體)的 Hash
上一個區(qū)塊的 Hash
...
這里踩官,你需要理解什么叫 Hash却桶,這是理解區(qū)塊鏈必需的。
所謂 Hash 就是計算機可以對任意內容卖鲤,計算出一個長度相同的特征值肾扰。區(qū)塊鏈的 Hash 長度是256位畴嘶,這就是說蛋逾,不管原始內容是什么,最后都會計算出一個256位的二進制數(shù)字窗悯。而且可以保證区匣,只要原始內容不同,對應的 Hash 一定是不同的。
舉例來說亏钩,字符串123的 Hash 是 a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0(十六進制)莲绰,轉成二進制就是256位,而且只有123能得到這個 Hash姑丑。
因此蛤签,就有兩個重要的推論。
推論1:每個區(qū)塊的 Hash 都是不一樣的栅哀,可以通過 Hash 標識區(qū)塊震肮。
推論2:如果區(qū)塊的內容變了,它的 Hash 一定會改變留拾。
四戳晌、 Hash 的不可修改性
區(qū)塊與 Hash 是一一對應的,每個區(qū)塊的 Hash 都是針對"區(qū)塊頭"(Head)計算的痴柔。
Hash = SHA256(區(qū)塊頭)
上面就是區(qū)塊 Hash 的計算公式沦偎,Hash 由區(qū)塊頭唯一決定,SHA256是區(qū)塊鏈的 Hash 算法咳蔚。
前面說過豪嚎,區(qū)塊頭包含很多內容,其中有當前區(qū)塊體的 Hash谈火,還有上一個區(qū)塊的 Hash疙渣。這意味著,如果當前區(qū)塊的內容變了堆巧,或者上一個區(qū)塊的 Hash 變了妄荔,一定會引起當前區(qū)塊的 Hash 改變。
這一點對區(qū)塊鏈有重大意義谍肤。如果有人修改了一個區(qū)塊啦租,該區(qū)塊的 Hash 就變了。為了讓后面的區(qū)塊還能連到它荒揣,該人必須同時修改后面所有的區(qū)塊篷角,否則被改掉的區(qū)塊就脫離區(qū)塊鏈了。由于后面要提到的原因系任,Hash 的計算很耗時恳蹲,同時修改多個區(qū)塊幾乎不可能發(fā)生,除非有人掌握了全網(wǎng)51%以上的計算能力俩滥。
正是通過這種聯(lián)動機制嘉蕾,區(qū)塊鏈保證了自身的可靠性,數(shù)據(jù)一旦寫入霜旧,就無法被篡改错忱。這就像歷史一樣,發(fā)生了就是發(fā)生了,從此再無法改變以清。
每個區(qū)塊都連著上一個區(qū)塊儿普,這也是"區(qū)塊鏈"這個名字的由來。
五掷倔、采礦
由于必須保證節(jié)點之間的同步眉孩,所以新區(qū)塊的添加速度不能太快。試想一下勒葱,你剛剛同步了一個區(qū)塊勺像,準備基于它生成下一個區(qū)塊,但這時別的節(jié)點又有新區(qū)塊生成错森,你不得不放棄做了一半的計算吟宦,再次去同步。因為每個區(qū)塊的后面涩维,只能跟著一個區(qū)塊殃姓,你永遠只能在最新區(qū)塊的后面,生成下一個區(qū)塊瓦阐。所以蜗侈,你別無選擇,一聽到信號睡蟋,就必須立刻同步踏幻。
所以,區(qū)塊鏈的發(fā)明者中本聰(這是假名戳杀,真實身份至今未知)故意讓添加新區(qū)塊该面,變得很困難。他的設計是信卡,平均每10分鐘隔缀,全網(wǎng)才能生成一個新區(qū)塊,一小時也就六個傍菇。
這種產(chǎn)出速度不是通過命令達成的猾瘸,而是故意設置了海量的計算。也就是說丢习,只有通過極其大量的計算牵触,才能得到當前區(qū)塊的有效 Hash,從而把新區(qū)塊添加到區(qū)塊鏈咐低。由于計算量太大揽思,所以快不起來。
這個過程就叫做采礦(mining)渊鞋,因為計算有效 Hash 的難度绰更,好比在全世界的沙子里面瞧挤,找到一粒符合條件的沙子锡宋。計算 Hash 的機器就叫做礦機儡湾,操作礦機的人就叫做礦工。
六执俩、難度系數(shù)
讀到這里徐钠,你可能會有一個疑問,人們都說采礦很難役首,可是采礦不就是用計算機算出一個 Hash 嗎尝丐,這正是計算機的強項啊,怎么會變得很難衡奥,遲遲算不出來呢爹袁?
原來不是任意一個 Hash 都可以,只有滿足條件的 Hash 才會被區(qū)塊鏈接受矮固。這個條件特別苛刻失息,使得絕大部分 Hash 都不滿足要求,必須重算档址。
原來盹兢,區(qū)塊頭包含一個難度系數(shù)(difficulty),這個值決定了計算 Hash 的難度守伸。舉例來說绎秒,第100000個區(qū)塊的難度系數(shù)是 14484.16236122。
區(qū)塊鏈協(xié)議規(guī)定尼摹,使用一個常量除以難度系數(shù)见芹,可以得到目標值(target)。顯然蠢涝,難度系數(shù)越大辆童,目標值就越小。
Hash 的有效性跟目標值密切相關惠赫,只有小于目標值的 Hash 才是有效的把鉴,否則 Hash 無效,必須重算儿咱。由于目標值非常小庭砍,Hash 小于該值的機會極其渺茫,可能計算10億次混埠,才算中一次怠缸。這就是采礦如此之慢的根本原因。
區(qū)塊頭里面還有一個 Nonce 值钳宪,記錄了 Hash 重算的次數(shù)揭北。第 100000 個區(qū)塊的 Nonce 值是274148111扳炬,即計算了 2.74 億次,才得到了一個有效的 Hash搔体,該區(qū)塊才能加入?yún)^(qū)塊鏈恨樟。
七、難度系數(shù)的動態(tài)調節(jié)
就算采礦很難疚俱,但也沒法保證劝术,正好十分鐘產(chǎn)出一個區(qū)塊,有時一分鐘就算出來了呆奕,有時幾個小時可能也沒結果养晋。總體來看梁钾,隨著硬件設備的提升绳泉,以及礦機的數(shù)量增長,計算速度一定會越來越快姆泻。
為了將產(chǎn)出速率恒定在十分鐘零酪,中本聰還設計了難度系數(shù)的動態(tài)調節(jié)機制。他規(guī)定麦射,難度系數(shù)每兩周(2016個區(qū)塊)調整一次蛾娶。如果這兩周里面,區(qū)塊的平均生成速度是9分鐘潜秋,就意味著比法定速度快了10%蛔琅,因此難度系數(shù)就要調高10%;如果平均生成速度是11分鐘峻呛,就意味著比法定速度慢了10%罗售,因此難度系數(shù)就要調低10%。
難度系數(shù)越調越高(目標值越來越泄呈觥)寨躁,導致了采礦越來越難。
八牙勘、區(qū)塊鏈的分叉
即使區(qū)塊鏈是可靠的职恳,現(xiàn)在還有一個問題沒有解決:如果兩個人同時向區(qū)塊鏈寫入數(shù)據(jù),也就是說方面,同時有兩個區(qū)塊加入放钦,因為它們都連著前一個區(qū)塊,就形成了分叉恭金。這時應該采納哪一個區(qū)塊呢操禀?
現(xiàn)在的規(guī)則是,新節(jié)點總是采用最長的那條區(qū)塊鏈横腿。如果區(qū)塊鏈有分叉颓屑,將看哪個分支在分叉點后面斤寂,先達到6個新區(qū)塊(稱為"六次確認")。按照10分鐘一個區(qū)塊計算揪惦,一小時就可以確認遍搞。
由于新區(qū)塊的生成速度由計算能力決定,所以這條規(guī)則就是說丹擎,擁有大多數(shù)計算能力的那條分支尾抑,就是正宗的比特鏈歇父。
九蒂培、總結
區(qū)塊鏈作為無人管理的分布式數(shù)據(jù)庫,從2009年開始已經(jīng)運行了8年榜苫,沒有出現(xiàn)大的問題护戳。這證明它是可行的。
但是垂睬,為了保證數(shù)據(jù)的可靠性媳荒,區(qū)塊鏈也有自己的代價。一是效率驹饺,數(shù)據(jù)寫入?yún)^(qū)塊鏈钳枕,最少要等待十分鐘,所有節(jié)點都同步數(shù)據(jù)赏壹,則需要更多的時間鱼炒;二是能耗,區(qū)塊的生成需要礦工進行無數(shù)無意義的計算蝌借,這是非常耗費能源的昔瞧。
因此,區(qū)塊鏈的適用場景菩佑,其實非常有限自晰。
不存在所有成員都信任的管理當局
寫入的數(shù)據(jù)不要求實時使用
挖礦的收益能夠彌補本身的成本
如果無法滿足上述的條件,那么傳統(tǒng)的數(shù)據(jù)庫是更好的解決方案稍坯。