备注:为了简洁起见,文章只涉及了部分关键代码和结构。推荐下载源码,查看详细实现。
上个文章中实现了发送和接受version 和 verack,即建立连接。建立连接后需要保持连接,BTCD保持连接的方式是发送和接受 ping 和 pong 信息。
图说比特币 Part 2:心跳信息
pingHandle():两分钟发送一次ping消息,如果没收到返回信息就删除节点。 handlePongMsg():重置ping相关的信息(BIP0031 版本后)。 AssociateConnection():封装了part 1中发送和接受‘version和 ‘verack的过程。
ping pong 的流程都在Peer中完成。 每隔两分钟就会发送一次ping消息。 收到ping消息后返回pong消息。
为了测试方便,将interval改为2秒。setLogLevels("TRC"),log设置为trace等级。
$ go run ./ 2020-10-22 13:20:49.581 [DBG] PEER: Sending ping to 127.0.0.1:9333 (outbound) 2020-10-22 13:20:49.582 [DBG] PEER: Received pong from 127.0.0.1:9333 (outbound) 2020-10-22 13:20:49.582 [TRC] PEER: (*wire.MsgPong)(0xc000294150)({ Nonce: (uint64) 5412366295126488733 }) 2020-10-22 13:20:49.582 [TRC] PEER: ([]uint8) (len=8 cap=8) { 00000000 9d b6 4f 2f 78 96 1c 4b |..O/x..K| } 2020-10-22 13:20:51.579 [DBG] PEER: Sending ping to 127.0.0.1:9333 (outbound) 2020-10-22 13:20:51.580 [DBG] PEER: Received pong from 127.0.0.1:9333 (outbound) 2020-10-22 13:20:51.580 [TRC] PEER: (*wire.MsgPong)(0xc00013ccd0)({ Nonce: (uint64) 11266548846027506974 }) 2020-10-22 13:20:51.580 [TRC] PEER: ([]uint8) (len=8 cap=8) { 00000000 1e 85 0e 94 7b d2 5a 9c |....{.Z.| }本章主要完成两件事:
将part 1 的发送和接受version 和 verack封装到AssociateConnection()中。发送和接受 ping 和 pong 信息,从而保持连接。参考资料: BTCD 比特币消息协议 Tinybit 《比特币白皮书》 《解构区块链》
