雲栖号資訊:【 點選檢視更多行業資訊】
在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!
簡介
比特币的底層就是區塊鍊技術,區塊鍊也是因為比特币而廣為人知的。和其他的區塊鍊技術相比,比特币的區塊鍊有什麼特征呢?作為去區塊鍊的鼻祖,又有什麼與衆不同的特性呢?快來跟我們一起看看吧。
比特币的網絡
比特币使用的是P2P(peer-to-peer)網絡,此P2P非彼P2P,這裡是點對點的網絡架構,而不是人對人的借錢模式。
P2P是指位于同一網絡中的每台計算機都彼此對等,各個節點共同提供網絡服務,不存在任何“特殊”節點。每個網絡節點以“扁平(flat)”的拓撲結構互相連通。在P2P網絡中不存在任何服務端(server)、中央化的服務、以及層級結構。

傳統的網絡結構是client-server的模式,所有的client都是和server互動擷取資訊, 隻要server挂掉了,client也就沒有用了。
而在P2P網絡中,沒有server的概念,每個節點可以作為一個server。對比起來P2P網絡在穩定性方面要比C-S架構的系統要穩定得多。
網絡發現與同步
既然是P2P網絡,那麼問題來了,這個P2P網絡是怎麼建立起來的呢?節點之間是怎麼發現的呢?
有做過P2P下載下傳的同學應該都聽說過種子的概念,這個種子裡面儲存了其他活躍的節點的位址。通過下載下傳種子就可以連接配接對應的節點。
而每個節點又儲存了最近連接配接或者活躍的節點,這樣就形成了龐大的P2P網絡。
同樣的,比特币的P2P網絡也是這樣的。
新節點是如何發現網絡中的對等節點的呢?雖然比特币網絡中沒有特殊節點,但是用戶端會維持一個清單,那裡列出了那些長期穩定運作的節點。這樣的節點被稱為“種子節點(seed nodes)”
節點必須持續進行兩項工作:在失去已有連接配接時發現新節點,并在其他節點啟動時為其提供幫助。
SPV節點
我們之前介紹了,在比特币的世界裡既沒有賬戶,也沒有餘額,隻有分散到區塊鍊裡的UTXO(Unspent Transaction Outputs)。
那麼如果想要驗證交易的話,需要從曆史的交易中查找所有的和該交易有關的交易,進而進行完整,全面的驗證。
這樣做的問題就是,如果下載下傳所有的曆史記錄,那麼需要上百G的硬碟空間,這對于手機或者其他輕量級的用戶端是無法想象的。
于是SPV出現了。SPV的全稱是Simplified payment verification,叫做簡單認證支付。
SPV儲存的不是整個區塊鍊,而是區塊鍊的頭部,因為每個區塊鍊頭隻有80位元組,是以即使把所有的區塊頭都下載下傳儲存起來也不會很大。
區塊鍊頭
區塊頭由三組區塊中繼資料組成。首先是一組引用父區塊哈希值的資料,這組中繼資料用于将該區塊與區塊鍊中前一區塊相連接配接。
第二組中繼資料,即難度、時間戳和nonce,與挖礦競争相關。
第三組中繼資料是merkle樹根(一種用來有效地總結區塊中所有交易的資料結構)。
Nonce、難度目标和時間戳會用于挖礦過程,Merkle根用來索引群組織該區塊所有的交易資訊。
上圖是一個區塊鍊頭組成的鍊。
Merkle Tree
Merkle Tree,是一種樹(資料結構中所說的樹),網上大都稱為Merkle Hash Tree,這是因為 它所構造的Merkle Tree的所有節點都是Hash值。Merkle Tree具有以下特點:
1.它是一種樹,可以是二叉樹,也可以多叉樹,無論是幾叉樹,它都具有樹結構的所有特點;
2.Merkle樹的葉子節點上的value,是由你指定的,這主要看你的設計了,如Merkle Hash Tree會将資料的Hash值作為葉子節點的值;
3.非葉子節點的value是根據它下面所有的葉子節點值,然後按照一定的算法計算而得出的。如Merkle Hash Tree的非葉子節點value的計算方法是将該節點的所有子節點進行組合,然後對組合結果進行hash計算所得出的hash value。
有了Merkle Tree,我們隻需要知道和要驗證的交易相關的其他Merkle Tree中的資訊,就可以計算出整個Merkle Tree的值,這樣就可以直接使用頭部資訊進行驗證了。這就是SPV的原理。
比特币中的區塊鍊
區塊鍊是由包含交易資訊的區塊從後向前有序連結起來的資料結構。它可以被存儲為flat file(一種包含沒有相對關系記錄的檔案),或是存儲在一個簡單資料庫中。
比特币核心用戶端使用Google的LevelDB資料庫存儲區塊鍊中繼資料。
它由一個包含中繼資料的區塊頭和緊跟其後的構成區塊主體的一長串交易組成。區塊頭是80位元組,而平均每個交易至少是250位元組,而且平均每個區塊至少包含超過500個交易。
區塊辨別符
那怎麼表示一個區塊呢?我們使用區塊标志符。
區塊主辨別符是它的加密哈希值,一個通過SHA256算法對區塊頭進行二次哈希計算而得到的數字指紋。産生的32位元組哈希值被稱為區塊哈希值,但是更準确的名稱是:區塊頭哈希值,因為隻有區塊頭被用于計算。
第二種識别區塊的方式是通過該區塊在區塊鍊中的位置,即“區塊高度(block height)”。第一個區塊,其區塊高度為0
和區塊哈希值不同的是,區塊高度并不是唯一的辨別符。雖然一個單一的區塊總是會有一個明确的、固定的區塊高度,但反過來卻并不成立,一個區塊高度并不總是識别一個單一的區塊。兩個或兩個以上的區塊可能有相同的區塊高度,在區塊鍊裡争奪同一位置。
創世區塊
區塊鍊裡的第一個區塊建立于2009年,被稱為創世區塊。它是區塊鍊裡面所有區塊的共同祖先,這意味着你從任一區塊,循鍊向後回溯,最終都将到達創世區塊。
因為創世區塊被編入到比特币用戶端軟體裡,是以每一個節點都始于至少包含一個區塊的區塊鍊,這能確定創世區塊不會被改變。每一個節點都“知道”創世區塊的哈希值、結構、被建立的時間和裡面的一個交易。是以,每個節點都把該區塊作為區塊鍊的首區塊,進而建構了一個安全的、可信的區塊鍊的根。
創世區塊的哈希值為:
0000000000 19d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
創世區塊包含一個隐藏的資訊。在其Coinbase交易的輸入中包含這樣一句話“The Times 03/Jan/2009 Chancellor on brink of second bailout forbanks.”這句話是泰晤士報當天的頭版文章标題,引用這句話,既是對該區塊産生時間的說明,也可視為半開玩笑地提醒人們一個獨立的貨币制度的重要性,同時告訴人們随着比特币的發展,一場前所未有的世界性貨币革命将要發生。該消息是由比特币的創立者中本聰嵌入創世區塊中。
coinbase的值是:
04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73
解碼方法如下:
在python shell下:
"04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73".decode('hex')
輸出:
'x04xffxffx00x1dx01x04EThe Times 03/Jan/2009 Chancellor on brink of second bailout for banks'
總結
本文介紹了比特币的網絡和比特币中的區塊鍊的相關概念,希望大家能夠喜歡。
【雲栖号線上課堂】每天都有産品技術專家分享!
課程位址:
https://yqh.aliyun.com/live立即加入社群,與專家面對面,及時了解課程最新動态!
【雲栖号線上課堂 社群】
https://c.tb.cn/F3.Z8gvnK
原文釋出時間:2020-06-22
本文作者:flydean
本文來自:“
掘金”,了解相關資訊可以關注“掘金”