比特幣代碼分析4 節點發現機制
阿新 • • 發佈:2018-12-04
避免 失敗 活動 自己的 發現 通過 代碼分析 社區 結果 當程序第一啟動時,它並不知道任何活躍節點的ip地址。為了發現一些全節點的ip地址,他們會查詢硬編碼在比特幣內核或BitCoinJ中的,一個或多個DNS域名,在返回的結果中應該包含一個或多個DNS A記錄,裏面有一些可接受新連接的全節點的ip地址。
DNS 種子由比特幣社區成員維護。其中一部分提供動態DNS種子服務器,它通過掃描比特幣網絡,自動獲取活動節點的ip地址;其他的提供一些靜態DNS種子,這需要手動更新,不過他們很有可能提供不活躍節點的ip地址。不管是動態的,還是靜態的DNS種子,如果節點在主網上運行在端口號8333,或在測試網絡運行在端口號18333,就會被加入到DNS種子。
DNS種子結果沒有被授權,一個惡意的DNS種子運營者或網絡中間人能返回僅被自己控制的節點的ip地址,在自己的網絡中,孤立節點,並給他們假的交易,區塊數據。因為這個原因,程序不應該只依賴一個DNS種子。
然而,節點通常會離開網絡或者改變ip地址,這樣程序在啟動時,在需要多次嘗試才有可能連接到比特幣網絡。這了會增加連接到比特幣網絡的延遲時間,使得用戶在發送交易或檢查支付狀態前,不得不等待一段時間。
為避免這種延遲,BitcoinJ總是使用動態DNS種子,來獲取那些被確定為活躍節點的IP地址。比特幣處內核也嘗試在降低延遲,避免使用不必要的DNS節點中權衡。如果比特幣內核在它的節點數據庫中有記錄,它就會用11秒時間去連接至少其中一個節點,失敗後,才使用DNS節點獲取ip地址;如果在11秒內成功建立連接,則不在向DNS種子查詢。
DNS 種子由比特幣社區成員維護。其中一部分提供動態DNS種子服務器,它通過掃描比特幣網絡,自動獲取活動節點的ip地址;其他的提供一些靜態DNS種子,這需要手動更新,不過他們很有可能提供不活躍節點的ip地址。不管是動態的,還是靜態的DNS種子,如果節點在主網上運行在端口號8333,或在測試網絡運行在端口號18333,就會被加入到DNS種子。
DNS種子結果沒有被授權,一個惡意的DNS種子運營者或網絡中間人能返回僅被自己控制的節點的ip地址,在自己的網絡中,孤立節點,並給他們假的交易,區塊數據。因為這個原因,程序不應該只依賴一個DNS種子。
為避免這種延遲,BitcoinJ總是使用動態DNS種子,來獲取那些被確定為活躍節點的IP地址。比特幣處內核也嘗試在降低延遲,避免使用不必要的DNS節點中權衡。如果比特幣內核在它的節點數據庫中有記錄,它就會用11秒時間去連接至少其中一個節點,失敗後,才使用DNS節點獲取ip地址;如果在11秒內成功建立連接,則不在向DNS種子查詢。
比特幣代碼分析4 節點發現機制