1. 程式人生 > >區塊鏈1之基本概念

區塊鏈1之基本概念

區塊鏈基本知識

下面,我就來嘗試,寫一篇最好懂的區塊鏈教程。畢竟它也不是很難的東西,核心概念非常簡單,幾句話就能說清楚。我希望讀完本文,你不僅可以理解區塊鏈,還會明白什麼是挖礦、為什麼挖礦越來越難等問題。

需要說明的是,我並非這方面的專家。雖然很早就關注,但是仔細地瞭解區塊鏈,還是從今年初開始。文中的錯誤和不準確的地方,歡迎大家指正。

一、區塊鏈的本質

區塊鏈是什麼?一句話,它是一種特殊的分散式資料庫。

首先,區塊鏈的主要作用是儲存資訊。任何需要儲存的資訊,都可以寫入區塊鏈,也可以從裡面讀取,所以它是資料庫。

其次,任何人都可以架設伺服器,加入區塊鏈網路,成為一個節點。區塊鏈的世界裡面,沒有中心節點,每個節點都是平等的,都儲存著整個資料庫。你可以向任何一個節點,寫入/讀取資料,因為所有節點最後都會同步,保證區塊鏈一致。

二、區塊鏈的最大特點

分散式資料庫並非新發明,市場上早有此類產品。但是,區塊鏈有一個革命性特點。

區塊鏈沒有管理員,它是徹底無中心的。其他的資料庫都有管理員,但是區塊鏈沒有。如果有人想對區塊鏈新增稽核,也實現不了,因為它的設計目標就是防止出現居於中心地位的管理當局。

正是因為無法管理,區塊鏈才能做到無法被控制。否則一旦大公司大集團控制了管理權,他們就會控制整個平臺,其他使用者就都必須聽命於他們了。

但是,沒有了管理員,人人都可以往裡面寫入資料,怎麼才能保證資料是可信的呢?被壞人改了怎麼辦?請接著往下讀,這就是區塊鏈奇妙的地方。

三、區塊

區塊鏈由一個個區塊(block)組成。區塊很像資料庫的記錄,每次寫入資料,就是建立一個區塊。

每個區塊包含兩個部分。

  • 區塊頭(Head):記錄當前區塊的特徵值
  • 區塊體(Body):實際資料

區塊頭包含了當前區塊的多項特徵值。

  • 生成時間
  • 實際資料(即區塊體)的雜湊
  • 上一個區塊的雜湊

這裡,你需要理解什麼叫雜湊(hash),這是理解區塊鏈必需的。

所謂”雜湊”就是計算機可以對任意內容,計算出一個長度相同的特徵值。區塊鏈的 雜湊長度是256位,這就是說,不管原始內容是什麼,最後都會計算出一個256位的二進位制數字。而且可以保證,只要原始內容不同,對應的雜湊一定是不同的。

舉例來說,字串123的雜湊是a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0

(十六進位制),轉成二進位制就是256位,而且只有123能得到這個雜湊。(理論上,其他字串也有可能得到這個雜湊,但是概率極低,可以近似認為不可能發生。)

因此,就有兩個重要的推論。

  • 推論1:每個區塊的雜湊都是不一樣的,可以通過雜湊標識區塊。
  • 推論2:如果區塊的內容變了,它的雜湊一定會改變。

四、 Hash 的不可修改性

區塊與雜湊是一一對應的,每個區塊的雜湊都是針對”區塊頭”(Head)計算的。也就是說,把區塊頭的各項特徵值,按照順序連線在一起,組成一個很長的字串,再對這個字串計算雜湊。

Hash = SHA256( 區塊頭 )

上面就是區塊雜湊的計算公式,SHA256是區塊鏈的雜湊演算法。注意,這個公式裡面只包含區塊頭,不包含區塊體,也就是說,雜湊由區塊頭唯一決定,

前面說過,區塊頭包含很多內容,其中有當前區塊體的雜湊,還有上一個區塊的雜湊。這意味著,如果當前區塊體的內容變了,或者上一個區塊的雜湊變了,一定會引起當前區塊的雜湊改變。

這一點對區塊鏈有重大意義。如果有人修改了一個區塊,該區塊的雜湊就變了。為了讓後面的區塊還能連到它(因為下一個區塊包含上一個區塊的雜湊),該人必須依次修改後面所有的區塊,否則被改掉的區塊就脫離區塊鏈了。由於後面要提到的原因,雜湊的計算很耗時,短時間內修改多個區塊幾乎不可能發生,除非有人掌握了全網51%以上的計算能力。

正是通過這種聯動機制,區塊鏈保證了自身的可靠性,資料一旦寫入,就無法被篡改。這就像歷史一樣,發生了就是發生了,從此再無法改變。

每個區塊都連著上一個區塊,這也是”區塊鏈”這個名字的由來。

五、採礦

由於必須保證節點之間的同步,所以新區塊的新增速度不能太快。試想一下,你剛剛同步了一個區塊,準備基於它生成下一個區塊,但這時別的節點又有新區塊生成,你不得不放棄做了一半的計算,再次去同步。因為每個區塊的後面,只能跟著一個區塊,你永遠只能在最新區塊的後面,生成下一個區塊。所以,你別無選擇,一聽到訊號,就必須立刻同步。

所以,區塊鏈的發明者中本聰(這是假名,真實身份至今未知)故意讓新增新區塊,變得很困難。他的設計是,平均每10分鐘,全網才能生成一個新區塊,一小時也就六個。

這種產出速度不是通過命令達成的,而是故意設定了海量的計算。也就是說,只有通過極其大量的計算,才能得到當前區塊的有效雜湊,從而把新區塊新增到區塊鏈。由於計算量太大,所以快不起來。

這個過程就叫做採礦(mining),因為計算有效雜湊的難度,好比在全世界的沙子裡面,找到一粒符合條件的沙子。計算雜湊的機器就叫做礦機,操作礦機的人就叫做礦工。

六、難度係數

讀到這裡,你可能會有一個疑問,人們都說採礦很難,可是採礦不就是用計算機算出一個雜湊嗎,這正是計算機的強項啊,怎麼會變得很難,遲遲算不出來呢?

原來不是任意一個雜湊都可以,只有滿足條件的雜湊才會被區塊連結受。這個條件特別苛刻,使得絕大部分雜湊都不滿足要求,必須重算。

原來,區塊頭包含一個難度係數(difficulty),這個值決定了計算雜湊的難度。舉例來說,第100000個區塊的難度係數是 14484.16236122。

區塊鏈協議規定,使用一個常量除以難度係數,可以得到目標值(target)。顯然,難度係數越大,目標值就越小。

雜湊的有效性跟目標值密切相關,只有小於目標值的雜湊才是有效的,否則雜湊無效,必須重算。由於目標值非常小,雜湊小於該值的機會極其渺茫,可能計算10億次,才算中一次。這就是採礦如此之慢的根本原因。

前面說過,當前區塊的雜湊由區塊頭唯一決定。如果要對同一個區塊反覆計算雜湊,就意味著,區塊頭必須不停地變化,否則不可能算出不一樣的雜湊。區塊頭裡面所有的特徵值都是固定的,為了讓區塊頭產生變化,中本聰故意增加了一個隨機項,叫做 Nonce。

Nonce 是一個隨機值,礦工的作用其實就是猜出 Nonce 的值,使得區塊頭的雜湊可以小於目標值,從而能夠寫入區塊鏈。Nonce 是非常難猜的,目前只能通過窮舉法一個個試錯。根據協議,Nonce 是一個32位的二進位制值,即最大可以到21.47億。第 100000 個區塊的 Nonce 值是274148111,可以理解成,礦工從0開始,一直計算了 2.74 億次,才得到了一個有效的 Nonce 值,使得算出的雜湊能夠滿足條件。

運氣好的話,也許一會就找到了 Nonce。運氣不好的話,可能算完了21.47億次,都沒有發現 Nonce,即當前區塊體不可能算出滿足條件的雜湊。這時,協議允許礦工改變區塊體,開始新的計算。

七、難度係數的動態調節

正如上一節所說,採礦具有隨機性,沒法保證正好十分鐘產出一個區塊,有時一分鐘就算出來了,有時幾個小時可能也沒結果。總體來看,隨著硬體裝置的提升,以及礦機的數量增長,計算速度一定會越來越快。

為了將產出速率恆定在十分鐘,中本聰還設計了難度係數的動態調節機制。他規定,難度係數每兩週(2016個區塊)調整一次。如果這兩週裡面,區塊的平均生成速度是9分鐘,就意味著比法定速度快了10%,因此接下來的難度係數就要調高10%;如果平均生成速度是11分鐘,就意味著比法定速度慢了10%,因此接下來的難度係數就要調低10%。

難度係數越調越高(目標值越來越小),導致了採礦越來越難。

八、區塊鏈的分叉

即使區塊鏈是可靠的,現在還有一個問題沒有解決:如果兩個人同時向區塊鏈寫入資料,也就是說,同時有兩個區塊加入,因為它們都連著前一個區塊,就形成了分叉。這時應該採納哪一個區塊呢?

現在的規則是,新節點總是採用最長的那條區塊鏈。如果區塊鏈有分叉,將看哪個分支在分叉點後面,先達到6個新區塊(稱為”六次確認”)。按照10分鐘一個區塊計算,一小時就可以確認。

由於新區塊的生成速度由計算能力決定,所以這條規則就是說,擁有大多數計算能力的那條分支,就是正宗的區塊鏈。

九、總結

區塊鏈作為無人管理的分散式資料庫,從2009年開始已經運行了8年,沒有出現大的問題。這證明它是可行的。

但是,為了保證資料的可靠性,區塊鏈也有自己的代價。一是效率,資料寫入區塊鏈,最少要等待十分鐘,所有節點都同步資料,則需要更多的時間;二是能耗,區塊的生成需要礦工進行無數無意義的計算,這是非常耗費能源的。

因此,區塊鏈的適用場景,其實非常有限。

  1. 不存在所有成員都信任的管理當局
  2. 寫入的資料不要求實時使用
  3. 挖礦的收益能夠彌補本身的成本

如果無法滿足上述的條件,那麼傳統的資料庫是更好的解決方案。

目前,區塊鏈最大的應用場景(可能也是唯一的應用場景),就是以比特幣為代表的加密貨幣。下一篇文章,我將會介紹比特幣的入門知識

關注部落格

相關推薦

區塊1基本概念

區塊鏈基本知識 下面,我就來嘗試,寫一篇最好懂的區塊鏈教程。畢竟它也不是很難的東西,核心概念非常簡單,幾句話就能說清楚。我希望讀完本文,你不僅可以理解區塊鏈,還會明白什麼是挖礦、為什麼挖礦越來越難等問題。 需要說明的是,我並非這方面的專家。雖然很早就關注

用go編寫區塊系列1---基本協議

本文將要用go語言實現一個最簡單的區塊鏈,更多內容請參考https://jeiwan.cc/posts/building-blockchain-in-go-part-1/。 1 區塊 區塊是區塊鏈組成單元,區塊鏈就是由一個一個區塊串聯而成。區塊鏈是一個不斷向後延伸的區塊的連結串列。這裡定義一

javascript基本概念講解1

1、嚴格區分大小寫 2、識別符號:第一個字母必須是字母、下劃線、$ ; 其他字元可以使字母、下劃線、$或數字;採用駝峰式(第一個字母小寫,其他單詞首字母大寫) 3、註釋同HTML 4、關鍵字和保留字 5、變數var a; 賦值 var a="b"; 像這樣初始化a後並不會把它標記

用go編寫區塊系列4--交易1

0 介紹 比特幣區塊鏈的核心就是交易,區塊鏈唯一的目的就是用一種安全可信的方式去儲存交易,交易一經建立就無法更改。這章中我們將在區塊鏈中引入交易。 1 比特幣中的交易 如果你是開發網路應用的程式設計師,若讓你開發一個線上支付交易,你多半會在資料庫中建立倆張表:賬戶表和交易表。賬戶表中將會

Atitit webservice道 艾提拉著 目錄 1. 基本說明Web Service 1 2. 基本概念與內部構成 2 2.1. Web services要使用兩種技術: XML SOAP

Atitit webservice之道 艾提拉著   目錄 1. 基本說明Web Service 1 2. 基本概念與內部構成 2 2.1. Web services要使用兩種技術: XML SOAP 2 2.2. WSDL  

數據結構與算法--基本概念

ant link 數據結構與算法 size 隨著 pan 提高 需要 bin 數據結構和算法各是指什麽?作用是什麽? 具體有哪些數據結構,又有哪些算法?   數據結構是數據在計算機內存或者外存中的組織方式,算法就是計算機操作數據結構中數據的方式方法,比如查找、排序。 很少有

區塊學習一基本知識

法律法規 現實社會 的人 blog 本質 驅動 延遲 方式 什麽是 一、什麽是區塊鏈 在符合現實社會法律法規前提下,可治理的,依賴於密碼學算法和博弈經濟性設計,基於共識算法,對發生在主體間的價值創造,價值轉移,價值交換,以及涉及到各個價值主體由機器驅動的業務流程,在多個對

BGP - 1基本概念

自己 黑洞 思科 也會 ext sel lsp 希望 不同 1,BGP知識點 a)AS號:私有(64512-65535),公有(0-64511)。 b)什麽時候使用BGP:有數據穿越本AS前往其他AS;本AS有多條到其他AS的連接;必須要做策略。 c)BGP路徑矢量特征

Linux LVM基本概念

Linux文件系統的簡單操作Logical Volume Mananger這個工具調用的系統內核是dm:device mapper,將一個或多個底層塊設備組織成一個邏輯設備的模塊。 LVM就像是面團,底層的磁盤組成巨大的面團,然後再把面團分成若幹個分區使用。這樣分區的大小就可以靈活擴展和收縮了。基本概念PV

數據庫 基本概念

osql 方案 can mongod 對象 light 成本 關系型數據庫 存取   一. 概述(了解)   二. 數據庫特點(了解)   三. 數據庫分類   四. MySQL介紹   五. 下載及安裝   六. 啥是SQL? 一.概述   數據庫(Database,簡稱

區塊技術密碼學技術數字證書

自己 對稱加密 key ast 機構 成對 -m 操作 之前 數字證書 數字證書用來證明某個公鑰是誰的,並且內容是正確的。 對於非對稱加密算法和數字簽名來說,很重要的一點就是公鑰的分發。一旦公鑰被人替換(典型的如中間人攻擊),則整個安全體系將被破壞掉。 怎麽確保一個公鑰確

Linux 任務計劃,周期性任務執行基本概念

Linux任務計算、周期性任務執行的簡單未來的某時間點執行一次某任務的命令有at、batch周期性運行某任務的命令是crontab這些命令的執行結果會通過郵件發送給用戶SMTP這個協議只能發送郵件POP3或者IMAP4才是將郵件從郵件服務器中取出的協議MUAMail User Agent 用戶收發郵件的工具程

Linux Shell編程基本概念

Linux Shell編程的簡單操作Shell編程其實就是以bash的為基礎,將多個命令組合起來的程序。嚴重註意$hostname與$(hostname)之間的區別$hostname是取hostname變量的值$(hostname)是取hostname命令的執行結果Shell的基本格式第一行:#!/bin/b

python3進階正則表達式基本概念

py3 例如 它的 字符串 限制 則表達式 tab 結束 描述 1.概念   正則表達式是一種用來匹配字符串的強有力的武器。它的設計思想是用一種描述性的語言來給字符串定義一個規則,凡是符合規則的字符串,我們就認為它“匹配”了,否則,該字符串就是不合法的。 2.示例應用

JVM基礎學習基本概念、可見性與同步

讀寫 應用 資源 而不是 檢查 依靠 完成 層次 並發 開發高性能並發應用不是一件容易的事情。這類應用的例子包括高性能Web服務器、遊戲服務器和搜索引擎爬蟲等。這樣的應用可能需要同時處理成千上萬個請求。對於這樣的應用,一般采用多線程或事件驅動的 架構 。對於Java來說,在

區塊技術的核心概念

區塊鏈 工作量證明 共識機制 比特幣 數字貨幣 區塊鏈的過去與未來 談到區塊鏈就不得不提一下密碼朋克(Cypherpunk): Tim May是密碼朋克(cypherpunk)組織的發起人,1992 年在他加州的家裏,發起了密碼朋克郵件列表組織。共同發起人包括 Eric Hughes 與

JavaScript高級程序設計學習(二)基本概念

參數調用 name btn 記得 mco 多說 body 運維 rstp 任何語言的核心都必然會描述這門語言基本的工作原理。而描述的內容通常都要涉及這門語 言的語法、操作符、數據類型、內置功能等用於構建復雜解決方案的基本概念。如前所述, ECMA-262通過叫做 ECMA

好膽你就來|來圓方圓,開啟你的區塊創業

圓方圓 圓方圓學院 圓方圓鏈圈 圓方圓成立於2017年9月,一直堅持聚集技術人才,成就技術人才的初心,經過一年發展,成為集區塊鏈技術培訓,書籍出版,技術研發,技術社群的綜合性技術生態圈。 旗下業務主要有兩大板塊培訓業務:圓方圓學院,區塊鏈技術名師合夥人。經過一年的發展,成為華南地區最知名的專業區塊

八大排序基本概念簡介

pan 快速排序 nbsp back 希爾 全部 直接插入排序 color 插入排序 分類 一、按照是否數據涉及內外存交換 1-內部排序:適用於記錄個數不是很多的小文件 2-外部排序:適用於記錄個數太多,不能一次將全部記錄放入內存的大文件 二、按照策略劃分內部排序方法

區塊技術的基本特點

歷史 而不是 核心 關聯 五個 com 透明 合作夥伴 分布式數據庫 區塊鏈技術近期大熱。 作為比特幣和其他虛擬貨幣底層核心技術,區塊鏈是一種開放的分布式分類帳本,可以有效地以可驗證和永久的方式記錄雙方之間的交易信息,而分類帳本身也可以被編程以自動觸發交易。小編帶您簡單了解