以太坊作为区块链2.0的代表,持续推动着传统行业的革新与区块链技术的发展。本文将以以太坊网络架构为切入点,逐步深入分析其运作原理,帮助读者建立对以太坊网络架构的整体认识。
以太坊网络架构概述
区块链是一种分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式,是典型的去中心化应用,建立在P2P网络之上。通过学习以太坊网络架构,可以更容易地对网络部分源码进行审计,便于后续的协议分析和安全隐患发现。
目前基于P2P网络的成熟应用相对较少,借助分析以太坊网络架构的机会,可以学习一套成熟的P2P网络运行架构。本文侧重于数据链路的建立和交互,不涉及网络模块中的节点发现、区块同步、广播等功能模块。
Geth客户端启动流程
在深入分析以太坊网络架构之前,首先需要了解Geth客户端的整体启动流程。
初始化过程
Geth使用gopkg.in/urfave/cli.v1扩展包管理程序启动和命令行解析。在Go语言中,程序会先调用init()函数完成初始化操作,包括设置程序的子命令集和程序入口函数等,然后再调用main()函数。
节点启动机制
无论是通过geth()函数还是其他命令行参数启动节点,节点的启动流程大致相同。每个功能模块都被视为一个服务,这些服务的正常运行驱动着Geth的各项功能。👉 查看实时节点监控工具
三层网络架构解析
以太坊是去中心化的数字货币系统,天然适用P2P通信架构,并且在其上支持多种协议。以太坊网络可分为三层结构:
协议实现层
最上层是以太坊中各个协议的具体实现,如eth协议、les协议等。
P2P通信链路层
第二层是以太坊中的P2P通信链路层,主要负责启动监听、处理新加入连接或维护连接,为上层协议提供信道。
网络IO层
最下面的一层是由Go语言所提供的网络IO层,即对TCP/IP中网络层及以下的封装。
P2P通信链路层详解
P2P通信链路层主要完成三项核心工作:
数据RLP编码
上层协议的数据交付给P2P层后,首先通过RLP(递归长度前缀)编码进行处理。
共享密钥加密
RLP编码后的数据由共享密钥进行加密,确保通信过程中数据的安全性。
RLPXFrameRW帧转换
最后,将数据流转换为RLPXFrameRW帧,便于数据的加密传输和解析。
共享密钥生成机制
在P2P通信链路的建立过程中,第一步就是协商共享密钥。
迪菲-赫尔曼密钥交换
P2P网络中使用"迪菲-赫尔曼密钥交换"技术,让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。
连接的两方生成随机的私钥,通过私钥得到公钥。然后双方交换各自的公钥,这样双方都可以通过自己随机的私钥和对方的公钥来生成同样的共享密钥。
密钥交换流程
- 客户端使用服务端的公钥加密,发送自己的公钥和包含临时公钥的签名,以及一个随机值nonce
- 服务端收到数据,获得客户端的公钥,使用椭圆曲线算法从签名中获得客户端的临时公钥
- 服务端将自己的临时公钥和随机值nonce用客户端的公钥加密发送
- 双方通过椭圆曲线算法计算出相同的共享密钥
RLPXFrameRW帧结构分析
在共享密钥生成完毕后,初始化RLPXFrameRW帧处理器,目的是在单个连接上支持多路复用协议。
帧结构特点
帧分组的消息为加密数据流产生了天然的分界点,更便于数据的解析,还可以对发送的数据进行验证。
数据包组成
一般情况下,发送一次数据将产生五个数据包:
- Header:包含数据包大小和数据包源协议
- Header_MAC:头部消息认证
- Frame:具体传输的内容
- Padding:使帧按字节对齐
- Frame_MAC:用于消息认证
接收方按照同样的格式对数据包进行解析和验证。
RLP编码原理
RLP编码(递归长度前缀编码)提供了一种适用于任意二进制数据数组的编码方式,已成为以太坊中对对象进行序列化的主要编码方式。
编码优势
比起JSON数据格式,RLP编码使用更少的字节,更加高效。在网络模块中,所有上层协议的数据包要交互给P2P链路时,都要先通过RLP编码;从P2P链路读取数据,也要先进行解码才能操作。
LES协议层工作原理
以LES(轻量级以太坊子协议)为例,分析在以太坊网络架构中应用协议的工作机制。
协议初始化
LES服务由Geth初始化时启动,通过实现以太坊子协议的接口函数来管理协议交互。
协议处理流程
- 使用RLPXFrameRW帧处理器获取请求数据
- 使用共享密钥解密数据
- 使用RLP编码将二进制数据序列化
- 通过对msg.Code的判断执行相应功能
- 对响应数据进行RLP编码、共享密钥加密,转换为RLPXFrameRW帧后发送
常见问题
什么是以太坊网络架构的核心组成部分?
以太坊网络架构核心包括三层:最上层的协议实现层(如eth、les协议)、中间层的P2P通信链路层,以及底层的网络IO层。P2P层负责链路建立和维护,为上层协议提供通信信道。
共享密钥在通信中起什么作用?
共享密钥通过迪菲-赫尔曼密钥交换技术生成,用于对通信数据进行加密解密,确保数据传输的安全性。双方通过交换公钥并结合自己的私钥计算出相同的共享密钥,后续通信使用这个密钥进行对称加密。
RLP编码相比JSON有什么优势?
RLP编码使用递归长度前缀方式,比JSON格式使用更少的字节,编码效率更高。它成为以太坊中对象序列化的主要方式,特别适合区块链环境下的数据传输和存储需求。
总结
通过本文的分析,我们对以太坊网络架构有了全面的了解,这为后续的代码审计和安全分析奠定了基础。从安全角度来看,由协议引发的安全问题往往比本地安全问题更为严重,应对网络层面的安全问题给予高度重视。
以太坊网络架构非常完善,具有极高的鲁棒性,这证明了以太坊是能够被市场认可的区块链系统。同时,由于P2P网络方向的资料相对较少,以太坊的网络架构也为学习P2P网络提供了宝贵的参考资料。
以太坊网络架构的深入学习不仅有助于理解区块链技术的底层原理,也为开发安全的去中心化应用提供了技术基础。随着区块链技术的不断发展,对网络架构的深入理解将变得越来越重要。