Network

網路節點如何“連接”——業餘水平

  • March 12, 2021

我在計算方面沒有什麼背景,一直在研究比特幣來激發智力。我學到了很多,並且對節點的功能、它們執行的驗證以及它們對比特幣功能的重要性了解了很多——但我想更多地了解網路中的節點如何“連接”。我讀了這個問題,但沒有幫助。

我不知道“網路”到底是什麼。我用Google搜尋並閱讀了有關 LAN/WAN 的資訊。這些是我們正在談論的網路類型嗎?

例如 - 如果我在比特幣現金分叉之前擁有比特幣,我的理解是我可以選擇將我的硬幣作為比特幣發送,或者作為比特幣現金發送,這取決於我將交易發送到哪個網路(有點,超過在這裡簡單化)。因此,如果我從比特幣錢包發送它,它將被廣播到比特幣網路並留在比特幣區塊鏈上,或者如果我從 bcash 錢包發送它,它將被格式化,但是 bcash 格式化 tx 消息並被廣播到 bcash 網路。這些“網路”如何運作,它們有何不同?我在哪裡可以閱讀更多關於此的資訊。

當然,如果我下載比特幣核心並開始執行一個完整的節點,它將開始將我連接到比特幣網路中的其他節點。這個過程實際上是如何進行的?不同的網路如何保持分離?我已經讀過“不誠實的節點”可以做的事情,所以如果不下載比特幣核心(我假設它會自動實現節點行為的標準協議),節點如何在不執行比特幣核心的情況下連接到網路?

希望有人能理解我的問題,我知道這可能不是很清楚,但那是因為我什至沒有足夠的知識來形成一個好的問題。我這裡沒有任何術語。

編輯:也許這將有助於理解。假設我想編寫一些程式碼來開發我自己的比特幣客戶端。那段程式碼是什麼樣的?

我不知道“網路”到底是什麼。我用Google搜尋並閱讀了有關 LAN/WAN 的資訊。這些是我們正在談論的網路類型嗎?

不,網路實際上只是“一組相互連接的事物”。一個範例確實是 LAN 網路,通過該 LAN 網路,物理上彼此靠近的多台電腦(家庭、辦公室……)相互連接。網際網路也是網路的一個例子——由像區域網路這樣的更小、更獨特的網路組成。

但網路的意義遠不止於此。您認識並與之交往的那群人也被視為一個網路。機器內部的電路有時稱為網路。我舉了這些例子,因為電腦環境中的“網路”這個詞經常讓人聯想到電腦之間物理互連的心理形象——雖然這是一個例子,但比特幣網路是完全不同的東西。

比特幣點對點網路由比特幣節點組成——軟體,而不是硬體。我可以在我自己的電腦上執行兩個節點,它們可以相互連接——也可以不連接;它們也可以都連接到世界其他地方的遙遠節點。事實上,這些連接甚至不需要通過 Internet 建立。已經有通過網狀網路連接比特幣節點的項目,你也可以認為 Blockstream衛星服務是該網路的一部分。

所以歸根結底,比特幣網路由相互通信的軟體組成。它們相互通信的方式可能不同,但最常見的是通過公共 Internet 或**Tor**的TCP/IP 連接。這些連接有點類似於您的瀏覽器與stackexchange.com建立的連接以向您顯示此答案,但不僅僅是許多客戶端(瀏覽器)與一個伺服器(stackexchange)交談,而是所有節點都是平等的 - 它們是同行。沒有伺服器和客戶端;只有節點,它們每個都連接到一個或多個其他節點。當然,有些比其他節點更強大或連接得更好,但沒有一個比其他節點具有特權地位。

這些“網路”如何運作,它們有何不同?

這就是有趣的地方。比特幣和類似的東西,遵循信任最小化的設計。至少如果你執行一個完全驗證的節點(比如比特幣核心),你的節點通常不會信任其他節點告訴它的任何東西。他們將交換塊、交易和其他東西,但無論你的節點收到什麼,它都會盡可能獨立地進行驗證。這包括非常嚴格的塊有效性規則。您的節點將只接受遵循軟體中實施的確切規則的塊。

您的問題的簡單答案是比特幣和山寨幣節點有不同的規則,並且根本不會接受彼此的塊。如果一個節點連接到具有不同規則的節點,它將被隔離,並且無法了解新的比特幣區塊;它至少需要一個連接到一個誠實的志同道合的節點。為了確保不會發生這種情況,節點會檢測到他們的對等方給他們認為無效的塊的情況,當這種情況發生時,更積極地尋找更多的節點來連接,如果他們真的有可能斷開現有的節點一個不同的想法。在實踐中,這會在分叉後快速教導兩側的節點避開另一側。

當然,如果我下載比特幣核心並開始執行一個完整的節點,它將開始將我連接到比特幣網路中的其他節點。這個過程實際上是如何進行的?

比特幣核心特別有許多控制連接的機制:

  • 它維護一個數據庫(稱為“addrman”),其中包含已知其他比特幣節點的 IP 地址(和 Tor 地址,如果正在使用),以及一些統計數據以及它是否已與其建立連接。要連接的新對等點是從此數據庫中提取的。最多進行 10 個連接,以免網路過載。該數據庫通過以下方式提供新資訊:

    • 節點相互八卦其他節點的 IP 地址( addrP2P 消息)。
    • 一些DNS 種子是硬編碼的,如果需要,可以要求提供更多 IP 地址。這僅在一段時間後無法建立足夠的連接時,通常僅在客戶端第一次執行時需要。之後,節點會自動找到更多的對等點進行連接。
    • 作為最後的手段,如果 DNS 查詢不能產生良好的網路連接,Bitcoin Core 也有一個硬編碼的 IP 地址列表來連接。
  • 使用者可以使用配置文件選項或connect=RPC命令手動指定要連接的對等方。addnode=``addnode

  • 節點也可以接受來自其他節點的傳入連接(這也有限制;預設情況下為 125 個連接,當連接已滿時,某些規則會優先考慮其他節點的對等點)。

節點如何在不執行比特幣核心的情況下連接到網路?

其他實現有自己的機制,但范圍很廣——從僅僅連接到錢包提供商的伺服器,到了解對等點並像比特幣核心一樣連接到它們。

假設我想編寫一些程式碼來開發我自己的比特幣客戶端。那段程式碼是什麼樣的?

這真的取決於你想做什麼。有許多語言的庫實現了 P2P 協議,讓您可以與其他節點對話,或者您可以從頭開始,只需遵循現有的協議文件和影響 P2P 協議的比特幣改進提案 ( BIP )。請記住,比特幣中沒有權威可以準確地告訴您“該”協議是什麼;提出建議,軟體開發人員實施或不實施。你會想通過不立即處理比特幣主網來測試事物,而是首先嘗試比特幣測試網或更新的“ signet ”測試網路。

引用自:https://bitcoin.stackexchange.com/questions/103495