區(qū)塊鏈節(jié)點(diǎn)間的數(shù)據(jù)驗(yàn)證:哈希值與非對(duì)稱加密
![](http://image.woshipm.com/wp-files/img/102.jpg)
在前面的內(nèi)容中,我們一起學(xué)習(xí)了區(qū)塊鏈網(wǎng)絡(luò)中各個(gè)節(jié)點(diǎn)之間是如何建立連接和進(jìn)行協(xié)同合作的。了解了這些知識(shí)之后,你有沒有好奇過兩個(gè)節(jié)點(diǎn)之間是如何保證傳輸數(shù)據(jù)的正確性和判斷是否未更改呢?
本期就為你剖析一下區(qū)塊鏈網(wǎng)絡(luò)中節(jié)點(diǎn)之間是如何進(jìn)行數(shù)據(jù)驗(yàn)證,保證數(shù)據(jù)的完整性和真實(shí)性的。其實(shí)特別簡(jiǎn)單,看完你就知道了!
一、先了解一個(gè)概念:哈希值
哈希值是一串固定長(zhǎng)度的二進(jìn)制數(shù)值,它是哈希算法(Hash算法)計(jì)算的出來的。
哈希算法可以將任意長(zhǎng)度的二進(jìn)制值映射為較短的固定長(zhǎng)度的二進(jìn)制值,這個(gè)小的二進(jìn)制值稱為哈希值。哈希值是一段數(shù)據(jù)唯一且極其緊湊的數(shù)值表示形式。如果進(jìn)行哈希運(yùn)算的數(shù)據(jù)哪怕只更改該段落的一個(gè)字母,隨后的哈希都將產(chǎn)生不同的值。
要找到哈希值為同一個(gè)值的兩個(gè)不同的輸入,在計(jì)算上是不可能的,所以數(shù)據(jù)的哈希值可以檢驗(yàn)數(shù)據(jù)的完整性;一般用于快速查找和加密算法。
說人話,哈希值就是通過哈希算法將一段數(shù)據(jù)進(jìn)行計(jì)算,得出的一個(gè)數(shù)值。這個(gè)數(shù)值它有兩個(gè)特性:?jiǎn)蜗蛐院臀ㄒ恍浴?/p>
單向性
哈希值是無(wú)法通過反向運(yùn)算得出原始數(shù)據(jù)的。比如一段數(shù)字“1234”可以通過哈希算法得出哈希值A(chǔ),但是通過哈希值A(chǔ)是永遠(yuǎn)也沒有辦法解密出原始數(shù)字“1234”的。
唯一性
只有完全相同的數(shù)據(jù)進(jìn)行哈希計(jì)算得到的哈希值才是相同的,也就是說哈希值和原始數(shù)據(jù)是唯一對(duì)應(yīng)的,不存在兩個(gè)不一樣的數(shù)據(jù)得出相同哈希值這種情況。
哈希加密的強(qiáng)大之處在于,我不管你的內(nèi)容是什么, 只要內(nèi)容一致得出哈希值就是一致的。這樣就可以簡(jiǎn)單粗暴的對(duì)比兩條信息是否一致,而不需要去關(guān)心數(shù)據(jù)的細(xì)節(jié)是什么。
正是因?yàn)楣V档倪@種屬性,才使得哈希算法在區(qū)塊鏈網(wǎng)絡(luò)中起到舉足輕重的作用。
二、再了解一個(gè)概念:非對(duì)稱加密
非對(duì)稱加密算法是一種密鑰的保密方法。 非對(duì)稱加密算法需要兩個(gè)密鑰:公鑰(公開密鑰)和私鑰(私有密鑰)。 公鑰和私鑰是一對(duì),如果用公鑰對(duì)數(shù)據(jù)進(jìn)行加密,只有用對(duì)應(yīng)的私鑰才能解密;如果用私鑰對(duì)數(shù)據(jù)進(jìn)行加密,那么只有用對(duì)應(yīng)的公鑰才能解密。
如果對(duì)加密算法和對(duì)公鑰和密鑰還感覺毫無(wú)概念,可以就把它們理解成兩個(gè)密碼,若其中一個(gè)密碼對(duì)數(shù)據(jù)進(jìn)行了上鎖,則只能用另一個(gè)密碼進(jìn)行解鎖。
因?yàn)閷?duì)數(shù)據(jù)進(jìn)行加密和解密使用的是兩個(gè)不同的密鑰,所以這種算法就叫做非對(duì)稱加密算法。在區(qū)塊鏈網(wǎng)絡(luò)中某個(gè)節(jié)點(diǎn)的公鑰是全網(wǎng)公開的,私鑰只有該節(jié)點(diǎn)才擁有。
三、第一個(gè)記錄交易的節(jié)點(diǎn)做了什么?
以比特幣網(wǎng)絡(luò)中的一筆交易信息為例來看記錄交易節(jié)點(diǎn)和驗(yàn)證交易節(jié)點(diǎn)是如何配合的。
比如一個(gè)交易A在節(jié)點(diǎn)001發(fā)生,那節(jié)點(diǎn)001就負(fù)責(zé)記錄交易A的具體數(shù)據(jù),這里其實(shí)首先需要驗(yàn)證交易A的合法性(比如購(gòu)買方是否有足夠的余額來支付),這不是本期重點(diǎn)所以暫不展開,我們假設(shè)交易A就是合法的。
節(jié)點(diǎn)001在拿到交易A之后會(huì)先對(duì)交易數(shù)據(jù)進(jìn)行哈希運(yùn)算,生成一個(gè)交易哈希值001。然后再用自己的私鑰對(duì)哈希值001進(jìn)行簽名(加密)生成簽名信息,簽名信息中包含了交易哈希值001。
節(jié)點(diǎn)001完成上述的工作之后就會(huì)對(duì)外廣播,廣播內(nèi)容 = 原始交易信息A + 簽名信息。
一圖勝千言,處理流程見下圖。
四、驗(yàn)證數(shù)據(jù)的節(jié)點(diǎn)做了什么?
假設(shè)比特幣網(wǎng)絡(luò)中的節(jié)點(diǎn)002收到了節(jié)點(diǎn)001發(fā)送來的廣播內(nèi)容。節(jié)點(diǎn)002得到了“原始交易信息A”和簽名信息。這個(gè)時(shí)候會(huì)遇到兩個(gè)問題:
- 簽名信息是不是節(jié)點(diǎn)001用自己的私鑰簽名產(chǎn)生的?
- 節(jié)點(diǎn)002是無(wú)法判斷原始交易信息A是否在傳輸中發(fā)生了更改?
如何解決這些問題呢?
節(jié)點(diǎn)002如果能通過節(jié)點(diǎn)001的公鑰對(duì)簽名信息進(jìn)行解密(逆運(yùn)算)則可以證明該簽名信息屬于節(jié)點(diǎn)001 ,并且在解密之后得到了哈希值001。
節(jié)點(diǎn)002對(duì)接收到的“原始交易信息A”進(jìn)行一次哈希運(yùn)算得到哈希值002。判斷交易信息是否發(fā)生改變只需要對(duì)比哈希值001和哈希值002是否一致即可。
如果一致則證明數(shù)據(jù)傳輸無(wú)誤,通過驗(yàn)證。如果不一致則證明交易信息發(fā)生了更改,驗(yàn)證無(wú)法通過。
這樣就完美的解決了兩個(gè)節(jié)點(diǎn)驗(yàn)證交易一致性的問題了。
一圖勝千言,處理流程見下圖。
五、總結(jié)
兩個(gè)節(jié)點(diǎn)之間的數(shù)據(jù)驗(yàn)證整體流程我整理到了一個(gè)圖上,方便大家建立一個(gè)更宏觀的認(rèn)識(shí)。
在數(shù)據(jù)驗(yàn)證的過程中,我認(rèn)為哈希算法是起決定性作用的,有了哈希算法我們不再需要通過判斷交易信息的內(nèi)部邏輯來判斷是否改變,或者說我們根本不需要關(guān)心數(shù)據(jù)內(nèi)容多復(fù)雜,而只需要對(duì)比兩個(gè)數(shù)值就可以達(dá)到判斷數(shù)據(jù)是否一致的目的。
哈希算法真是一個(gè)偉大的發(fā)明!
版權(quán)聲明:數(shù)字簽名:Press.one 如需轉(zhuǎn)載,請(qǐng)聯(lián)系作者微信:w4533001
作者:liheng,區(qū)塊鏈探索者、互聯(lián)網(wǎng)產(chǎn)品經(jīng)理,超級(jí)個(gè)體修煉中,只創(chuàng)作對(duì)用戶有價(jià)值的內(nèi)容
本文由 @liheng 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自Unsplash,基于CC0協(xié)議
您好,那么請(qǐng)問節(jié)點(diǎn)002是如何獲取001的公鑰的么,是001廣播的時(shí)候一起廣播出去了么?
是的,公鑰會(huì)一起給下一個(gè)節(jié)點(diǎn)
您好,那么如何保證公鑰在廣播出去后,在網(wǎng)絡(luò)中未被更改過呢?
牛逼 很清晰明了果斷粉
作者好強(qiáng)大,深入淺出
非常感謝你的認(rèn)可 ??
科普一下廣播,一個(gè)網(wǎng)絡(luò)術(shù)語(yǔ):把信息數(shù)據(jù)發(fā)送到所在系統(tǒng)/網(wǎng)絡(luò)/封閉空間等內(nèi)所有的有效對(duì)象,讓所有的對(duì)象都接收到這個(gè)發(fā)送的數(shù)據(jù)