BTC網(wǎng)絡(luò)
比特幣采用了基于國際互聯(lián)網(wǎng)(Internet)的P2P(peer-to-peer)網(wǎng)絡(luò)架構(gòu)。P2P是指位于同一網(wǎng)絡(luò)中的每臺計算機(jī)都彼此對等,各個節(jié)點(diǎn)共同提供網(wǎng)絡(luò)服務(wù),不存在任何“特殊”節(jié)點(diǎn)。每個網(wǎng)絡(luò)節(jié)點(diǎn)以“扁平(flat)”的拓?fù)浣Y(jié)構(gòu)相互連通。
在P2P網(wǎng)絡(luò)中不存在任何服務(wù)端(server)、中央化的服務(wù)、以及層級結(jié)構(gòu)。P2P網(wǎng)絡(luò)的節(jié)點(diǎn)之間交互運(yùn)作、協(xié)同處理:每個節(jié)點(diǎn)在對外提供服務(wù)的同時也使用網(wǎng)絡(luò)中其他節(jié)點(diǎn)所提供的服務(wù)。P2P網(wǎng)絡(luò)也因此具有可靠性、去中心化,以及開放性。
早期的國際互聯(lián)網(wǎng)就是P2P網(wǎng)絡(luò)架構(gòu)的一個典型用例:IP網(wǎng)絡(luò)中的各個節(jié)點(diǎn)完全平等。當(dāng)今的互聯(lián)網(wǎng)架構(gòu)具有分層架構(gòu),但是IP協(xié)議仍然保留了扁平拓?fù)涞慕Y(jié)構(gòu)。在比特幣之外,規(guī)模最大也最成功的P2P技術(shù)應(yīng)用是在文件分享領(lǐng)域:Napster是該領(lǐng)域的先鋒,BitTorrent是其架構(gòu)的最新演變。
節(jié)點(diǎn)類型及角色
盡管比特幣P2P網(wǎng)絡(luò)中的各個節(jié)點(diǎn)相互對等,但是根據(jù)所提供的功能不同,各節(jié)點(diǎn)可能具有不同的角色。每個比特幣節(jié)點(diǎn)都是路由、區(qū)塊鏈數(shù)據(jù)庫、挖礦、錢包服務(wù)的功能集合。一個全節(jié)點(diǎn)(full node)包括如圖8-1所示的四個功能:錢包,礦工,完整的區(qū)塊鏈數(shù)據(jù)庫和網(wǎng)絡(luò)路由
每個節(jié)點(diǎn)都參與全網(wǎng)絡(luò)的路由功能,同時也可能包含其他功能。每個節(jié)點(diǎn)都參與驗(yàn)證并傳播交易及區(qū)塊信息,發(fā)現(xiàn)并維持與對等節(jié)點(diǎn)的連接。
一些節(jié)點(diǎn)保有一份完整的、最新的區(qū)塊鏈拷貝,這樣的節(jié)點(diǎn)被稱為“全節(jié)點(diǎn)”。全節(jié)點(diǎn)能夠獨(dú)立自主地校驗(yàn)所有交易,而不需借由任何外部參照。另外還有一些節(jié)點(diǎn)只保留了區(qū)塊鏈的一部分,它們通過一種名為“簡易支付驗(yàn)證(SPV)”的方式來完成交易驗(yàn)證。這樣的節(jié)點(diǎn)被稱為“SPV節(jié)點(diǎn)”,又叫“輕量級節(jié)點(diǎn)”。
挖礦節(jié)點(diǎn)通過運(yùn)行在特殊硬件設(shè)備上的工作量證明(proof-of-work)算法,以相互競爭的方式創(chuàng)建新的區(qū)塊。一些挖礦 節(jié)點(diǎn)同時也是全節(jié)點(diǎn),保有區(qū)塊鏈的完整拷貝;還有一些參與礦池挖礦的節(jié)點(diǎn)是輕量級節(jié)點(diǎn),它們必須依賴礦池服務(wù)器維護(hù)的全節(jié)點(diǎn)進(jìn)行工作。
用戶錢包也可以作為全節(jié)點(diǎn)的一部分,這在桌面比特幣客戶端中比較常見。當(dāng)前,越來越多的用戶錢包都是SPV節(jié)點(diǎn), 尤其是運(yùn)行于諸如智能手機(jī)等資源受限設(shè)備上的比特幣錢包應(yīng)用;而這正變得越來越普遍。
比特幣傳播網(wǎng)絡(luò)
雖然比特幣P2P網(wǎng)絡(luò)服務(wù)于各種各樣的節(jié)點(diǎn)類型的一般需求,但是對于比特幣挖掘節(jié)點(diǎn)的專門需求,它顯示出太高的網(wǎng)絡(luò)延遲。
比特幣傳播網(wǎng)絡(luò)是一種嘗試最小化礦工之間傳輸塊的延遲的網(wǎng)絡(luò)。原始的比特幣傳播網(wǎng)絡(luò)是由核心開發(fā)商Matt Corallo于2015年創(chuàng)建的,以便能夠以非常低的延遲在礦工之間快速同步塊。該網(wǎng)絡(luò)由世界各地的亞馬遜Web服務(wù)基礎(chǔ)架構(gòu)上托管的幾個專門的節(jié)點(diǎn)組成,并且連接大多數(shù)礦工和采礦池。
原始的比特幣傳播網(wǎng)絡(luò)在2016年被替換為Fast Internet Bitcoin Relay Engine or FIBRE,也由核心開發(fā)商Matt Corallo創(chuàng)建。 FIBER是一種基于UDP的中繼網(wǎng)絡(luò),可以中繼節(jié)點(diǎn)網(wǎng)絡(luò)內(nèi)的塊。 FIBER實(shí)現(xiàn)了compact block,以進(jìn)一步減少傳輸?shù)臄?shù)據(jù)量和網(wǎng)絡(luò)延遲。
康奈爾大學(xué)研究的另一個中繼網(wǎng)絡(luò)(仍在提案階段)是 Falcon。 Falcon使用“直通路由”而不是“存儲轉(zhuǎn)發(fā)”來減少延遲,通過傳播塊的部分,而不是等待直到接收到完整的塊。
傳播網(wǎng)絡(luò)不是比特幣的P2P網(wǎng)絡(luò)的替代品。相反,它們是覆蓋網(wǎng)絡(luò),在具有特殊需求的節(jié)點(diǎn)之間提供額外的連接像高速公路不是農(nóng)村道路的替代品,而是交通繁忙的兩點(diǎn)之間的快捷方式,您仍然需要小路連接高速公路。
網(wǎng)絡(luò)發(fā)現(xiàn)
當(dāng)新的網(wǎng)絡(luò)節(jié)點(diǎn)啟動后,為了能夠參與協(xié)同運(yùn)作,它必須發(fā)現(xiàn)網(wǎng)絡(luò)中的其他比特幣節(jié)點(diǎn)。新的網(wǎng)絡(luò)節(jié)點(diǎn)必須發(fā)現(xiàn)至少一個網(wǎng)絡(luò)中存在的節(jié)點(diǎn)并建立連接。由于比特幣網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)并不基于節(jié)點(diǎn)間的地理位置,因此各個節(jié)點(diǎn)之間的地理信息完全無關(guān)。在新節(jié)點(diǎn)連接時,可以隨機(jī)選擇網(wǎng)絡(luò)中存在的比特幣節(jié)點(diǎn)與之相連。
節(jié)點(diǎn)通常采用TCP協(xié)議、使用8333端口(該端口號通常是比特幣所使用的,除8333端口外也可以指定使用其他端口) 與已知的對等節(jié)點(diǎn)建立連接。在建立連接時,該節(jié)點(diǎn)會通過發(fā)送一條包含基本認(rèn)證內(nèi)容的version消息開始“握手”
保持連接
節(jié)點(diǎn)必須持續(xù)進(jìn)行兩項(xiàng)工作:在失去已有連接時發(fā)現(xiàn)新節(jié)點(diǎn),并在其他節(jié)點(diǎn)啟動時為其提供幫助。節(jié)點(diǎn)啟動時只需要一個連接,因?yàn)榈谝粋€節(jié)點(diǎn)可以將它引薦給它的對等節(jié)點(diǎn),而這些節(jié)點(diǎn)又會進(jìn)一步提供引薦。一個節(jié)點(diǎn),如果連接到大量的其他對等節(jié)點(diǎn),這既沒必要,也是對網(wǎng)絡(luò)資源的浪費(fèi)。
在啟動完成后,節(jié)點(diǎn)會記住它最近成功連接的對等節(jié)點(diǎn);因此,當(dāng)重新啟動后它可以迅速與先前的對等節(jié)點(diǎn)網(wǎng)絡(luò)重新建立連接。如果先前的網(wǎng)絡(luò)的對等節(jié)點(diǎn)對連接請求無應(yīng)答,該節(jié)點(diǎn)可以使用種子節(jié)點(diǎn)進(jìn)行重啟動。
用戶可以通過提供 -connect= 選項(xiàng)來指定一個或多個IP地址,從而達(dá)到覆蓋自動節(jié)點(diǎn)管理功能并指定IP地址列表的目的。如果采用此選項(xiàng),節(jié)點(diǎn)只連接到這些選定的節(jié)點(diǎn)IP地址,而不會自動發(fā)現(xiàn)并維護(hù)對等節(jié)點(diǎn)之間的連接。
如果已建立的連接沒有數(shù)據(jù)通信,所在的節(jié)點(diǎn)會定期發(fā)送信息以維持連接。如果節(jié)點(diǎn)持續(xù)某個連接長達(dá)90分鐘沒有任何通信,它會被認(rèn)為已經(jīng)從網(wǎng)絡(luò)中斷開,網(wǎng)絡(luò)將開始查找一個新的對等節(jié)點(diǎn)。因此,比特幣網(wǎng)絡(luò)會隨時根據(jù)變化的節(jié)點(diǎn)及網(wǎng)絡(luò)問題進(jìn)行動態(tài)調(diào)整,不需經(jīng)過中心化的控制即可進(jìn)行規(guī)模增減的有機(jī)調(diào)整。
全節(jié)點(diǎn)
全節(jié)點(diǎn)是指維持包含全部交易信息的完整區(qū)塊鏈的節(jié)點(diǎn)。更加準(zhǔn)確地說,這樣的節(jié)點(diǎn)應(yīng)當(dāng)被稱為完整區(qū)塊鏈節(jié)點(diǎn)”。
完整區(qū)塊鏈節(jié)點(diǎn)保有完整的、最新的包含全部交易信息的比特幣區(qū)塊鏈拷貝,這樣的節(jié)點(diǎn)可以獨(dú)立地進(jìn)行建立并校驗(yàn)區(qū)塊鏈,從第一區(qū)塊(創(chuàng)世區(qū)塊)一直建立到網(wǎng)絡(luò)中最新的區(qū)塊。完整區(qū)塊鏈節(jié)點(diǎn)可以獨(dú)立自主地校驗(yàn)任何交易信息,而不需要借助任何其他節(jié)點(diǎn)或其他信息來源。完整區(qū)塊節(jié)點(diǎn)通過比特幣網(wǎng)絡(luò)獲取包含交易信息的新區(qū)塊更新,在驗(yàn)證無誤后將此更新合并至本地的區(qū)塊鏈拷貝之中。
運(yùn)行完整區(qū)塊鏈節(jié)點(diǎn)可以給您一種純粹的比特幣體驗(yàn):不需借助或信任其他系統(tǒng)即可獨(dú)立地對所有交易信息進(jìn)行驗(yàn)證。 辨別您是否在運(yùn)行全節(jié)點(diǎn)是十分容易的:只需要查看您的永久性存儲設(shè)備(如硬盤)是否有超過20GB的空間被用來存儲完整區(qū)塊鏈即可。如果您需要很大的磁盤空間、并且同步比特幣網(wǎng)絡(luò)耗時2至3天,那么您使用的正是全節(jié)點(diǎn)。這就是擺脫中心化管理、獲得完全的獨(dú)立自由所要付出的代價。
交換“庫存清單”,同步本地賬本
一個全節(jié)點(diǎn)連接到對等節(jié)點(diǎn)之后,第一件要做的事情就是構(gòu)建完整的區(qū)塊鏈。如果該節(jié)點(diǎn)是一個全新節(jié)點(diǎn),那么它就不包含任何區(qū)塊鏈信息,它只知道靜態(tài)植入在客戶端軟件中的創(chuàng)世區(qū)塊。新節(jié)點(diǎn)需要下載從0號區(qū)塊(創(chuàng)世區(qū)塊)開始的數(shù)十萬區(qū)塊的全部內(nèi)容,才能跟網(wǎng)絡(luò)同步、并重建全區(qū)塊鏈。
同步區(qū)塊鏈的過程從發(fā)送version消息開始,這是因?yàn)樵撓⒅泻械腂estHeight字段標(biāo)示了一個節(jié)點(diǎn)當(dāng)前的區(qū)塊鏈高度(區(qū)塊數(shù)量)。節(jié)點(diǎn)可以從它的對等節(jié)點(diǎn)中得到版本消息,了解雙方各自有多少區(qū)塊,從而可以與其自身區(qū)塊鏈所擁有的區(qū)塊數(shù)量進(jìn)行比較。對等節(jié)點(diǎn)們會交換一個getblocks消息,其中包含他們本地區(qū)塊鏈的頂端區(qū)塊哈希值(指紋)。如果某個對等節(jié)點(diǎn)識別出它接收到的哈希值并不屬于頂端區(qū)塊,而是屬于一個非頂端區(qū)塊的舊區(qū)塊,那么它就能推斷出:其自身的本地區(qū)塊鏈比其他對等節(jié)點(diǎn)的區(qū)塊鏈更長。
擁有更長區(qū)塊鏈的對等節(jié)點(diǎn)比其他節(jié)點(diǎn)有更多的區(qū)塊,可以識別出哪些區(qū)塊們是其他節(jié)點(diǎn)需要“補(bǔ)充”的。它會識別出第 一批可供分享的500個區(qū)塊,通過使用inv(inventory)消息把這些區(qū)塊的哈希值傳播出去。缺少這些區(qū)塊的節(jié)點(diǎn)便可以 通過各自發(fā)送的getdata消息來請求得到全區(qū)塊信息,用包含在inv消息中的哈希值來確認(rèn)是否為正確的被請求的區(qū)塊, 從而讀取這些缺失的區(qū)塊。
該節(jié)點(diǎn)會追蹤記錄其每個對等節(jié)點(diǎn)連接上“正在傳輸”(指那些它已經(jīng)發(fā)出了請求但還沒有接收到)的區(qū)塊數(shù)量,并且檢查該數(shù)量有沒有超過上限( MAX_BLOCKS_IN_TRANSIT_PER_PEER )。用這種辦法,如果一個節(jié)點(diǎn)需要更新大量區(qū)塊,它會在上一請求完成后才發(fā)送對新區(qū)塊的請求,從而允許對等節(jié)點(diǎn)控制更新速度,不至于壓垮網(wǎng)絡(luò)。
簡易支付驗(yàn)證 (Simplified Payment Verification (SPV) )節(jié)點(diǎn)
并非所有的節(jié)點(diǎn)都有能力儲存完整的區(qū)塊鏈。許多比特幣客戶端被設(shè)計成運(yùn)行在空間和功率受限的設(shè)備上,對于這樣的設(shè)備,通過簡化的支付驗(yàn)證(SPV)的方式可以使它們在不必存儲完整區(qū)塊鏈的情況下進(jìn)行工作。這種類型的客端被稱為SPV客戶端或輕量級客戶端。
SPV節(jié)點(diǎn)只需下載區(qū)塊頭,而不用下載包含在每個區(qū)塊中的交易信息。由此產(chǎn)生的不含交易信息的區(qū)塊鏈,大小只有完整區(qū)塊鏈的1/1000。SPV節(jié)點(diǎn)不能構(gòu)建所有可用于消費(fèi)的UTXO的全貌,這是由于它們并不知道網(wǎng)絡(luò)上所有交易的完整信息。SPV節(jié)點(diǎn)驗(yàn)證交易時所使用的方法略有不同,這個方法需依賴對等節(jié)點(diǎn)“按需”提供區(qū)塊鏈相關(guān)部分的局部視圖。
簡易支付驗(yàn)證是通過參考交易在區(qū)塊鏈中的深度,而不是高度,來驗(yàn)證它們。一個擁有完整區(qū)塊鏈的節(jié)點(diǎn)會構(gòu)造一條驗(yàn)證鏈,這條鏈?zhǔn)怯裳刂鴧^(qū)塊鏈按時間倒序一直追溯到創(chuàng)世區(qū)塊的數(shù)千區(qū)塊及交易組成。而一個SPV節(jié)點(diǎn)會驗(yàn)證所有區(qū)塊的鏈(但不是所有的交易),并且把區(qū)塊鏈和有關(guān)交易鏈接起來。
例如,一個全節(jié)點(diǎn)要檢查第300,000號區(qū)塊中的某個交易,它會把從該區(qū)塊開始一直回溯到創(chuàng)世區(qū)塊的300,000個區(qū)塊全部都鏈接起來,并建立一個完整的UTXO數(shù)據(jù)庫,通過確認(rèn)該UTXO是否還未被支付來證實(shí)交易的有效性。SPV節(jié)點(diǎn)則不能驗(yàn)證UTXO是否還未被支付。相反地,SPV節(jié)點(diǎn)會在該交易信息和它所在區(qū)塊之間用merkle路徑(見“ Merkle 樹”章節(jié))建立一條鏈接。然后SPV節(jié)點(diǎn)一直等待,直到序號從300,001到300,006的六個區(qū)塊堆疊在該交易所在的區(qū)塊之上,并通過確立交易的深度是在第300,006區(qū)塊~第300,001區(qū)塊之下來驗(yàn)證交易的有效性。事實(shí)上,如果網(wǎng)絡(luò)中的其他節(jié)點(diǎn)都接受了第300,000區(qū)塊,并通過足夠的工作在該塊之上又生成了六個區(qū)塊,根據(jù)代理網(wǎng)關(guān)協(xié)議,就可以證明該交易不是雙重支付。
如果一個交易實(shí)際上不存在,SPV節(jié)點(diǎn)不會誤認(rèn)為該交易存在于某區(qū)塊中。SPV節(jié)點(diǎn)會通過請求merkle路徑證明以及驗(yàn)證區(qū)塊鏈中的工作量證明,來證實(shí)交易的存在性。可是,一個交易的存在是可能對SPV節(jié)點(diǎn)“隱藏”的。SPV節(jié)點(diǎn)毫無疑問可以證實(shí)某個交易的存在性,但它不能驗(yàn)證某個交易(譬如同一個UTXO的雙重支付)不存在,這是因?yàn)镾PV節(jié)點(diǎn)沒有一份關(guān)于所有交易的記錄。
這個漏洞會被針對SPV節(jié)點(diǎn)的拒絕服務(wù)攻擊或雙重支付型攻擊所利用。為了防御這些攻擊,SPV節(jié)點(diǎn)需要隨機(jī)連接到多個節(jié)點(diǎn),以增加與至少一個可靠節(jié)點(diǎn)相連接的概率。這種隨機(jī)連接的需求意味著SPV節(jié) 點(diǎn)也容易受到網(wǎng)絡(luò)分區(qū)攻擊或Sybil攻擊。在后者情況中,SPV節(jié)點(diǎn)被連接到虛假節(jié)點(diǎn)或虛假網(wǎng)絡(luò)中,沒有通向可靠節(jié)點(diǎn)或真正的比特幣網(wǎng)絡(luò)的連接。
在絕大多數(shù)的實(shí)際情況中,具有良好連接的SPV節(jié)點(diǎn)是足夠安全的,它在資源需求、實(shí)用性和安全性之間維持恰當(dāng)?shù)钠胶狻.?dāng)然,如果要保證萬無一失的安全性,最可靠的方法還是運(yùn)行完整區(qū)塊鏈的節(jié)點(diǎn)。
總結(jié)
完整的區(qū)塊鏈節(jié)點(diǎn)是通過檢查整個鏈中在它之下的數(shù)千個區(qū)塊來保證這個UTXO沒有被支付,從而驗(yàn)證交易。而 SPV節(jié)點(diǎn)是通過檢查在其上面的區(qū)塊將它壓在下面的深度來驗(yàn)證交易。
隱私風(fēng)險
由于SPV節(jié)點(diǎn)需要讀取特定交易從而選擇性地驗(yàn)證交易,這樣就又產(chǎn)生了隱私風(fēng)險。與全區(qū)塊鏈節(jié)點(diǎn)收集每一個區(qū)塊內(nèi)的全部交易所不同的是,SPV節(jié)點(diǎn)對特定數(shù)據(jù)的請求可能無意中透露了錢包里的地址信息。例如,監(jiān)控網(wǎng)絡(luò)的第三方可以跟蹤某個SPV節(jié)點(diǎn)上的錢包所請求的全部交易信息,并且利用這些交易信息把比特幣地址和錢包的用戶關(guān)聯(lián)起來,從而損害了用戶的隱私。
在引入SPV節(jié)點(diǎn)/輕量級節(jié)點(diǎn)后不久,比特幣開發(fā)人員就添加了一個新功能:Bloom過濾器,用以解決SPV節(jié)點(diǎn)的隱私風(fēng) 險問題。Bloom過濾器通過一個采用概率而不是固定模式的過濾機(jī)制,允許SPV節(jié)點(diǎn)只接收交易信息的子集,同時不會精確泄露哪些是它們感興趣的地址。
Bloom過濾器
Bloom過濾器是一個允許用戶描述特定的關(guān)鍵詞組合而不必精確表述的基于概率的過濾方法。它能讓用戶在有效搜索關(guān)鍵詞的同時保護(hù)他們的隱私。在SPV節(jié)點(diǎn)里,這一方法被用來向?qū)Φ裙?jié)點(diǎn)發(fā)送交易信息查詢請求,同時交易地址不會被暴露。
Bloom過濾器可以讓SPV節(jié)點(diǎn)指定交易的搜索模式,該搜索模式可以基于準(zhǔn)確性或私密性的考慮被調(diào)節(jié)。一個非常具體 的Bloom過濾器會生成更準(zhǔn)確的結(jié)果,但也會顯示該用戶錢包里的使用的地址;反之,如果過濾器只包含簡單的關(guān)鍵 詞,更多相應(yīng)的交易會被搜索出來,在包含若干無關(guān)交易的同時有著更高的私密性。
Bloom過濾器如何工作
Bloom過濾器的實(shí)現(xiàn)是由一個可變長度(N)的二進(jìn)制數(shù)組(N位二進(jìn)制數(shù)構(gòu)成一個位域)和數(shù)量可變(M)的一組哈希函數(shù)組成。這些哈希函數(shù)的輸出值始終在1和N之間,該數(shù)值與二進(jìn)制數(shù)組相對應(yīng)。并且該函數(shù)為確定性函數(shù),也就是說任何一個使用相同Bloom過濾器的節(jié)點(diǎn)通過該函數(shù)都能對特定輸入得到同一個的結(jié)果。Bloom過濾器的準(zhǔn)確性和私密 性能通過改變長度(N)和哈希函數(shù)的數(shù)量(M)來調(diào)節(jié)。
SPV節(jié)點(diǎn)和隱私
實(shí)現(xiàn)SPV的節(jié)點(diǎn)的隱私比整個節(jié)點(diǎn)更弱。完整節(jié)點(diǎn)接收所有交易,因此不會顯示關(guān)于它的錢包中是否使用某個地址的信息。 SPV節(jié)點(diǎn)接收與其錢包中的地址相關(guān)的經(jīng)過過濾的列表。結(jié)果,它減少了所有者的隱私。
bloom過濾器是減少隱私損失的一種方式。沒有它們,SPV節(jié)點(diǎn)將不得不明確地列出它感興趣的地址,造成嚴(yán)重的隱私違規(guī)。然而,即使使用過濾器,對手監(jiān)控SPV客戶端的流量或直接連接到它的P2P網(wǎng)絡(luò)中的節(jié)點(diǎn)可以隨時隨地收集足夠的信息來了解SPV客戶端的錢包中的地址
加密和認(rèn)證連接
比特幣的大多數(shù)新用戶假設(shè)比特幣節(jié)點(diǎn)的網(wǎng)絡(luò)通信是加密的。其實(shí),比特幣的原始實(shí)現(xiàn)就很明顯地完成了。雖然這不是完整節(jié)點(diǎn)的主要隱私問題,但SPV節(jié)點(diǎn)是一個很大的問題。
作為增加比特幣P2P網(wǎng)絡(luò)隱私和安全性的一種方法,有兩種解決方案可以通過BIP-150/151提供通信加密:
- Tor傳輸
- P2P認(rèn)證和加密
Tor運(yùn)輸
Tor代表洋蔥路由網(wǎng)絡(luò),是一個軟件項(xiàng)目和網(wǎng)絡(luò),通過提供匿名,不可追蹤和隱私的隨機(jī)網(wǎng)絡(luò)路徑提供數(shù)據(jù)的加密和封裝。
Bitcoin Core提供了多種配置選項(xiàng),允許您運(yùn)行通過Tor網(wǎng)絡(luò)傳輸?shù)牧髁康谋忍貛殴?jié)點(diǎn)。此外,Bitcoin Core還可以提供Tor隱藏服務(wù),允許其他Tor節(jié)點(diǎn)通過Tor直接連接到您的節(jié)點(diǎn)。
從Bitcoin Core版本0.12開始,如果能夠連接到本地Tor服務(wù),節(jié)點(diǎn)將自動提供隱藏的Tor服務(wù)。如果您安裝Tor并且Bitcoin Core進(jìn)程作為具有足夠權(quán)限的用戶訪問Tor認(rèn)證cookie的用戶運(yùn)行,則應(yīng)自動運(yùn)行。
使用debug標(biāo)志打開Bitcoin Core對于Tor服務(wù)的調(diào)試,如下所示:
$ bitcoind --daemon --debug=tor
你應(yīng)該在日志中看到“tor:ADD_ONION success”,表示Bitcoin Core已經(jīng)向Tor網(wǎng)絡(luò)添加了隱藏的服務(wù)。
P2P對等認(rèn)證和加密
BIP-150和BIP-151兩種比特幣改進(jìn)方案在比特幣P2P網(wǎng)絡(luò)中增加了對P2P認(rèn)證和加密的支持。這兩個BIP定義了可由兼容的比特幣節(jié)點(diǎn)提供的可選服務(wù)。
BIP-151啟用了支持BIP-151的兩個節(jié)點(diǎn)之間的所有通信的協(xié)商加密。
BIP-150提供可選的對等認(rèn)證,允許節(jié)點(diǎn)使用ECDSA和私鑰對對方的身份進(jìn)行身份驗(yàn)證。
BIP-150要求在認(rèn)證之前,兩個節(jié)點(diǎn)按照BIP-151建立了加密通信。
截至2017年1月,BIP-150和BIP-151未在Bitcoin Core中實(shí)施。但是,這兩個提案已由至少一個名為bcoin的替代比特幣客戶端實(shí)施。 BIP-150和BIP-151允許用戶運(yùn)行連接到受信任的完整節(jié)點(diǎn)的SPV客戶端,使用加密和身份驗(yàn)證來保護(hù)SPV客戶端的隱私。
此外,可以使用身份驗(yàn)證來創(chuàng)建可信比特幣節(jié)點(diǎn)的網(wǎng)絡(luò),并防止中間人攻擊。最后,P2P加密(如果廣泛部署)將加強(qiáng)比特幣對流量分析和隱私侵權(quán)監(jiān)控的阻力,特別是在互聯(lián)網(wǎng)使用受到嚴(yán)格控制和監(jiān)控的極權(quán)主義國家。
交易池
交易池與孤立交易池
比特幣網(wǎng)絡(luò)中幾乎每個節(jié)點(diǎn)都會維護(hù)一份未確認(rèn)交易的臨時列表,被稱為內(nèi)存池或交易池。節(jié)點(diǎn)們利用這個池來追蹤記錄那些被網(wǎng)絡(luò)所知曉、但還未被區(qū)塊鏈所包含的交易。例如,保存用戶錢包的節(jié)點(diǎn)會利用這個交易池來記錄那些網(wǎng)絡(luò)已經(jīng)接收但還未被確認(rèn)的、屬于該用戶錢包的預(yù)支付信息。
隨著交易被接收和驗(yàn)證,它們被添加到交易池并通知到相鄰節(jié)點(diǎn)處,從而傳播到網(wǎng)絡(luò)中。
有些節(jié)點(diǎn)的實(shí)現(xiàn)還維護(hù)一個單獨(dú)的孤立交易池。如果一個交易的輸入與某未知的交易有關(guān),如與缺失的父交易相關(guān),該孤立交易就會被暫時儲存在孤立交易池中直到父交易的信息到達(dá)。
當(dāng)一個交易被添加到交易池中,會同時檢查孤立交易池,看是否有某個孤立交易引用了此交易的輸出(子交易)。任何匹配的孤立交易會被進(jìn)行驗(yàn)證。如果驗(yàn)證有效,它們會從孤立交易池中刪除,并添加到交易池中,使以其父交易開始的鏈變得完整。
對新加入交易池的交易來說,它不再是孤立交易。前述過程重復(fù)遞歸尋找進(jìn)一步的后代,直至所有的后代都被找到。通過這一過程,一個父交易的到達(dá)把整條鏈中的孤立交易和它們的父級交易重新結(jié)合在一起,從而觸發(fā)了整 條獨(dú)立交易鏈進(jìn)行級聯(lián)重構(gòu)。
交易池和孤立交易池(如有實(shí)施)都是存儲在本地內(nèi)存中,并不是存儲在永久性存儲設(shè)備(如硬盤)里。更準(zhǔn)確的說, 它們是隨網(wǎng)絡(luò)傳入的消息動態(tài)填充的。節(jié)點(diǎn)啟動時,兩個池都是空閑的;隨著網(wǎng)絡(luò)中新交易不斷被接收,兩個池逐漸被填充
UTXO池
有些比特幣客戶端的實(shí)現(xiàn)還維護(hù)一個UTXO數(shù)據(jù)庫,也稱UTXO池,是區(qū)塊鏈中所有未支付交易輸出的集合。
“UTXO 池”的名字聽上去與交易池相似,但它代表了不同的數(shù)據(jù)集。UTXO池不同于交易池和孤立交易池的地方在于,它在初始 化時不為空,而是包含了數(shù)以百萬計的未支付交易輸出條目,有些條目的歷史甚至可以追溯至2009年。UTXO池可能會被安置在本地內(nèi)存,或者作為一個包含索引的數(shù)據(jù)庫表安置在永久性存儲設(shè)備中。
區(qū)別
交易池和孤立交易池代表的是單個節(jié)點(diǎn)的本地視角。取決于節(jié)點(diǎn)的啟動時間或重啟時間,不同節(jié)點(diǎn)的兩池內(nèi)容可能有很大差別。相反地,UTXO池代表的是網(wǎng)絡(luò)的突顯共識,因此,不同節(jié)點(diǎn)間UTXO池的內(nèi)容差別不大。此外,交易池和孤立交易池只包含未確認(rèn)交易,而UTXO池之只包含已確認(rèn)交易。