深入理解以太坊 (43):技术架构 3.5.1

阅读数:74 2020 年 1 月 18 日 20:04

深入理解以太坊(43):技术架构 3.5.1

(节点管理启动)

内容简介
这是一本从原理和实践两个层面系统、深入讲解以太坊技术的专著,从设计理念、技术架构、共识算法、智能合约、以太坊虚拟机、开发工具、DApp 开发、企业以太坊解决方案、跨链技术等近 10 个方面进行了详细讲解,既适合初学者系统学习以太坊的原理和应用开发,又适合有一定基础的开发者深入掌握以太坊的底层运行机制。
全书一共 11 章:
第 1~3 章对以太坊的系统架构、设计理念和技术架构进行了系统介绍,包括以太坊项目的起源和发展路线图、核心技术、共识问题、图灵完备性、整体设计思路和各模块的核心功能实现等核心内容。
第 4 章深入剖析了 PoW、PoA、PoS 等共识算法的适用场景、设计思想、技术实现和优缺点。
第 5~7 章围绕智能合约展开,系统讲解了智能合约语言 Solidity、智能合约应用开发、智能合约运行原理和实现细节,以及以太坊虚拟机的运行原理和智能合约字节码的解析等内容。
第 8 章介绍了以太坊周边的工具,教读者如何在不开发代码的情况下完成与以太坊网络的交互。
第 9 章介绍了以太坊技术的企业级应用以及企业以太坊联盟的标准化进展。
第 10 章对跨链技术和方案进行了方向性探讨,虽然目前跨链技术还不成熟,但被视为后以太坊时代的区块链技术热点。
第 11 章分析了以太坊现阶段面临的发展瓶颈,并对可能的解决方案进行了展望。

首先,我们来看一下协议层的初始化。协议层是在实例化 Ethereum 结构时,创建了一个协议管理实例:NewProtocolManager(…)。

启动参数及说明如下。

  • ChainConfig:Geth 启动参数和链配置。
  • SyncMode:区块下载器的同步模式—“fast”或者“full”。
  • networkID:P2P 网络的 ID,防止与其他 P2P 网络混淆。
  • event.TypeMux:事件分发器。
  • txPool:交易池。
  • Engine:共识引擎。
  • BlockChain:代表链的实例。
  • Chaindb:存储数据到数据库。
  • Whitelist:指定了一个区块号与区块 Hash 对应的列表,用来检查同步区块数据时下载的区块数据。

该实例保存参数中的 txPool、Engine、BlockChain,这几个是业务层的组件,方便协议层和业务层交互。

实例化一个 downloader 和 fetcher。downloader 和 fetcher 都是从 peer 获取区块数据,区别是 downloader 主动从远端获取区块和区块 Hash,fetcher 是根据远端通知过来的 Hash 去获取对应的区块。注意下载区块后验证区块头使用的函数是 Engine 提供的 VerifyHeader。

创建多个通道,具体如下。

  • txsCh:当本节点有交易进入交易池时,通过该通道通知需要执行 BroadcastTxs 广播交易给 peer。
  • newPeerCh:每个新的 peer 连接时,都需要在协议层为它创建一个 peer 结构,然后通过该通道通知进行数据同步;该 peer 结构除了指向真正代表一个邻居的 peer 结构之外,还保存了该邻居的区块头和总难度值,以及如下的队列和缓存。
    • knownTxs:已知的该 peer 已有的交易。
    • knownBlocks:已知的该 peer 已有的区块。
    • queueTxs:等待广播给该 peer 的交易队列。
    • queueProps:等待广播给该 peer 的区块队列。
    • queueAnns:等待宣布给该 peer 的区块队列。
  • noMorePeers:协议管理器停止工作后,通过该通道通知退出同步数据的工作。
  • txSyncCh:每个新的 peer 连接时,通知 newPeerCh 后,通过本通道通知发送本地交易池中所有的 pending 交易给指定的 peer。
  • quitSync:停止协议管理器。

注册子协议,即 eth63 和 eth62 协议。在新的 peer 连接时,根据版本号、协议名字来适配对应的协议,在对应的协议中最终实现对 P2P 消息的协议层的数据分发和处理。

综上所述,ProtocolManager 的总体框图如图 3-13 所示。

深入理解以太坊(43):技术架构 3.5.1

图 3-13 账户管理器功能框图

接下来是传输层和会话层的初始化。这两层的功能和初始化都包含在 p2p.Server 结构中,下面来看一下 p2p.Server 的启动过程,具体如下。

1)p2p.Server 在 Node 启动时实例化。

2)注册上面协议管理器中的子协议到 p2p.Server 实例上,以方便传输层将解码后的消息转给协议层处理。

3)启动 p2p.Server,具体如下。

  • 配置传输层协议为 rlpx,负责对数据流进行 RLP 编解码。
  • 配置会话层协议为 TCPDialer,负责与邻居建立 TCP 连接。
  • Server 中使用了很多 channel 用于消息传输, 代码如下。
    • srv.quit:通知退出本服务。
    • srv.addpeer:收到新的连接时,p2p.Server 通过该通道和邻居进行加密握手,并启动与该邻居的交互。
    • srv.delpeer:删除一个邻居。
    • srv.posthandshake:收到新的连接时,p2p.Server 通过 addpeer 通道加密握手后,通过该通道验证邻居连接的合法性。
    • srv.addstatic:通过 RPC 添加静态节点时,通过该通道完成添加。
    • srv.removestatic:通过 RPC 删除静态节点。
    • srv.peerOp:在获取邻居节点和邻居数量时,通过该通道获取。
    • srv.peerOpDone:获取邻居节点信息。
  • 配置本地节点:生成节点公钥,握手数据,本地节点实例 LocalNode。
  • 启动 TCP 连接监听服务,默认最多可以有 50 个邻居连接。注意:节点发现和节点连接所使用的 IP 与端口号相同。
  • 根据启动参数,初始化节点发现协议。

下面就来介绍节点发现协议。

深入理解以太坊(43):技术架构 3.5.1

购书地址 https://item.jd.com/12647508.html

评论

发布