比特幣代碼分析4 節點發現機制

當程序第一啓動時,它並不知道任何活躍節點的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種子查詢。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章