区块链学习(6)区块链
寫了幾篇區(qū)塊鏈的學(xué)習(xí)筆記,今天來寫寫比特幣中的區(qū)塊鏈。比特幣中區(qū)塊鏈?zhǔn)怯砂灰仔畔⒌膮^(qū)塊從后向前有序鏈接起來的數(shù)據(jù)結(jié)構(gòu)。每個(gè)區(qū)塊從后向前有序地鏈接在這個(gè)鏈條里,每個(gè)區(qū)塊都指向前一個(gè)區(qū)塊。
區(qū)塊結(jié)構(gòu)
區(qū)塊是一種數(shù)據(jù)結(jié)構(gòu),存放了多組交易,并且塊與塊之間相互連接,每個(gè)塊都指向前一個(gè)區(qū)塊。為了提高性能,一組交易確認(rèn)打包成塊,下面就是區(qū)塊的結(jié)構(gòu)
區(qū)塊頭中由版本,父區(qū)塊哈希值,Merkle根,時(shí)間戳,難度目標(biāo),Nonce。Nonce、難度目標(biāo)和時(shí)間戳?xí)糜谕诘V過程。
每個(gè)區(qū)塊通過SHA256算法對(duì)區(qū)塊頭進(jìn)行二次哈希計(jì)算而得到一個(gè)哈希值叫做區(qū)塊哈希值,不過只有區(qū)塊頭進(jìn)行了哈希計(jì)算。區(qū)塊哈希值可以唯一的表示一個(gè)區(qū)塊。還可以用區(qū)塊高度表示區(qū)塊,第一個(gè)區(qū)塊高度為0,第二個(gè)區(qū)塊為1,之后的區(qū)塊依次增加。但區(qū)塊高度并不能唯一的表示一個(gè)區(qū)塊,若區(qū)塊鏈出現(xiàn)分叉就有可能出現(xiàn)兩個(gè)區(qū)塊的高度相同。而一個(gè)區(qū)塊中的區(qū)塊頭內(nèi)儲(chǔ)存著它上一個(gè)區(qū)塊的哈希值的引用,而上一個(gè)區(qū)塊的區(qū)塊頭內(nèi)又有再上一個(gè)的區(qū)塊的哈希值的引用。這樣就將各區(qū)塊組成了區(qū)塊鏈。
?
該區(qū)塊中的所有交易都是用Merkle樹表示的,在區(qū)塊頭中就儲(chǔ)存了Merkle樹的根。關(guān)于Merkle樹這個(gè)博客講的是相當(dāng)詳細(xì)https://blog.csdn.net/wo541075754/article/details/54632929
有興趣的可以去看看。
Merkle樹,通常也被稱作Hash樹,樹中的節(jié)點(diǎn)儲(chǔ)存的都是哈希值,葉子節(jié)點(diǎn)儲(chǔ)存著交易。Merkle樹是自底向上構(gòu)建的。有A,B,C,D四個(gè)交易,先將四個(gè)交易進(jìn)行兩次哈希運(yùn)算。
HA = SHA256(SHA256(交易A))
HB = SHA256(SHA256(交易B))
HC = SHA256(SHA256(交易C))
HD = SHA256(SHA256(交易D))
?分別得到四個(gè)哈希值HA,HB,HC.HD作為葉子節(jié)點(diǎn),子節(jié)點(diǎn)A和子節(jié)點(diǎn)B的兩個(gè)32字節(jié)的哈希值將被串聯(lián)成64字節(jié)的字符串。子節(jié)點(diǎn)C和子節(jié)點(diǎn)D串聯(lián)得到一個(gè)64字節(jié)的字符串。隨后將字符串進(jìn)行兩次哈希來產(chǎn)生父節(jié)點(diǎn)的哈希值,
HAB = SHA256(SHA256(HA + HB))
HCD =SHA256(SHA256(HA + HB))
接著再繼續(xù)相同的操作,將HAB和HCD串聯(lián)就可以得到Merkle樹的根
?
Merkle樹是二叉樹,所以它需要偶數(shù)個(gè)葉子節(jié)點(diǎn)。如果僅有奇數(shù)個(gè)交易,那最后的交易就會(huì)被復(fù)制一份以構(gòu)成偶數(shù)個(gè)葉子節(jié)點(diǎn)。有了Merkle樹對(duì)于SPV節(jié)點(diǎn)只需下載區(qū)塊頭,而不需要下載每筆交易和區(qū)塊。
轉(zhuǎn)載于:https://www.cnblogs.com/mambakb/p/9688161.html
總結(jié)
以上是生活随笔為你收集整理的区块链学习(6)区块链的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 获取子目录下的所有文件的路
- 下一篇: Ubuntu16.04下使用ufw保护d