信譽如何在乙太坊 P2P 網路中發揮作用?
乙太坊 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 肯定還有其他缺陷)。