比特幣采用了基于互聯(lián)網(wǎng)的點對點(P2P:peer-to-peer)分布式網(wǎng)絡(luò)架構(gòu)。
比特幣網(wǎng)絡(luò)可以認(rèn)為是按照比特幣P2P協(xié)議運行的一系列節(jié)點的集合。
本文來分析下比特幣網(wǎng)絡(luò),了解它跟傳統(tǒng)中心化網(wǎng)絡(luò)的區(qū)別,以及比特幣網(wǎng)絡(luò)是如何發(fā)現(xiàn)相鄰節(jié)點的。
中心化網(wǎng)絡(luò)
為了更好的理解P2P網(wǎng)絡(luò),我們先來看看傳統(tǒng)的中心化模型:

這是一種典型的星型(“中心化”)結(jié)構(gòu),我們常見B/S及C/S網(wǎng)絡(luò)架構(gòu)就是這種模型,C1 、C2 、C3等之間沒法直接的連接,C節(jié)點如果要連接必須要通過中心化S節(jié)點做為橋梁。
中心化節(jié)點充當(dāng)服務(wù)者、中介作用,比如我們沒有辦法把資金直接從一個人轉(zhuǎn)移給另一個人,必須通過銀行這個中介。
P2P網(wǎng)絡(luò)
P2P網(wǎng)絡(luò)是指位于同一網(wǎng)絡(luò)中的每臺計算機(jī)都彼此對等,各個節(jié)點共同提供網(wǎng)絡(luò)服務(wù),不存在任何“特殊”節(jié)點,每個網(wǎng)絡(luò)節(jié)點以扁平(flat)的拓?fù)浣Y(jié)構(gòu)相互連通。

對比中心化網(wǎng)絡(luò),在P2P網(wǎng)絡(luò)中不存在任何服務(wù)端(server)、中央化的服務(wù)。
P2P網(wǎng)絡(luò)的節(jié)點之間交互連接、協(xié)同,每個節(jié)點在對外提供服務(wù)的同時也使用網(wǎng)絡(luò)中其他節(jié)點所提供的服務(wù),每個節(jié)點即是服務(wù)端又是客戶端。
P2P網(wǎng)絡(luò)模型除應(yīng)用于比特幣網(wǎng)絡(luò),使用廣泛的BT下載就是基于P2P網(wǎng)絡(luò)。
P2P網(wǎng)絡(luò)不僅僅去除了中心化帶來的風(fēng)險(中心化可能作惡),還可以提高傳輸?shù)男省?中心化網(wǎng)絡(luò)當(dāng)能也有優(yōu)點)
如何發(fā)現(xiàn)節(jié)點
既然每個網(wǎng)絡(luò)節(jié)點都是平等的(是指在網(wǎng)絡(luò)層面上節(jié)點是平等的,但各節(jié)點在功能上可以有不同的分工, 如錢包節(jié)點、挖礦節(jié)點等),不存在任何“特殊”中心節(jié)點,那么當(dāng)新的網(wǎng)絡(luò)節(jié)點啟動后,它是如何跟其他的節(jié)點建立連接,從而加入到比特幣網(wǎng)絡(luò)呢?
在中心化網(wǎng)絡(luò)中,新加入的節(jié)點只要連接“特殊”的中心節(jié)點就可以加入網(wǎng)絡(luò)。
為了能夠加入到比特幣網(wǎng)絡(luò),比特幣客戶端會做一下幾件事情:
1.節(jié)點會記住它最近成功連接的網(wǎng)絡(luò)節(jié)點,當(dāng)重新啟動后它可以迅速與先前的對等節(jié)點網(wǎng)絡(luò)重新建立連接。
2.節(jié)點會在失去已有連接時嘗試發(fā)現(xiàn)新節(jié)點。
3.當(dāng)建立一個或多個連接后,節(jié)點將一條包含自身IP地址消息發(fā)送給其相鄰節(jié)點。相鄰節(jié)點再將此消息依次轉(zhuǎn)發(fā)給它們各自的相鄰節(jié)點,從而保證節(jié)點信息被多個節(jié)點所接收、保證連接更穩(wěn)定。
4.新接入的節(jié)點可以向它的相鄰節(jié)點發(fā)送獲取地址getaddr消息,要求它們返回其已知對等節(jié)點的IP地址列表。節(jié)點可以找到需連接到的對等節(jié)點。
5.在節(jié)點啟動時,可以給節(jié)點指定一個正活躍節(jié)點IP, 如果沒有,客戶端也維持一個列表,列出了那些長期穩(wěn)定運行的節(jié)點。這樣的節(jié)點也被稱為種子節(jié)點(其實和BT下載的種子文件道理是一樣的),就可以通過種子節(jié)點來快速發(fā)現(xiàn)網(wǎng)絡(luò)中的其他節(jié)點。
節(jié)點通信簡述
比特幣節(jié)點通常采用TCP協(xié)議、使用8333端口與相鄰節(jié)點建立連接, 建立連接時也會有認(rèn)證“握手”的通信過程,用來確定協(xié)議版本,軟件版本,節(jié)點IP,區(qū)塊高度等。
當(dāng)節(jié)點連接到相鄰節(jié)點后,接著就開始跟相鄰節(jié)點同步區(qū)塊鏈數(shù)據(jù)(輕量級錢包應(yīng)用其實不會同步所有區(qū)塊數(shù)據(jù)),節(jié)點們會交換一個getblocks消息,它包含本地區(qū)塊鏈最頂端的哈希值。如果某個節(jié)點識別出它接收到的哈希值并不屬于頂端區(qū)塊,而是屬于一個非頂端區(qū)塊的舊區(qū)塊,就說其自身的本地區(qū)塊鏈比其他節(jié)點的區(qū)塊鏈更長,并告訴其他節(jié)點需要補(bǔ)充區(qū)塊,其他節(jié)點發(fā)送getdata消息來請求區(qū)塊,驗證后更新到本地區(qū)塊鏈中。
新聞熱點
疑難解答
圖片精選