區塊鏈入門教程

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

區塊鏈(blockchain)是眼下的大熱門,新聞媒體大量報道,宣稱它將創造未來。

可是,簡單易懂的入門文章卻很少。區塊鏈到底是什么,有何特別之處,很少有解釋。

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

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

一、區塊鏈的本質

區塊鏈是什么?一句話,它是一種特殊的分布式數據庫。

首先,區塊鏈的主要作用是儲存信息。任何需要保存的信息,都可以寫入區塊鏈,也可以從里面讀取,所以它是數據庫。

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

二、區塊鏈的最大特點

分布式數據庫并非新發明,市場上早有此類產品。但是,區塊鏈有一個革命性特點。

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

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

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

三、區塊

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

每個區塊包含兩個部分。

  • 區塊頭(Head):記錄當前區塊的元信息
  • 區塊體(Body):實際數據

區塊頭包含了當前區塊的多項元信息。

  • 生成時間
  • 實際數據(即區塊體)的 Hash
  • 上一個區塊的 Hash
  • ...

這里,你需要理解什么叫?Hash,這是理解區塊鏈必需的。

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

舉例來說,字符串123的 Hash 是a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0(十六進制),轉成二進制就是256位,而且只有123能得到這個 Hash。

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

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

四、 Hash 的不可修改性

區塊與 Hash 是一一對應的,每個區塊的 Hash 都是針對"區塊頭"(Head)計算的。

Hash = SHA256(區塊頭)

上面就是區塊 Hash 的計算公式,Hash 由區塊頭唯一決定,SHA256是區塊鏈的 Hash 算法。

前面說過,區塊頭包含很多內容,其中有當前區塊體的 Hash(注意是"區塊體"的 Hash,而不是整個區塊),還有上一個區塊的 Hash。這意味著,如果當前區塊的內容變了,或者上一個區塊的 Hash 變了,一定會引起當前區塊的 Hash 改變。

這一點對區塊鏈有重大意義。如果有人修改了一個區塊,該區塊的 Hash 就變了。為了讓后面的區塊還能連到它,該人必須同時修改后面所有的區塊,否則被改掉的區塊就脫離區塊鏈了。由于后面要提到的原因,Hash 的計算很耗時,同時修改多個區塊幾乎不可能發生,除非有人掌握了全網51%以上的計算能力。

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

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

五、采礦

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

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

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

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

?

六、難度系數

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

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

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

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

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

區塊頭里面還有一個 Nonce 值,記錄了 Hash 重算的次數。第 100000 個區塊的 Nonce 值是274148111,即計算了 2.74 億次,才得到了一個有效的 Hash,該區塊才能加入區塊鏈。

七、難度系數的動態調節

就算采礦很難,但也沒法保證,正好十分鐘產出一個區塊,有時一分鐘就算出來了,有時幾個小時可能也沒結果。總體來看,隨著硬件設備的提升,以及礦機的數量增長,計算速度一定會越來越快。

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

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

八、區塊鏈的分叉

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

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

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

九、總結

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

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

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

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

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

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

十、參考鏈接

  • How does blockchain really work?, by Sean Han
  • Bitcoin mining the hard way: the algorithms, protocols, and bytes, by Ken Shirriff

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450457.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450457.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

響應式面包屑菜單

在線演示 本地下載 轉載于:https://www.cnblogs.com/qixidi/p/10064991.html

5個能提高你工作效率的Excel技巧

Excel的應用在工作中還是十分廣泛的,那么下面小編就來為大家分享5個Excel技巧來幫助大家輕松提高工作效率。1. 不用數據驗證或數據有效性,自動生成下拉列表方法:按【Alt↓】組合鍵注意點:光標要定位在已有數據區域的下一個單元格&…

很好的推薦書籍

五百本編程書籍推薦【信息化類】 書號書名作者出版時間定價對應頁碼TP02041企業資源計劃(ERP)教程羅鴻2006-1¥28.00—TP02031ERP理論、方法與實踐周玉清 等2005-12¥39.00—TP01059ERP原理設計實施(第3版)羅…

消息推送

我有一個運動類app軟件,它的服務器是集群式的,有N臺服務器。現在我想在app上開發一個功能,在每天的晚上11點進行消息推送,他會推送今天走多少步,是否健康,明天至少走多少步。請問如何11點能準時觸達到用戶?…

day10:函數進階

1,函數的命令空間(內置命名空間,全局命名空間,局部命名空間),內置大于全局大于局部 2,內置命名空間,就是Python解釋器一啟動就可以使用的名字,存儲在內置命名空間中&…

mysql導入source注意點

mysql的導入導出要注意字符集,防止查詢亂碼! 導入前設置字符集 set names utf8; //導入指定編碼source /xxx.sqlcommit;

嗶哩嗶哩修改視頻速度

按住f12,打開控制臺,先輸入 const video document.querySelector("video"); video.play() // 開始 video.pause() // 暫停 video.playbackRate3 // 三倍速

編譯預處理

C語言編譯中,什么時候應該使用32位編譯程序? 32位編譯程序應該在32位操作系統上使用。由32位編譯程序生成的32位程序比16位程序運行得更快,這正是任何32位的東西都很熱門的原因。有那么多不同版本的Microsoft Windows,它們和哪種編譯程序組成…

去除List集合中的重復值(四種好用的方法)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 最近項目中需要對list集合中的重復值進行處理,大部分是采用兩種方法,一種是用遍歷list集合判斷后賦給另一個list…

jQuery---過濾選擇器

4、過濾選擇器 過濾選擇器主要是通過特定的過濾規則來篩選出所需的DOM元素,過濾規則與CSS 中的偽類選擇器語法相同,即選擇器都以一個冒號(:)開頭。按照不同的過濾規則, 過濾選擇器可以分為基本過濾、內容過濾、可見性過濾、屬性過濾、子元素過…

安裝Frida抓包工具

curl https://bootstrap.pypa.io/get-pip.py | python3 pip install frida pip install frida-tools

正則介紹_grep

2019獨角獸企業重金招聘Python工程師標準>>> 10月16日任務 9.1 正則介紹_grep上 9.2 grep中 9.3 grep下 grep基本用法 grep [-cinvABC] word filename centos7.x版本的grep實則為grep --colorauto-c 顯示匹配到的行數[rootlocalhost ~]# cp /etc/passwd /tmp [rootl…

[國家集訓隊]middle

嘟嘟嘟 有誰能想到這題會用到主席樹呢?(不愧是WJMZBMR出的題) 首先考慮如果區間是固定的話,中位數該怎么求。 沒錯,二分。如果大于當前二分值\(mid\)的數比小于\(mid\)的數多,說明\(mid\)還可以再變大&…

Java List<Object>去掉重復對象-java8

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 public List<String> removeStringListDupli(List<String> stringList) {Set<String> set new LinkedHashSet<&g…

Vue + webpack 項目配置化、接口請求統一管理

準備工作 需求由來&#xff1a; 當項目越來越大的時候提高項目運行編譯速度、壓縮代碼體積、項目維護、bug修復......等等成為不得不考慮而且不得不做的問題。 又或者后面其他同事接手你的模塊&#xff0c;或者改你的bug時避免人家看的眼痛以及心里千百句mamaipi...問候。 并且…

Python實現Adaboost

1.Adaboost概念 提升方法的思路是綜合多個分類器&#xff0c;得到更準確的分類結果。 即“三個臭皮匠頂個諸葛亮”。《統計學習方法》稱AdaBoost是提升算法的代表&#xff0c;所謂提升算法&#xff0c;指的是一種常用的統計學習方法&#xff0c;應用廣泛且有效。在分類問題中&a…

Java List<T>去重方法,引用類型集合去重

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、實體類中要重寫比較方法equals&#xff0c;最好也重寫hashcode方法 public class WorkWeightDto implements Serializable {privat…

MyBatis知識點

一、MyBatis簡介 1.1 框架概念 框架&#xff0c;就是軟件的半成品&#xff0c;完成了軟件開發過程中的通用操作&#xff0c;程序員只需很少或者不用進行加工就能夠實現特定的功能&#xff0c;從而簡化開發人員在軟件開發中的步驟&#xff0c;提高開發效率。 1.2 常用框架 MVC…

android studio : clang++.exe: error: invalid linker name in argument '-fuse-ld=bfd

公司jenkins上的C編譯器最近換成了clang&#xff0c;今天更新了代碼發現本地的C/C代碼用NDK編譯不過了&#xff0c;提示&#xff1a; “clang.exe: error: invalid linker name in argument -fuse-ldbfd” 解決辦法&#xff1a; 將Android.mk文件中的“LOCAL_LDFLAGS -fuse-ld…

Git知識點

一、Git簡介 1.1 項目的版本管理 在項目開發過程中&#xff0c;項目沒開發到一個節點就會對當前項目進行備份&#xff0c;這個備份就是項目的一個版本&#xff1b;當我們繼續開發一個階段后&#xff0c;再次進行備份&#xff0c;就生成新的版本——多個版本的集合就是項目的版…