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