本文是《循序渐进比特币》第三篇。为什么要讲解启动过程呢?只有找到了程序入口,学会调试,开始尝试着阅读源码,才能更好地了解系统运行原理。btcd启动的源码位于这儿。
btcd 启动主要分了三步:
- 加载配置
- 新建server
- server启动。
其他步骤(比如启动关闭监听routine、cpu profile等)不是核心流程,我们暂时忽略。如果感兴趣,可以自己阅读源码哦~
下面我们来分析一下每一步的主要流程。
1 加载配置
加载配置的代码位置: loadConfig 函数
流程图如下:
其中,如下几点需要关注一下,在以后的文章中,可能会用到这些点,或者重点展开讲解这西点。
- Listener 配置:是指节点的ip、port, 如果不配置,会读取默认值。
- rpc Server: 只有配置了rpc相关的设置,才会启动rpc server。
- addPeer: 是指启动时链接特定的peer。 如果指定了,则使用这些peer信息; 如果没有指定,在mainnet的场景下,会使用DNSSeed中指定的peer。
- minrelaytxfee: 设定了交易手续费的最低金额,如果低于这个金额,则交易很难被打包。
- BlockMaxSize: 设定了区块的大小,这也限制了每个区块最大能够打包的交易数目。默认1M
2 新建server
newServer代码地址
newServer的主要流程如下:
其中有几个点需要解释一下:
- addrManager: 是地址管理器,可以理解是比特币中address的管理器
- initListeners: 配置net listeners。
- checkPoint检查: 是用来检查历史区块中,某些高度上比特币区块的正确性的,进而保证区块同步的准确性。如果你要使用比特币的源码创建自己的山寨币,checkPoint需要设置为空。
- feeEstimator: 目前还没看到什么用途,等到后续用到时,再分析。如果你知道,可以留言告诉我哈,不胜感激~
- syncManager创建: 这一步除了新建了一个同步管理器,而且还监听了链相关的通知消息,主要是NTBlockAccepted、NTBlockConnected、NTBlockDisconnected消息。 相关代码地址。
- rpcListener server创建: 除了创建了rpcServer, 而且新建了websocket 消息管理器,订阅了链相关的通知。同syncManager创建的消息类型一样。
3 启动server
server.Start代码地址
流程图如下:
看流程图就几步,其实内部不少。有几个注意点:
- s.peerHandler: 很重要,里面有地址管理器、数据同步管理器、链接管理器的启动。
(1)地址管理器启动时,定义了一个addressHandler的routine, 主要的作用是记录address,方便下次重启时可以直接读取 。
(2)数据同步管理器则定义了一个blockHandler的routine,虽然叫blockHandler,实际会处理区块、消息、peer、库存等多种消息。感兴趣,自己看源码吧~。
(3)链接管理器则对于”进来的peer请求(inbound)“、"要出去请求其他peer(outbound)"的操作分开了。其中定义了connHandler处理所有”进来的peer请求“,并且启动listenHandler 来处理即将建立链接的请求; 对于要链接其他peer的(outbound),则创建newConnReq. 这部分还涉及到了DNSSeed的问题,如果是主网而且没有指定链接哪个peer去同步数据,则默认使用DNSSeed列表中的peer。 如果你想创建自己的山寨币,这儿地方可以改成自己的peer地址信息哦~- rebroadcastHandler: 跟踪用户已经提交并发送,但是还没有被写入区块的库存信息。
- rpcServer.start:分了http请求跟web socket请求两种。
- cpuMiner.start: 核心的逻辑在miningWorkerController , 后续会有专门的文章分析挖矿逻辑。这儿不展开了。
4 总结
本文结合比特币源码,分析了btcd启动过程。从加载配置、服务定义、服务启动三个方面进行了讲解。虽然这篇是源码分析,但是文中并没有贴代码片段,而是放了链接。如果对实现细节感兴趣,可以根据链接,自己去探究。如果遇到问题,欢迎留言,我们一起讨论,提高。
5 参考文献
6 其他
本文是《循序渐进比特币》的第三篇-《btcd版比特币节点-启动过程源码分析》。
如果有疑问,可以直接留言,也可以关注公众号 “链人成长chainerup” 提问留言,或者加入知识星球“链人成长”~
网友评论