Go-Ethereum

信譽如何在乙太坊 P2P 網路中發揮作用?

  • March 3, 2019

乙太坊 P2P 網路中的節點為其對等節點分配聲譽,以跟踪他們過去的表現,並評估與他們斷開連接是否更可取。

Geth、Parity 和/或其他客戶端用於確定對等點的聲譽的確切規則是什麼?特別是,誠實是否足以獲得良好甚至最佳的聲譽,或者這是否也需要有用

對等體在什麼情況下斷開連接?信譽是否在連接的生命週期之後被記住並用於對等點的選擇(例如,為了防止壞對等點立即重新連接)?

我能找到的關於該主題的唯一文件NewBlockHashes消息類型文件的摘錄:

包括發送節點可以合理地被認為知道的雜湊(由於他們之前被告知,因為該節點本身已經通過 通告了雜湊的知識NewBlockHashes)被認為是錯誤的形式,並且可能會降低發送節點的聲譽。

Geth、Parity 和/或其他客戶端用於確定對等點的聲譽的確切規則是什麼?

確切的答案是每個客戶端的原始碼。為了回答這個問題,我只查看了 Geth 的來源,我無法談論 Parity 的作用。

特別是,誠實是否足以獲得良好甚至最佳的聲譽,或者這是否也需要有用?

在查看 Geth 之後,似乎唯一考慮的是有用性。Geth 能夠快速接收數據的遠端節點優先用於未來的請求。

對等體在什麼情況下斷開連接?

如果您在eth/downloader/downloader.go中搜尋“errBadPeer”,您會得到一些範例。一般來說,當遠端對等方給出無效的 Geth 響應時,它會斷開連接,例如當 Geth 要求不同的塊頭時返回一個塊頭。

信譽是否在連接的生命週期之後被記住並用於對等點的選擇(例如,為了防止壞對等點立即重新連接)?

據我所知(在閱讀程式碼大約 10 分鐘後)Geth 對不良同行沒有記憶。它只是斷開連接並忘記所有關於對等點的資訊。


在 geth 的源中搜尋“reputation”只會在eth/downloader/peer.go中找到匹配項。

它有一些看起來像這樣的塊:

// HeaderIdlePeers retrieves a flat list of all the currently header-idle peers
// within the active peer set, ordered by their reputation.
func (ps *peerSet) HeaderIdlePeers() ([]*peerConnection, int) {
   idle := func(p *peerConnection) bool {
       return atomic.LoadInt32(&p.headerIdle) == 0
   }
   throughput := func(p *peerConnection) float64 {
       p.lock.RLock()
       defer p.lock.RUnlock()
       return p.headerThroughput
   }
   return ps.idlePeers(62, 64, idle, throughput)
}

塊都呼叫idlePeers

// idlePeers retrieves a flat list of all currently idle peers satisfying the
// protocol version constraints, using the provided function to check idleness.
// The resulting set of peers are sorted by their measure throughput.
func (ps *peerSet) idlePeers(minProtocol, maxProtocol int, idleCheck func(*peerConnection) bool, throughput func(*peerConnection) float64) ([]*peerConnection, int) {
   ps.lock.RLock()
   defer ps.lock.RUnlock()


   idle, total := make([]*peerConnection, 0, len(ps.peers)), 0
   for _, p := range ps.peers {
       if p.version >= minProtocol && p.version <= maxProtocol {
           if idleCheck(p) {
               idle = append(idle, p)
           }
           total++
       }
   }
   for i := 0; i < len(idle); i++ {
       for j := i + 1; j < len(idle); j++ {
           if throughput(idle[i]) < throughput(idle[j]) {
               idle[i], idle[j] = idle[j], idle[i]
           }
       }
   }
   return idle, total
}

idlePeers,似乎沒有跟踪聲譽。相反,它根據測量的吞吐量對對等點進行排序。有趣的是,它使用冒泡排序:)

乙太坊區塊鏈在稱為Ethash的實現中使用了工作量證明 (PoW) 變體。PoW 不涉及聲譽。您正在閱讀的聲譽可能是指“鏈下”聲譽,例如公眾蔑視或第二層聲譽引擎,它們根據礦工聲譽的某些計算量度(例如聯合曲線和 TCR)來跟踪和獎勵/懲罰。

乙太坊和其他組織的研究人員都在進行許多嘗試,以擺脫 PoW 式的共識機制——這些機制賦予那些擁有更大計算能力的人,從而鼓勵硬體集中化/共謀——轉向那些重視“誠實參與者”的機制,例如證明-Stake (PoS),基本上,礦工在其中質押他們的錢,如果他們對狀態變化“錯誤”,就會失去它。你可以在這里這裡閱讀更多關於爵士樂的資訊。

關於你的最後一個問題:

信譽是否在連接的生命週期之後被記住並用於對等點的選擇(例如,為了防止壞對等點立即重新連接)?

這暗示了為什麼精英的、基於聲譽的共識算法如此難以想像的眾多原因之一。它與Sybil 抵抗有關。如果我是一個在關注聲譽的 PoW 區塊鏈中聲譽不佳的礦工,那麼我總是可以從新地址(即新身份)開始挖礦,因此 PoW 實施不關心任何形式的聲譽。PoS 在這方面做得更好,因為無論你擁有多少“身份”,你都只能擁有這麼多錢(儘管 PoS 肯定還有其他缺陷)。

引用自:https://ethereum.stackexchange.com/questions/46210