日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

弄明白HASH,你就弄明白区块链的一大半

發布時間:2024/3/13 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 弄明白HASH,你就弄明白区块链的一大半 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

“人類歷史上第一次,全世界各地的人,花費巨額的成本,爭前恐后地尋找美學意義上的數學運算結果。”

—衛sir

Beeple加密藝術作品《區塊鏈》

說起區塊鏈,似乎大家都懂一點,再往細里一問,似乎又都不懂了。

比如,你問一個人:為什么要挖礦,挖的到底是啥。

怕是沒幾個明白人。

本文就是要給你講明白!

前言

人們一說起區塊鏈,就常常說防篡改防篡改,那么,這個防篡改是怎么做到的呢。

主要靠HASH。

人們所常說的挖礦,其實是在挖HASH。

挖一個長得很好看的HASH。

但,什么是HASH?

外行人是說不清的,內行人,似乎也很少能給外行人講明白。

很多人喜歡用比喻的方式給外行人講HASH,其實,你就是弄100個比喻(什么麻將、撲克、骰子啥的),不懂HASH的人還不懂。

他們中比較傻白甜的,甚至會想,挖礦是在挖麻將嗎?

真正想弄明白HASH,就讓他看看HASH長什么樣子唄!!

HASH到底是個啥

HASH是一個算法,你給它一串數,它給你一串數。

你給它的叫輸入,它給你的叫輸出。

也就是說,將數據輸入給HASH函數,HASH函數輸出一串數。

HASH( 輸入 )= 輸出

這就好比你把一頭豬輸入給一個香腸機,香腸機給你輸出一段香腸。

看個例子吧,我們以最常見的HASH算法MD5為例。(當然,有很多種HASH算法,MD5是其中最知名的一個。)

MD5 ("weijianfan") = c49262b1117b9fd1d6ebd74aaa016f3e

上面這個例子中,“weijianfan”是輸入,后面那串數是輸出。

再如:

MD5 ("weiyuerenhua") = a799c7c504a1a80f95ebe69a86c42637

注意,HASH函數有個重要的特點,不管輸入多長,輸出都是固定長度的。

當然,和一般的算法一樣,只要輸入不變,輸出是不變的。

比如MD5,輸入是不限制長度的,輸出就是128位的二進制,也就是16個字節的十六進制。像上面第一個例子里,c4就是一個字節,代表了8位的二進制,即11000100,最后那個3e也是一個字節,也即00111110

我們把輸入搞長點:

MD5 ("In Math We Trust.") = 767fa54f12bab6b71fb411f265814bb7

把漢字作為輸入:

MD5 ("博鰲亞洲論壇2021年年會數字支付與數字貨幣分論壇4月18日晚舉行。") = 36b5e89c797d22d14ccefe4ec79f56c2

再搞長點:

MD5 ("Andreas M. Antonopoulos is a noted technologist and serial entrepreneur who has become one of the most well-known and well-respected figures in bitcoin. An engaging public speaker, teacher, and writer, Andreas makes complex subjects accessible and easy to understand. Andreas advises multiple technology startups and speaks regularly at conferences and community events around the world.") = 5ac503b01e213d4794d92134096ad313

長一點的漢字:

MD5 ( "Andreas M. Antonopoulos 是?位著名的技術學家和連續創業企業家,?特幣界最著名和倍受尊敬的?物之?。?為?名迷 ?的公共演說家、教師和作家,他善于把復雜的問題變得簡單?易于理解。作為?名顧問,他則幫助初創者認知、評估并指 引減?安全和業務風險。") = 90f039293e0b3da5516e251b93434795

HASH還有一個特點,只要輸入有一點點的變化,輸出都會完全不同,就好像輸入是完全不同的。

比如把上面這段文字中“一位”里的“一”字刪掉,再做HASH:

MD5 ("Andreas M. Antonopoulos 是位著名的技術學家和連續創業企業家,?特幣界最著名和倍受尊敬的?物之?。?為?名迷 ?的公共演說家、教師和作家,他善于把復雜的問題變得簡單?易于理解。作為?名顧問,他則幫助初創者認知、評估并指 引減?安全和業務?險。") = 159c9d192e45fbd2eaa0c3f068a78508

看到了吧,輸入有微小的變化,輸出會完全不同。

HSAH對輸入是不挑的,不管是字符串,還是文件,不管是文本、圖像、視頻,只要是數字的,都當作二進制輸入就是了。

比如,把下面這幅圖像給MD5,可以得到:

MD5 (Emily Blunt.jpg) = b818d284ef28f733c701f7bc1ee5f669

圖|艾米莉布朗特,英國最受歡迎的女演員

如果你的電腦上有md5工具,你就可以試試自己做HASH,比如在mac電腦里,在“終端”中輸入md5 -s "xxx",或者md5 1.txt就可以對字符串或者文件進行md5。

若干G的視頻文件也沒問題:

MD5 (偉大的轉折-01.mp4) = 9093c85d13f79609978f52c48e19aa65

圖|38集革命歷史劇《偉大的轉折》,遵義會議會址

你哪怕是改動了這個視頻中任何一幀的任何一個像素,MD5算出來的結果都截然不同。

所以,判斷一個文件是不是被人改動過,算一下HASH就行,HASH只要沒變,文件就沒有被動過。(前提是這個HASH算法還不錯!)

現在你對HASH大概有點印象了吧,反正只要是數字的輸入,都能給你整出一段固定長度的輸出,而且個個都不一樣。

啥是好看的HASH

答:好看的HASH就是前面有很多位0的HASH。—衛sir

HASH輸出是比較均勻分布的,基本上,你對任意16個不同的輸入做HASH,第1位是0的概率是1/2(大概有8個),前兩位是0的概率是1/4,前3位是0的概率是1/8,前4位都是0的概率為1/16。

我們做個實驗看看對不對,以下的輸入都是隨意給的:

1、MD5 ("ionnoouyd") = c78a3b60314d11fc9e739aef407989f5 2、MD5 ("njjiuhbh") = 9aee0690f6002392b2c6fc0d2224adb2 3、MD5 ("88990933") = b19bf0928fc649d99b1cdf02748ae88e 4、MD5 ("-sr&&fvbgt") = 24cc429a2636ac1b9092cf3f681bba09 5、MD5 ("區塊鏈技術") = 649e6048a32c09299e1c952347ccac7e 6、MD5 ("hashcash is very good") = 8015b497b3a9bd6ca7ba1213a731b1a1 7、MD5 ("CC0-MIT") = cd08de7f0f219d8e13437c65974f9773 8、MD5 ("beihaimuchang") = 7cd9a24efce05bbceb01c9020d904294 9、MD5 ("wqqwrr2") = 1cb1797fb57add01523fbd6e86ca2b73 10、MD5 ("1123ed") = ae49266f10e08922780afeb664fd61dc 11、MD5 ("hello world") = 5eb63bbbe01eeed093cb22bb8f5acdc3 12、MD5 ("niahoa...") = 5d3e60365ff999e68a932da4619a129b 13、MD5 ("blockchain") = 5510a843bc1b7acb9507a5f71de51b98 14、MD5 ("隨機發均出版后我給") = 18eb95457ec90f1c33fa5914579730d7 15、MD5 ("93002712") = 0abf0bd1dbb35366c56b26d157686f0f 16、MD5 ("13811031123") = 940ca3847eec1e99e716975bc7096c8d

前面說過,MD5輸出是128位的,上面是用16進制展示的,比如第一個輸出的第1字節是“c7”,第二個輸出的第1字節是“9a”,用2進制表示就是“11000111”、“10011010”。依此方法,上面16個HASH輸出也就是(省略號代表省略了后面的位):

HASH01 c7………:11000111…………………… HASH02 9a………:10011010…………………… HASH03 b1………:10110001…………………… HASH04 24………:00100100…………………… HASH05 64………:01100100…………………… HASH06 80………:10000000…………………… HASH07 cd………:11001101…………………… HASH08 7c………:01111100…………………… HASH09 1c………:00011100…………………… HASH10 ae………:10101110…………………… HASH11 5e………:01011110…………………… HASH12 5d………:01011101…………………… HASH13 55………:01010101…………………… HASH14 18………:00011000…………………… HASH15 0a………:00001010…………………… HASH16 94………:10010100……………………

你們可以數數,前1位、前2位、前3位、前4位是0的HASH個數,是不是和上面說的概率差不多?

當然,我最喜歡的是那個前4位都是0的,HASH15,它在這16位里面是長得最好看的。

它出現的概率大概就是每16個HASH里面出一個。也就是2^4次出一個。

那么,多少次才會出來一個前20位都是0的HASH呢。

2^20次。

2^20就是2的20次方,就是1,048,576這么多啦!一百萬還多啦!所以想在你的電腦上找到它,得算一會呢~

前20位是0,就是16進制前5個數為0,大概就是下面這個樣子

00000fc7f1d91e9053995f707a90971d

是不是很好看?

至少比前面出現過的都好看。

當然還不是最最好看的,全宇宙舉世無雙好看的那個HASH,是全0。

這個全0的HASH,應該還從來沒有被算出來過,不知道人類滅亡前能否靠運氣找出來。

總之,我說的好看,就是前面有很多個0。

0越多,越好看。

好的HASH算法有什么特點?

注意HASH算法有很多,比如MD5、SHA-1、SHA-2等,再如BTC用的SHA-256和RIPEMD-160等。

至少有這么兩個特點:

1、對于任意兩個不同的輸入,應該產生不同的輸出。(這叫抗碰撞)

2、正向計算很容易,反過來從輸出倒推輸入,就非常難,只能靠暴力猜。(這叫不可逆)

先看第一個特點:抗碰撞

一個好的HASH算法,對于任意兩個不同的輸入,應該產生不同的輸出。

事實證明,MD5、SHA-1不能算很好的HASH算法,因為王小云院士等人,已經可以找到兩個不同的輸入,產生相同的HASH輸出。具體可以看看相關文章12

如何形象理解這個特點呢?

首先,這個HASH算法的輸出必須要有一定的長度,如果長度不夠,肯定會有重復的。比如假設一個HASH算法,輸出只有1位,輸出不是0就是1,那是不是運行兩、三次,就能找到了不同輸入相同輸出了呢!如果輸出只有兩位,這個HASH的輸出就只有4種可能,00、01、10、11,那是不是運行四、五次,就能找到不同輸入相同輸出了呢!

所以MD5有128位這么長,SHA-256有256位這么長!

其次,要保障HASH值是非常隨機、非常均勻地落在整個輸出空間上。而且輸入有一點點的不同,輸出都會全然的不同。

這樣,就有了一種ID的效果,HASH就像是每個輸入各異的“指紋”。比如,你把1000萬份不同的文件都做了HASH,每份文件都獲得一個獨一無二的HASH值,就可以把這個當作是一個文件的ID。每個ID都指代了一個獨一無二的文件,如果再遇到ID相同的,就表明遇到相同的文件了。

再次,要能理解,輸出的空間是非常大的。

對于像RSA-256這樣的算法,其輸出位數為256位,那么可能的值就會有10^78個(也即2^256個),這是多么大的一個數呢?

全地球沙子的數量(不只是海灘上的,而是所有),有人估算過,大致是7*10^21個,還不到10^22個。

全宇宙星球的數量,也大致不過7*10^22個,還不到10^23個。

你給它兩個不同的輸入,它產生相同輸出的概率,比下面這個例子中的概率還要小得多:

你隨便在一個星球上選了一粒沙子,另外一個人,在完全不受你影響的情況下,也隨機在某個星球上隨機選了一粒沙子,結果你倆選擇了同一粒沙子!然后你倆還不約而同地選擇了這個沙子中的同一個原子!

現在看第二個特點:不可逆

一個好的HASH算法,要求正向計算很快,但反向幾乎不可能。

比如,我現在有一個BTC私鑰,形如:

5HvrDrdQ9EpJTcJHXuctU9vUjydzuZ1????????????????DCHa

為了保密,我把其中16個字符用?代替。

計算出這個私鑰的MD5值為:630a0cec43d49095027b224ea0f2b317

那么,請問,全世界的黑客,有沒有能力通過破解MD5,得到我這個私鑰呢?

答案是:按照現在的能力,不能。

黑客的做法,只能是,不斷嘗試這16個?號可能的組合,計算其MD5值,以期有一天能算出相同的MD5值。

但這種暴力猜解需要很長時間。(大致毛估一下,以目前的技術,如果全世界黑客聯合起來,擁有類比全球BTC挖礦那么大的算力,那也至少要算5年。)

那么,挖礦是在干什么

2021年6月13日18:09:30,BTC礦工們挖出一個HASH:

00000000000000000009813c8a3b95e3a75d878419547b7fe4dd71f9dc71da72

看看這個HASH多么漂亮!它的前面有多少個0!

上面是用16進制表示的,所以,每個0其實是二進制的0000,所以上面那個HASH,前面是19*4=76個二進制的0!

這個HASH是一個區塊的HASH(嚴格的說,是這個區塊頭部的HASH)。

最近每10分鐘就出一個這么漂亮的。

礦工們做了多少次HASH才做出這么漂亮個HASH呢?

不知道,反正平均2^76次才會出現一個這樣的,你說做了多少次呢。

他們這么費勁挖這個,圖啥呢?

圖這個區塊獎勵的BTC。

挖出這個區塊的礦工(可能是很多人一起挖的),得到了6.54164549個BTC,其中6.25個是系統獎勵的,剩下的是賺的手續費。

哦,我大致明白HASH了,區塊又是什么?

現在給大家講講區塊鏈的老祖宗—BTC—的工作原理。

如果一遍看不懂,就看兩遍,兩遍看不懂,就大聲讀第三遍。

一般都能讀懂。

1、互聯網中若干個節點(節點就是計算機啦!)同時運行BTC軟件。這些軟件是開源的,誰都可以下載了來運行(本文說的節點是指全功能節點,全球目前大約有1000個左右)。

2、人們如果要發起BTC轉賬(也即交易),就讓某個節點在互聯網廣播轉賬信息,此交易很快傳遍全網每個節點。每個節點都會檢查它所收到的交易是否符合邏輯(比如有沒有那么多錢來轉賬),如果不對,就會把這個交易拋棄掉。

轉賬就是:張三給李四發送1個BTC,王五給趙六發送0.1個BTC,諸如此類。差不多就是這個意思,每一筆轉賬也叫一個交易。

3、平均每隔一段時間(平均10分鐘),網內某個節點就會率先打包出一個區塊,區塊里面含有這段時間的所有交易數據,這個區塊會廣播到全網,每個節點都會收到該區塊(大小在1M左右)。

3a:打包是有條件的,這個區塊的頭部的HASH值必須很好看。3b:平均10分鐘才出一個,這是由挖礦難度導致的。難度是動態調整的,每兩周調整一次,調整使得全網平均每10分鐘才能挖出一個區塊。在一個完全去中心化的網絡中,難度調整是如何做到的呢?方法是:每過2016個區塊,所有節點都會自發地調整難度(寫在代碼里了)。新的難度是由最近2016個區塊的花費時長與20160分鐘(兩周)比較后調整得出的。如果花費時間短于20160分鐘,就將難度調大一些,反之亦然則調小一些。難度可以簡單地理解為要求HASH值前面有多少個0。3c:每個10分鐘內,世界上都會發生很多筆交易,這些交易都等著打包(最終只有打包在區塊里的交易才被人們承認)。每個試圖打包的礦工,把自己收到的、尚未打包的交易,放在區塊里(由于區塊大小的限制,平均一個區塊能裝大約2000多個交易),然后通過填充區塊中的隨機數區域,計算HASH,以期找到一個好看的HASH(符合難度就叫好看),找到了就叫打包成功(也就是挖礦成功),趕緊廣播出去。3d:每次收到廣播來的區塊,各節點檢驗該區塊是否符合對區塊的要求(至少HASH要好看嘛!),如果符合,就把此塊保存下來,然后開始試圖出下一個塊(也即繼續挖礦),把已經收到但尚未打包的交易打包進入下一個要出的塊。

4、所有節點都在搶著打包,因為誰能正確打包誰就能得到BTC獎勵。

4a:每成功出一個區塊,打包者將會被獎勵若干個BTC。最早一開始是獎勵50個,每210000個區塊(大約4年)獎勵減半,所以后來是25個、12.5個、現在是6.25個,到2140年就會無幣可挖。4b:事實上,礦工們除了可以得到系統的獎勵,還能得到區塊中的手續費。

5、每個節點收到區塊后,如果驗證無誤,就接受該區塊,將其附加到自己保存的區塊鏈上。

5a:由于每個節點都和其他節點不斷同步,所以每個節點(全功能節點)都保存著從第一個區塊到現在這個區塊的數據(目前已經產生將近70萬個區塊)。5b:一個區塊的頭部,會含有本區塊體內全部交易的merkle根(其實也是一種HASH計算啦),如果區塊體內的某個交易被篡改,可以通過計算merkle根,和頭部的merkle根比較,從而發現篡改。5c:一個區塊的頭部,還會含有上個區塊頭部的HASH值(可以簡稱為區塊的HASH)。這就可以校驗上個區塊是否完整、正確(因為任何數據差錯,都做不出好看的HASH了)。你可以從最新的區塊,一直追溯到創世區塊(第一個區塊),確保沒有任何數據被改動過。

5d:整個區塊鏈上,如果其中任何一個區塊,有任何一點點的篡改,都會導致這個區塊的HASH值不再是一個好看的HASH,也會導致其后區塊的HASH都不再好看,任何明眼人,都會知道數據不對了。而每個好看的HASH,都是全球若干礦工,使用若干礦機,花著若干電費,辛辛苦苦挖出來的。一個試圖篡改區塊的人或組織,沒有這么強大的能力。

結語

現在,你是不是了解了HASH,了解了挖礦,了解了區塊鏈為什么這么能防篡改了呢!

我簡單總結一下:

HASH很容易計算,但反過來倒推就不容易;輸入有一點改變,輸出就會大變;對于一個好的HASH算法,不同的輸入,肯定會是不同的輸出,不用擔心碰撞;HASH值可以當作ID來看待;通過對比HASH,可以判斷輸入是否被人改了。

挖礦是為了給一個區塊找一個好看的HASH,也即前面若干位是0的HASH;不管有多少節點在挖礦,都能夠自動、簡單地調整難度,使得保證大約10分鐘才能找到一個好看的HASH;每個區塊都將自己那個好看的HASH,放在下一個區塊的頭部;每個全節點都記錄著所有區塊的數據,而且可以很方便的驗證所有區塊沒有被人改動過;如果有人想改歷史區塊里的數據,那要費老鼻子勁了!

不過這只是一大半,還有一些東西你是不了解的,也不是本文所想描述的。

你如果對其他的東西感興趣,請留言。

文|衛劍釩


  • https://www.zhihu.com/question/19743262/answer/289095984?

  • https://www.zhihu.com/question/56234281/answer/148349930

  • 總結

    以上是生活随笔為你收集整理的弄明白HASH,你就弄明白区块链的一大半的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。