geth代码中变量简洁的命名方式让我看的真酸爽....
比如这种:
r := srv.DialRatio
fd net.Conn
还有go语言不需要声明的接口实现方式更是让人蛋疼,
暗搓搓的实现了这个接口,只能搜索一下才能知道丫实现了。
思路:
geth启动时启动了udp和tcp两个协议进行监听,默认30303端口,该端口用于节点发现和节点间消息通讯,8485端口是rpc调用时使用的,用来和客户端交互。
tcp监听实现了节点间传递消息,握手之后并不断开,一直在握手状态,节点间消息传递先进行密钥协商之后使用对称密钥进行消息加密传输,和ssl的过程类似
udp监听实现了节点查找
看代码:
1.入口main.go->utils.StartNode(stack)
2.p2p.server.go ->func (srv *Server) Start() (err error) 方法
这两部很简单,一步一步看过去就可以找到server.go,节点的维护代码几乎都在server.go中
3.server.go->func (srv *Server) listenLoop() {
比如这种:
r := srv.DialRatio
fd net.Conn
还有go语言不需要声明的接口实现方式更是让人蛋疼,
暗搓搓的实现了这个接口,只能搜索一下才能知道丫实现了。
思路:
geth启动时启动了udp和tcp两个协议进行监听,默认30303端口,该端口用于节点发现和节点间消息通讯,8485端口是rpc调用时使用的,用来和客户端交互。
tcp监听实现了节点间传递消息,握手之后并不断开,一直在握手状态,节点间消息传递先进行密钥协商之后使用对称密钥进行消息加密传输,和ssl的过程类似
udp监听实现了节点查找
看代码:
1.入口main.go->utils.StartNode(stack)
2.p2p.server.go ->func (srv *Server) Start() (err error) 方法
这两部很简单,一步一步看过去就可以找到server.go,节点的维护代码几乎都在server.go中
3.server.go->func (srv *Server) listenLoop() {