區(qū)塊鏈起源于比特幣。2008年11月中本聰?shù)陌l(fā)表《比特幣:一種點對點的電子現(xiàn)金系統(tǒng)》,闡述了基于 P2P 網(wǎng)絡(luò)技術(shù)、加密技術(shù)、時間戳技術(shù)、區(qū)塊鏈技術(shù)等的電子現(xiàn)金系統(tǒng)的構(gòu)架理念,標(biāo)志著比特幣的誕生。兩個月后比特幣程序編寫完成并自組網(wǎng)開始運用,2009年1月3日第一個序號為0的比特幣創(chuàng)世區(qū)塊誕生,2009 年1月9日出現(xiàn)序號為1的區(qū)塊,并與序號為0的創(chuàng)世區(qū)塊相連接形成了鏈,標(biāo)志著區(qū)塊鏈的誕生。比特幣發(fā)展緩慢,但近幾年作為比特幣底層技術(shù)之一的區(qū)塊鏈技術(shù)日益受到重視。
區(qū)塊鏈更多可以看作一種對已有技術(shù)的應(yīng)用,而非單純的提出了一種技術(shù)。所以,在系統(tǒng)的學(xué)習(xí)區(qū)塊鏈技術(shù)之前,讓我們來看看區(qū)塊鏈用到了哪些技術(shù)。
密碼學(xué)
哈希
在比特幣這一技術(shù)中,使用到了密碼學(xué)中的兩個功能,第一個功能為哈希。
首先簡單介紹一下哈希,比特幣使用的哈希具有三個性質(zhì):
- Collision resistance(抗碰撞性):即對于某個哈希函數(shù)H(·),輸入x和輸入y,如果有x≠y,則有H(x)≠H(y)
- hidding(單向不可逆):即假設(shè)有一個哈希函數(shù)H(·),給定輸入x,我們可以得到哈希輸出H(x),但是給定一個哈希輸出H(x)和H(·),我們無法求得x是什么。也即H(x)沒有泄露x的任何信息。
- Puzzle friendly:由于哈希值是不可預(yù)測的,所以如果要H(x)落在某個范圍內(nèi),沒有什么好的辦法,只能一個一個x去嘗試。這個特性使得在打包區(qū)塊的時候,必須進(jìn)行大量的運算(為了讓hash值落于某個區(qū)間中)。
比特幣使用的哈希函數(shù)是sha-256,collision resistance這一性質(zhì)主要用于保證區(qū)塊鏈每個區(qū)塊的不可篡改性質(zhì);puzzle friendly這一性質(zhì)主要用于工作量確認(rèn)。
非對稱加密
用到的第二個密碼學(xué)功能為非對稱加密。在每個比特幣用戶創(chuàng)建賬戶的時候,都會創(chuàng)建一個公私鑰對。a在給b發(fā)送信息的時候,使用b的公鑰對信息加密,b然后使用自己的私鑰對信息解密。同時,在發(fā)布這樣一個信息的時候,a需要使用自己的私鑰對信息進(jìn)行簽名,這樣網(wǎng)絡(luò)中的其他節(jié)點可以使用a的公鑰確認(rèn)這個信息是否由a發(fā)布。
在第三方中心化系統(tǒng)中,賬戶開通依賴于第三方。但去中心化的比特幣系統(tǒng)中,很明顯不能進(jìn)行“申請賬戶”。在比特幣系統(tǒng)中,申請賬戶是用戶自己來處理的,即自己創(chuàng)建一個公鑰-私鑰對。
公鑰和私鑰的應(yīng)用保證了“簽名”的應(yīng)用。當(dāng)在比特幣網(wǎng)絡(luò)中進(jìn)行轉(zhuǎn)賬時,通過“簽名”可以明確是由哪個賬戶轉(zhuǎn)出的,從而防止不良分子對其他賬戶比特幣的盜取。
在發(fā)布交易時,通過自己私鑰簽名,其他人可以根據(jù)公鑰進(jìn)行驗證,從而保證該交易由自己發(fā)起。也就是說,只有擁有私鑰,才能將該賬戶中的比特幣轉(zhuǎn)走。
數(shù)據(jù)結(jié)構(gòu)
哈希指針
區(qū)塊鏈?zhǔn)且粋€將各個區(qū)塊串起來的鏈,而串聯(lián)起這些區(qū)塊的就是哈希指針。一個哈希指針包含兩部分?jǐn)?shù)據(jù):
- 指向某一信息存儲的指針
- 某一數(shù)據(jù)塊的哈希值
如下圖對于該節(jié)點,白色方框即為一個區(qū)塊鏈的區(qū)塊。我們可以看到有兩個指針指向這個節(jié)點(實際上為一個),其中P為該節(jié)點的地址,H()為該節(jié)點的哈希值,該值與節(jié)點中內(nèi)容有關(guān)。當(dāng)節(jié)點(區(qū)塊)中內(nèi)容發(fā)生改變,該哈希值也會發(fā)生改變,從而保證了區(qū)塊內(nèi)容不能被篡改。
在比特幣中,其最基本的數(shù)據(jù)結(jié)構(gòu)便是一個個區(qū)塊形成的區(qū)塊鏈。每個區(qū)塊根據(jù)自己的區(qū)塊內(nèi)容生成自己的哈希值,此外,每個區(qū)塊(除創(chuàng)世紀(jì)塊)都保存有前一個區(qū)塊的哈希值。需要注意的是,本區(qū)塊哈希生成依賴于本區(qū)塊內(nèi)容,而本區(qū)塊內(nèi)容中又包含有前一個區(qū)塊的哈希值。從而保證了區(qū)塊內(nèi)容不被篡改。
區(qū)塊的結(jié)構(gòu)
在區(qū)塊鏈中,每個區(qū)塊包含兩部分?jǐn)?shù)據(jù):
- Block header
- Block body
每個區(qū)塊header中,包含指向前一個區(qū)塊的指針,也包含一個對前一個區(qū)塊的header進(jìn)行哈希得到的值。
如果現(xiàn)在要對第i個區(qū)塊的信息進(jìn)行修改,就會導(dǎo)致這個區(qū)塊的哈希值變化,這就要求i+1個區(qū)塊的哈希值也發(fā)生變化,一直到最后一個區(qū)塊的數(shù)據(jù)發(fā)生變化,最終導(dǎo)致pointer of the last block中的哈希值和最后一個區(qū)塊的哈希值對不上。這就使得區(qū)塊鏈具有不可篡改的性質(zhì)。
Merkle tree
上圖即為一個簡單的Markle Tree,其中最下面的節(jié)點即為交易數(shù)據(jù)塊。每個交易數(shù)據(jù)塊各有一個哈希值,將所有葉子節(jié)點的哈希值合并放在其父節(jié)點中,而后,針對得到的一級父節(jié)點分別取哈希,又可以得到n/2個新的哈希值,通過不斷迭代,即可得到圖中根節(jié)點。
實際中,在區(qū)塊塊頭中存儲的是根節(jié)點的哈希值(對其再取一次哈希)。這種數(shù)據(jù)結(jié)構(gòu)的優(yōu)點在于:只需要記住Root Hash(根哈希值),便可以檢測出對樹中任何部位的修改。例如,所繪制Markle Tree中節(jié)點B發(fā)生了改變,則對應(yīng)的第二層第一個節(jié)點中第二個哈希值便也會發(fā)生改變,進(jìn)而根節(jié)點中第一個哈希值也會發(fā)生改變,從而導(dǎo)致根哈希值也發(fā)生了改變。
根據(jù)前文中我們知道,區(qū)塊鏈分為header和body,body即為保存交易的地方,保存形式即為Merkle tree的形式。在區(qū)塊鏈中,Merkle tree的每個葉子節(jié)點對應(yīng)于一筆交易,除了葉子節(jié)點的節(jié)點儲存的都是指向其左右孩子的哈希指針。根據(jù)Merkle tree的性質(zhì),只要任何葉子節(jié)點中的交易被修改,就會導(dǎo)致根節(jié)點的哈希值發(fā)生變化。
在每個區(qū)塊header中,除了包含指向前一個區(qū)塊的指針,以及一個對前一個區(qū)塊的header進(jìn)行哈希得到的值,還包含當(dāng)前區(qū)塊body的Merkle tree的根哈希。但不包含具體的交易信息。
因此如果有任何交易發(fā)生變化-》根節(jié)點哈希變化-》區(qū)塊header保存的根節(jié)點哈希發(fā)生變化-》區(qū)塊header的哈希發(fā)生變化。這就要求后一個區(qū)塊保存的當(dāng)前區(qū)塊的哈希也得同步改變,而這是很難辦到的。
下圖即為一個完整的比特幣區(qū)塊的信息文章來源:http://www.zghlxwxcb.cn/news/detail-792176.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-792176.html
到了這里,關(guān)于第一節(jié) 區(qū)塊鏈技術(shù)的學(xué)習(xí)鋪墊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!