比特幣采用了基于國際互聯(lián)網(wǎng)(Internet)的P2P(peer-to-peer)網(wǎng)絡(luò)架構(gòu)。P2P是指位于同一網(wǎng)絡(luò)中的每臺計(jì)算機(jī)都彼此對等卓缰,各個(gè)節(jié)點(diǎn)共同提供網(wǎng)絡(luò)服務(wù),不存在任何“特殊”節(jié)點(diǎn)。每個(gè)網(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é)同處理:每個(gè)節(jié)點(diǎn)在對外提供服務(wù)的同時(shí)也使用網(wǎng)絡(luò)中其他節(jié)點(diǎn)所提供的服務(wù)舵鳞。P2P網(wǎng)絡(luò)也因此具有可靠性震檩、去中心化,以及開放性蜓堕。
比特幣所采用的P2P網(wǎng)絡(luò)架構(gòu)不僅僅是選擇拓?fù)浣Y(jié)構(gòu)這樣簡單抛虏。比特幣被設(shè)計(jì)為一種點(diǎn)對點(diǎn)的數(shù)字現(xiàn)金系統(tǒng),它的網(wǎng)絡(luò)架構(gòu)既是這種核心特性的反映套才,也是該特性的基石迂猴。去中心化控制是設(shè)計(jì)時(shí)的核心原則,它只能通過維持一種扁平化背伴、去中心化的P2P共識網(wǎng)絡(luò)來實(shí)現(xiàn)沸毁。
“比特幣網(wǎng)絡(luò)”是按照比特幣P2P協(xié)議運(yùn)行的一系列節(jié)點(diǎn)的集合峰髓。除了比特幣P2P協(xié)議之外,比特幣網(wǎng)絡(luò)中也包含其他協(xié)議息尺。例如Stratum協(xié)議就被應(yīng)用于挖礦携兵、以及輕量級或移動(dòng)端比特幣錢包之中。
6.2 節(jié)點(diǎn)類型及分工
盡管比特幣P2P網(wǎng)絡(luò)中的各個(gè)節(jié)點(diǎn)相互對等搂誉,但是根據(jù)所提供的功能不同徐紧,各節(jié)點(diǎn)可能具有不同的分工。每個(gè)比特幣節(jié)點(diǎn)都是路由炭懊、區(qū)塊鏈數(shù)據(jù)庫并级、挖礦、錢包服務(wù)的功能集合凛虽。
一些節(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)用例中谐鼎,名為完整區(qū)塊鏈的藍(lán)色圓圈即表示了全節(jié)點(diǎn)區(qū)塊鏈數(shù)據(jù)庫功能。
挖礦節(jié)點(diǎn)通過運(yùn)行在特殊硬件設(shè)備上的工作量證明(proof-of-work)算法趣惠,以相互競爭的方式創(chuàng)建新的區(qū)塊狸棍。一些挖礦節(jié)點(diǎn)同時(shí)也是全節(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)用费韭;而這正變得越來越普遍。
圖6-2描述了擴(kuò)展比特幣網(wǎng)絡(luò)中最為常見的節(jié)點(diǎn)類型
6.3 擴(kuò)展比特幣網(wǎng)絡(luò)
運(yùn)行比特幣P2P協(xié)議的比特幣主網(wǎng)絡(luò)由大約7000-10000個(gè)運(yùn)行著不同版本比特幣核心客戶端(Bitcoin Core)的監(jiān)聽節(jié)點(diǎn)庭瑰、以及幾百個(gè)運(yùn)行著各類比特幣P2P協(xié)議的應(yīng)用(例如BitcoinJ星持、Libbitcoin、btcd等)的節(jié)點(diǎn)組成弹灭。比特幣P2P網(wǎng)絡(luò)中的一小部分節(jié)點(diǎn)也是挖礦節(jié)點(diǎn)钉汗,它們競爭挖礦羹令、驗(yàn)證交易、并創(chuàng)建新的區(qū)塊损痰。許多連接到比特幣網(wǎng)絡(luò)的大型公司運(yùn)行著基于Bitcoin核心客戶端的全節(jié)點(diǎn)客戶端,它們具有區(qū)塊鏈的完整拷貝及網(wǎng)絡(luò)節(jié)點(diǎn)酒来,但不具備挖礦及錢包功能卢未。這些節(jié)點(diǎn)是網(wǎng)絡(luò)中的邊緣路由器(edge routers),通過它們可以搭建其他服務(wù)堰汉,例如交易所辽社、錢包、區(qū)塊瀏覽器翘鸭、商家支付處理(merchant payment processing)等滴铅。
圖6-3描述了擴(kuò)展比特幣網(wǎng)絡(luò),它包括了多種類型的節(jié)點(diǎn)就乓、網(wǎng)關(guān)服務(wù)器汉匙、邊緣路由器、錢包客戶端以及它們相互連接所需的各類協(xié)議生蚁。
6.4 網(wǎng)絡(luò)發(fā)現(xiàn)
當(dāng)新的網(wǎng)絡(luò)節(jié)點(diǎn)啟動(dòng)后噩翠,為了能夠參與協(xié)同運(yùn)作,它必須發(fā)現(xiàn)網(wǎng)絡(luò)中的其他比特幣節(jié)點(diǎn)邦投。新的網(wǎng)絡(luò)節(jié)點(diǎn)必須發(fā)現(xiàn)至少一個(gè)網(wǎng)絡(luò)中存在的節(jié)點(diǎn)并建立連接伤锚。由于比特幣網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)并不基于節(jié)點(diǎn)間的地理位置,因此各個(gè)節(jié)點(diǎn)之間的地理信息完全無關(guān)志衣。在新節(jié)點(diǎn)連接時(shí)屯援,可以隨機(jī)選擇網(wǎng)絡(luò)中存在的比特幣節(jié)點(diǎn)與之相連轧铁。
節(jié)點(diǎn)通常采用TCP協(xié)議鲸沮、使用8333端口(該端口號通常是比特幣所使用的,除8333端口外也可以指定使用其他端口)與已知的對等節(jié)點(diǎn)建立連接缨睡。
新節(jié)點(diǎn)是如何發(fā)現(xiàn)網(wǎng)絡(luò)中的對等節(jié)點(diǎn)的呢和二?雖然比特幣網(wǎng)絡(luò)中沒有特殊節(jié)點(diǎn)徘铝,但是客戶端會(huì)維持一個(gè)列表,那里列出了那些長期穩(wěn)定運(yùn)行的節(jié)點(diǎn)惯吕。這樣的節(jié)點(diǎn)被稱為“種子節(jié)點(diǎn)(seed nodes)”惕它。新節(jié)點(diǎn)并不一定需要與種子節(jié)點(diǎn)建立連接,但連接到種子節(jié)點(diǎn)的好處是可以通過種子節(jié)點(diǎn)來快速發(fā)現(xiàn)網(wǎng)絡(luò)中的其他節(jié)點(diǎn)废登。在比特幣核心客戶端中淹魄,是否使用種子節(jié)點(diǎn)是通過“-dnsseed”控制的。默認(rèn)情況下堡距,該選項(xiàng)設(shè)為1甲锡,即意味著使用種子節(jié)點(diǎn)兆蕉。另一種方式是,起始時(shí)將至少一個(gè)比特幣節(jié)點(diǎn)的IP地址提供給正在啟動(dòng)的節(jié)點(diǎn)(該節(jié)點(diǎn)不包含任何比特幣網(wǎng)絡(luò)的組成信息)缤沦。在這之后虎韵,啟動(dòng)節(jié)點(diǎn)可以通過后續(xù)指令建立新的連接。用戶可以使用命令行參數(shù)“-seednode”把啟動(dòng)節(jié)點(diǎn)“引薦”并連接到一個(gè)節(jié)點(diǎn)缸废,并將該節(jié)點(diǎn)用作DNS種子包蓝。在初始種子節(jié)點(diǎn)被用于形成“引薦”信息之后,客戶端會(huì)斷開與它的連接企量、并與新發(fā)現(xiàn)的對等節(jié)點(diǎn)進(jìn)行通信测萎。
當(dāng)建立一個(gè)或多個(gè)連接后,新節(jié)點(diǎn)將一條包含自身IP地址的addr消息發(fā)送給其相鄰節(jié)點(diǎn)届巩。相鄰節(jié)點(diǎn)再將此條addr消息依次轉(zhuǎn)發(fā)給它們各自的相鄰節(jié)點(diǎn)硅瞧,從而保證新節(jié)點(diǎn)信息被多個(gè)節(jié)點(diǎn)所接收、保證連接更穩(wěn)定恕汇。另外腕唧,新接入的節(jié)點(diǎn)可以向它的相鄰節(jié)點(diǎn)發(fā)送getaddr消息,要求它們返回其已知對等節(jié)點(diǎn)的IP地址列表拇勃。通過這種方式四苇,節(jié)點(diǎn)可以找到需連接到的對等節(jié)點(diǎn),并向網(wǎng)絡(luò)發(fā)布它的消息以便其他節(jié)點(diǎn)查找方咆。
節(jié)點(diǎn)必須連接到若干不同的對等節(jié)點(diǎn)才能在比特幣網(wǎng)絡(luò)中建立通向比特幣網(wǎng)絡(luò)的種類各異的路徑(path)月腋。由于節(jié)點(diǎn)可以隨時(shí)加入和離開,通訊路徑是不可靠的瓣赂。因此榆骚,節(jié)點(diǎn)必須持續(xù)進(jìn)行兩項(xiàng)工作:在失去已有連接時(shí)發(fā)現(xiàn)新節(jié)點(diǎn),并在其他節(jié)點(diǎn)啟動(dòng)時(shí)為其提供幫助煌集。節(jié)點(diǎn)啟動(dòng)時(shí)只需要一個(gè)連接妓肢,因?yàn)榈谝粋€(gè)節(jié)點(diǎn)可以將它引薦給它的對等節(jié)點(diǎn),而這些節(jié)點(diǎn)又會(huì)進(jìn)一步提供引薦苫纤。一個(gè)節(jié)點(diǎn)碉钠,如果連接到大量的其他對等節(jié)點(diǎn),這既沒必要卷拘,也是對網(wǎng)絡(luò)資源的浪費(fèi)喊废。在啟動(dòng)完成后,節(jié)點(diǎn)會(huì)記住它最近成功連接的對等節(jié)點(diǎn)栗弟;因此污筷,當(dāng)重新啟動(dòng)后它可以迅速與先前的對等節(jié)點(diǎn)網(wǎng)絡(luò)重新建立連接。如果先前的網(wǎng)絡(luò)的對等節(jié)點(diǎn)對連接請求無應(yīng)答乍赫,該節(jié)點(diǎn)可以使用種子節(jié)點(diǎn)進(jìn)行重啟動(dòng)瓣蛀。
如果已建立的連接沒有數(shù)據(jù)通信陆蟆,所在的節(jié)點(diǎn)會(huì)定期發(fā)送信息以維持連接。如果節(jié)點(diǎn)持續(xù)某個(gè)連接長達(dá)90分鐘沒有任何通信惋增,它會(huì)被認(rèn)為已經(jīng)從網(wǎng)絡(luò)中斷開叠殷,網(wǎng)絡(luò)將開始查找一個(gè)新的對等節(jié)點(diǎn)。因此器腋,比特幣網(wǎng)絡(luò)會(huì)隨時(shí)根據(jù)變化的節(jié)點(diǎn)及網(wǎng)絡(luò)問題進(jìn)行動(dòng)態(tài)調(diào)整溪猿,不需經(jīng)過中心化的控制即可進(jìn)行規(guī)模增、減的有機(jī)調(diào)整纫塌。
6.5 全節(jié)點(diǎn)
全節(jié)點(diǎn)是指維持包含全部交易信息的完整區(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ū)塊鏈拷貝之中凉逛。
6.6 交換“庫存清單”
一個(gè)全節(jié)點(diǎn)連接到對等節(jié)點(diǎn)之后,第一件要做的事情就是構(gòu)建完整的區(qū)塊鏈群井。如果該節(jié)點(diǎn)是一個(gè)全新節(jié)點(diǎn)状飞,那么它就不包含任何區(qū)塊鏈信息,它只知道一個(gè)區(qū)塊——靜態(tài)植入在客戶端軟件中的創(chuàng)世區(qū)塊书斜。新節(jié)點(diǎn)需要下載從0號區(qū)塊(創(chuàng)世區(qū)塊)開始的數(shù)十萬區(qū)塊的全部內(nèi)容诬辈,才能跟網(wǎng)絡(luò)同步、并重建全區(qū)塊鏈荐吉。
6.7 簡易支付驗(yàn)證 (SPV)節(jié)點(diǎn)
并非所有的節(jié)點(diǎn)都有能力儲存完整的區(qū)塊鏈焙糟。許多比特幣客戶端被設(shè)計(jì)成運(yùn)行在空間和功率受限的設(shè)備上,如智能電話样屠、平板電腦穿撮、嵌入式系統(tǒng)等。對于這樣的設(shè)備痪欲,通過簡化的支付驗(yàn)證(SPV)的方式可以使它們在不必存儲完整區(qū)塊鏈的情況下進(jìn)行工作悦穿。這種類型的客端被稱為SPV客戶端或輕量級客戶端。
SPV節(jié)點(diǎn)只需下載區(qū)塊頭勤揩,而不用下載包含在每個(gè)區(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)證交易時(shí)所使用的方法略有不同,這個(gè)方法需依賴對等節(jié)點(diǎn)“按需”提供區(qū)塊鏈相關(guān)部分的局部視圖蛙埂。
簡易支付驗(yàn)證是通過參考交易在區(qū)塊鏈中的深度倦畅,而不是高度,來驗(yàn)證它們绣的。一個(gè)擁有完整區(qū)塊鏈的節(jié)點(diǎn)會(huì)構(gòu)造一條驗(yàn)證鏈叠赐,這條鏈?zhǔn)怯裳刂鴧^(qū)塊鏈按時(shí)間倒序一直追溯到創(chuàng)世區(qū)塊的數(shù)千區(qū)塊及交易組成。而一個(gè)SPV節(jié)點(diǎn)會(huì)驗(yàn)證所有區(qū)塊的鏈(但不是所有的交易)屡江,并且把區(qū)塊鏈和有關(guān)交易鏈接起來芭概。
例如,一個(gè)全節(jié)點(diǎn)要檢查第300,000號區(qū)塊中的某個(gè)交易惩嘉,它會(huì)把從該區(qū)塊開始一直回溯到創(chuàng)世區(qū)塊的300,000個(gè)區(qū)塊全部都鏈接起來罢洲,并建立一個(gè)完整的UTXO數(shù)據(jù)庫,通過確認(rèn)該UTXO是否還未被支付來證實(shí)交易的有效性文黎。SPV節(jié)點(diǎn)則不能驗(yàn)證UTXO是否還未被支付惹苗。相反地,SPV節(jié)點(diǎn)會(huì)在該交易信息和它所在區(qū)塊之間用merkle路徑(見“7.7 Merkle樹”)建立一條鏈接耸峭。然后SPV節(jié)點(diǎn)一直等待桩蓉,直到序號從300,001到300,006的六個(gè)區(qū)塊堆疊在該交易所在的區(qū)塊之上,并通過確立交易的深度是在第300,006區(qū)塊~第300,001區(qū)塊之下來驗(yàn)證交易的有效性劳闹。事實(shí)上院究,如果網(wǎng)絡(luò)中的其他節(jié)點(diǎn)都接受了第300,000區(qū)塊,并通過足夠的工作在該塊之上又生成了六個(gè)區(qū)塊玷或,根據(jù)代理網(wǎng)關(guān)協(xié)議儡首,就可以證明該交易不是雙重支付。
如果一個(gè)交易實(shí)際上不存在偏友,SPV節(jié)點(diǎn)不會(huì)誤認(rèn)為該交易存在于某區(qū)塊中蔬胯。SPV節(jié)點(diǎn)會(huì)通過請求merkle路徑證明以及驗(yàn)證區(qū)塊鏈中的工作量證明,來證實(shí)交易的存在性位他》毡簦可是,一個(gè)交易的存在是可能對SPV節(jié)點(diǎn)“隱藏”的鹅髓。SPV節(jié)點(diǎn)毫無疑問可以證實(shí)某個(gè)交易的存在性舞竿,但它不能驗(yàn)證某個(gè)交易(譬如同一個(gè)UTXO的雙重支付)不存在,這是因?yàn)镾PV節(jié)點(diǎn)沒有一份關(guān)于所有交易的記錄窿冯。這個(gè)漏洞會(huì)被針對SPV節(jié)點(diǎn)的拒絕服務(wù)攻擊或雙重支付型攻擊所利用骗奖。為了防御這些攻擊,SPV節(jié)點(diǎn)需要隨機(jī)連接到多個(gè)節(jié)點(diǎn),以增加與至少一個(gè)可靠節(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)。
完整的區(qū)塊鏈節(jié)點(diǎn)是通過檢查整個(gè)鏈中在它之下的數(shù)千個(gè)區(qū)塊來保證這個(gè)UTXO沒有被支付亡问,從而驗(yàn)證交易馍惹。而SPV節(jié)點(diǎn)是通過檢查在其上面的區(qū)塊將它壓在下面的深度來驗(yàn)證交易。
SPV節(jié)點(diǎn)使用的是一條getheaders消息玛界,而不是getblocks消息來獲得區(qū)塊頭。發(fā)出響應(yīng)的對等節(jié)點(diǎn)將用一條headers消息發(fā)送多達(dá)2000個(gè)區(qū)塊頭悼吱。這一過程和全節(jié)點(diǎn)獲取所有區(qū)塊的過程沒什么區(qū)別慎框。SPV節(jié)點(diǎn)還在與對等節(jié)點(diǎn)的連接上設(shè)置了過濾器,用以過濾從對等節(jié)點(diǎn)發(fā)來的未來區(qū)塊和交易數(shù)據(jù)流后添。任何目標(biāo)交易都是通過一條getdata的請求來讀取的笨枯。對等節(jié)點(diǎn)生成一條包含交易信息的tx消息作為響應(yīng)。
由于SPV節(jié)點(diǎn)需要讀取特定交易從而選擇性地驗(yàn)證交易遇西,這樣就又產(chǎn)生了隱私風(fēng)險(xiǎn)馅精。與全區(qū)塊鏈節(jié)點(diǎn)收集每一個(gè)區(qū)塊內(nèi)的全部交易所不同的是,SPV節(jié)點(diǎn)對特定數(shù)據(jù)的請求可能無意中透露了錢包里的地址信息粱檀。例如洲敢,監(jiān)控網(wǎng)絡(luò)的第三方可以跟蹤某個(gè)SPV節(jié)點(diǎn)上的錢包所請求的全部交易信息,并且利用這些交易信息把比特幣地址和錢包的用戶關(guān)聯(lián)起來茄蚯,從而損害了用戶的隱私压彭。
在引入SPV節(jié)點(diǎn)/輕量級節(jié)點(diǎn)后不久,比特幣開發(fā)人員就添加了一個(gè)新功能:Bloom過濾器渗常,用以解決SPV節(jié)點(diǎn)的隱私風(fēng)險(xiǎn)問題壮不。Bloom過濾器通過一個(gè)采用概率而不是固定模式的過濾機(jī)制,允許SPV節(jié)點(diǎn)只接收交易信息的子集皱碘,同時(shí)不會(huì)精確泄露哪些是它們感興趣的地址询一。
6.8 Bloom過濾器
Bloom過濾器是一個(gè)允許用戶描述特定的關(guān)鍵詞組合而不必精確表述的基于概率的過濾方法。它能讓用戶在有效搜索關(guān)鍵詞的同時(shí)保護(hù)他們的隱私。在SPV節(jié)點(diǎn)里健蕊,這一方法被用來向?qū)Φ裙?jié)點(diǎn)發(fā)送交易信息查詢請求菱阵,同時(shí)交易地址不會(huì)被暴露。
用我們之前的例子绊诲,一位手中沒有地圖的游客需要詢問去特定地方的路線送粱。如果他向陌生人詢問“教堂街23號在哪里”,不經(jīng)意之間掂之,他就暴露了自己的目的地抗俄。Bloom過濾器則會(huì)這樣問,附近有帶‘堂’字的街道嗎世舰?”這樣的問法包含了比之前略少的關(guān)鍵詞动雹。這位游客可以自己選擇包含信息的多少,比如“以‘堂街’結(jié)尾”或者“‘教’字開頭的街道”跟压。如果他問得越少胰蝠,得到了更多可能的地址,隱私得到了保護(hù)震蒋,但這些地址里面不乏無關(guān)的結(jié)果茸塞;如果他問得非常具體,他在得到較準(zhǔn)確的結(jié)果的同時(shí)也暴露了自己的隱私查剖。
Bloom過濾器可以讓SPV節(jié)點(diǎn)指定交易的搜索模式钾虐,該搜索模式可以基于準(zhǔn)確性或私密性的考慮被調(diào)節(jié)。
6.10 交易池
比特幣網(wǎng)絡(luò)中幾乎每個(gè)節(jié)點(diǎn)都會(huì)維護(hù)一份未確認(rèn)交易的臨時(shí)列表笋庄,被稱為內(nèi)存池或交易池效扫。節(jié)點(diǎn)們利用這個(gè)池來追蹤記錄那些被網(wǎng)絡(luò)所知曉、但還未被區(qū)塊鏈所包含的交易直砂。例如菌仁,保存用戶錢包的節(jié)點(diǎn)會(huì)利用這個(gè)交易池來記錄那些網(wǎng)絡(luò)已經(jīng)接收但還未被確認(rèn)的、屬于該用戶錢包的預(yù)支付信息静暂。
隨著交易被接收和驗(yàn)證济丘,它們被添加到交易池并通知到相鄰節(jié)點(diǎn)處,從而傳播到網(wǎng)絡(luò)中籍嘹。
有些節(jié)點(diǎn)的實(shí)現(xiàn)還維護(hù)一個(gè)單獨(dú)的孤立交易池闪盔。如果一個(gè)交易的輸入與某未知的交易有關(guān),如與缺失的父交易相關(guān)辱士,該孤立交易就會(huì)被暫時(shí)儲存在孤立交易池中直到父交易的信息到達(dá)泪掀。
當(dāng)一個(gè)交易被添加到交易池中,會(huì)同時(shí)檢查孤立交易池颂碘,看是否有某個(gè)孤立交易引用了此交易的輸出(子交易)异赫。任何匹配的孤立交易會(huì)被進(jìn)行驗(yàn)證椅挣。如果驗(yàn)證有效,它們會(huì)從孤立交易池中刪除塔拳,并添加到交易池中鼠证,使以其父交易開始的鏈變得完整。對新加入交易池的交易來說靠抑,它不再是孤立交易量九。前述過程重復(fù)遞歸尋找進(jìn)一步的后代,直至所有的后代都被找到颂碧。通過這一過程荠列,一個(gè)父交易的到達(dá)把整條鏈中的孤立交易和它們的父級交易重新結(jié)合在一起,從而觸發(fā)了整條獨(dú)立交易鏈進(jìn)行級聯(lián)重構(gòu)载城。
交易池和孤立交易池(如有實(shí)施)都是存儲在本地內(nèi)存中肌似,并不是存儲在永久性存儲設(shè)備(如硬盤)里。更準(zhǔn)確的說诉瓦,它們是隨網(wǎng)絡(luò)傳入的消息動(dòng)態(tài)填充的川队。節(jié)點(diǎn)啟動(dòng)時(shí),兩個(gè)池都是空閑的睬澡;隨著網(wǎng)絡(luò)中新交易不斷被接收固额,兩個(gè)池逐漸被填充。
有些比特幣客戶端的實(shí)現(xiàn)還維護(hù)一個(gè)UTXO數(shù)據(jù)庫煞聪,也稱UTXO池对雪,是區(qū)塊鏈中所有未支付交易輸出的集合∶兹疲“UTXO池”的名字聽上去與交易池相似,但它代表了不同的數(shù)據(jù)集馋艺。UTXO池不同于交易池和孤立交易池的地方在于栅干,它在初始化時(shí)不為空,而是包含了數(shù)以百萬計(jì)的未支付交易輸出條目捐祠,有些條目的歷史甚至可以追溯至2009年碱鳞。UTXO池可能會(huì)被安置在本地內(nèi)存,或者作為一個(gè)包含索引的數(shù)據(jù)庫表安置在永久性存儲設(shè)備中踱蛀。
交易池和孤立交易池代表的是單個(gè)節(jié)點(diǎn)的本地視角窿给。取決于節(jié)點(diǎn)的啟動(dòng)時(shí)間或重啟時(shí)間,不同節(jié)點(diǎn)的兩池內(nèi)容可能有很大差別率拒。相反地崩泡,UTXO池代表的是網(wǎng)絡(luò)的突顯共識,因此猬膨,不同節(jié)點(diǎn)間UTXO池的內(nèi)容差別不大角撞。此外,交易池和孤立交易池只包含未確認(rèn)交易,而UTXO池之只包含已確認(rèn)交易谒所。
6.11 警告消息
警告消息并不經(jīng)常使用热康,但在大多數(shù)節(jié)點(diǎn)上都有此功能。警告消息是比特幣的“緊急廣播系統(tǒng)”劣领,比特幣核心開發(fā)人員可以借此功能給所有比特幣節(jié)點(diǎn)發(fā)送緊急文本消息姐军。這一功能是為了讓核心開發(fā)團(tuán)隊(duì)將比特幣網(wǎng)絡(luò)的嚴(yán)重問題通知所有的比特幣用戶,例如一個(gè)需要用戶采取措施的的嚴(yán)重bug尖淘。