背景
有些依赖时间弱同步假设的共识,比如PBFT,DPOS,和一些元胞自动机衍生(MoCA)的共识。在实现的时候需要得到消息的到达时间。
学习了一下以太坊如何处理区块到达时间的。这里记录一下。
消息中ReceivedAt的写入逻辑
一切的起点是p2p
模块的server.run()
函数
从这里开始,geth启动了p2p服务器。
func (srv *Server) run(dialstate dialer) {
srv.log.Info("Started P2P networking", "self", srv.localnode.Node().URLv4())
...
go srv.runPeer(p)
peers[c.node.ID()] = p
...
}
调用runPeer
函数 p2p/server.go, L1044 - L1067
func (srv *Server) runPeer(p *Peer) {
...
remoteRequested, err := p.run()
...
}
p2p服务器通过runPeer
函数,调用了peer
的run
函数
启动节点。
run函数中启动了各种监听,
func (p *Peer) run() (remoteRequested bool, err error) {
...
go p.readLoop(readErr)
go p.pingLoop()
...
}
跟进