以太坊数据同步的几种模式

以太坊数据同步的几种模式

> 本文对以太坊数据同步的几种模式进行简单介绍,以解答最近一些朋友的疑虑。 ## 0x01 同步模式简介 安装好 geth 之后,运行 `geth --help` , 你就可以看到下面的命令行说明 ``` ... ETHEREUM OPTIONS: ... --syncmode "fast" Blockchain sync mode ("fast", "full", or "light") ... DEPRECATED OPTIONS: --fast Enable fast syncing through state downloads (replaced by --syncmode) --light Enable light client mode (replaced by --syncmode) ``` 从这里我们可以看出什么呢? 1. 以太坊提供了 "fast", "full", "light" 三种数据同步模式 2. 原来还有 `--fast` , `--light` 两个命令行选项,现在已经被 `--syncmode` 取代 当指定同步模式为 “fast” 时,以太坊节点会从网络同步所有的区块头,区块体以及状态数据,但不对区块中的交易进行重放,只会对区块中的数据进行校验。 当指定同步模式为"full"时,以太坊节点会从网络同步所有的区块头,区块体并重放区块中的交易以生成状态数据。 当指定同步模式为“light”时,以太坊节点仅从网络中同步所有区块头,不去同步区块体,也不去同步状态数据,仅在需要相应区块和状态数据时从网络上获取。 当不指定任何模式时,默认为 “fast” 模式。 ## 0x02 为啥要提供三种模式 1. 随着以太坊区块数据的越来越多,全节点同步,也就是“full”这种数据同步模式实在是太慢了,往往需要一周甚至更多时间。但以太坊网络又需要这些全节点去保存可追溯的历史数据。 ![](https://img.learnblockchain.cn/2020/02/05_/14473801.jpeg) 等待数据同步 2. 运行轻节点,也就是“light”这种数据同步模式,因为只需要同步区块头数据,数据同步在几个小时就可以完成,但很多操作都需要这些轻节点去网络上其它全节点去请求数据,显然仅仅靠轻节点去组成区块链网络是不现实的。 3. “fast” 这种同步模式就是“full”模式和“light”模式的一个折衷,通过直接从网络同步状态数据而不是通过重放交易生成状态数据的方式,节省了很多时间,一般来说机器配置合理的话 2~3 天就可以完成主网数据同步。 ## 0x03 三种模式的安全性 毋庸置疑,全节点模式是最安全的,在这种模式下,所有区块和区块中的交易都会被逐一验证。 在 “fast” 这种数据同步模式下,比较靠近现在的区块和其中包含的交易也都会被逐一验证。但不会验证比较老的区块数据。 在 ”light“ 这种轻节点模式下,不会对区块和区块中的交易进行交易。但在需要处理特定区块相关交易或需要读取某个区块中相关的状态数据时,会通过区块头中的哈希值对区块和状态数据进行校验。 ## 0x04 该用什么模式 自己搭节点,没有特别需求的话,使用默认的 ”fast“ 同步模式就好了。 如果要在树莓派等低配置设备中,可以使用 ”light“ 同步模式。使用”light“模式时,本地签名并发送交易一般没什么问题,但要获取区块数据或账户余额时,对网络情况就有更多的要求了。 如果特别注重安全性,并且想获取所有区块链历史数据,只能使用全节点模式了。 ## 0x06 常见问题 **问题:** *light* 节点与 *full* 节点是如何交互的? **解答:** 首先,light 节点会维护多个与 full 节点的 p2p 连接。然后,当 light 节点需要与 full 节点交互时,会将需要发送的请求放到一个请求队列中。light 节点会启动一个 goroutine 不断从请求队列里获取请求,然后从 p2p 节点列表里选一个当前最好用的节点,将请求发出去。请求得到的结果会发到本地数据库和缓存里。 ## 0x07 结语 本文介绍了自己搭节点时需要注意的几种数据同步模式。其实很多 DApp,包括一些去中心化钱包,自己是不搭节点,而是依赖于第三方节点比如 Infura 的。 如果你对以太坊节点还有任何疑问,欢迎给我留言或加我微信进行进一步探讨。

本文对以太坊数据同步的几种模式进行简单介绍,以解答最近一些朋友的疑虑。

0x01 同步模式简介

安装好 geth 之后,运行 geth --help , 你就可以看到下面的命令行说明

...
ETHEREUM OPTIONS:
...
  --syncmode "fast"         Blockchain sync mode ("fast", "full", or "light")
...
DEPRECATED OPTIONS:
  --fast   Enable fast syncing through state downloads (replaced by --syncmode)
  --light  Enable light client mode (replaced by --syncmode)

从这里我们可以看出什么呢?

  1. 以太坊提供了 "fast", "full", "light" 三种数据同步模式
  2. 原来还有 --fast , --light 两个命令行选项,现在已经被 --syncmode 取代

当指定同步模式为 “fast” 时,以太坊节点会从网络同步所有的区块头,区块体以及状态数据,但不对区块中的交易进行重放,只会对区块中的数据进行校验。

当指定同步模式为"full"时,以太坊节点会从网络同步所有的区块头,区块体并重放区块中的交易以生成状态数据。

当指定同步模式为“light”时,以太坊节点仅从网络中同步所有区块头,不去同步区块体,也不去同步状态数据,仅在需要相应区块和状态数据时从网络上获取。

当不指定任何模式时,默认为 “fast” 模式。

0x02 为啥要提供三种模式

  1. 随着以太坊区块数据的越来越多,全节点同步,也就是“full”这种数据同步模式实在是太慢了,往往需要一周甚至更多时间。但以太坊网络又需要这些全节点去保存可追溯的历史数据。

    以太坊数据同步的几种模式插图

    等待数据同步

  2. 运行轻节点,也就是“light”这种数据同步模式,因为只需要同步区块头数据,数据同步在几个小时就可以完成,但很多操作都需要这些轻节点去网络上其它全节点去请求数据,显然仅仅靠轻节点去组成区块链网络是不现实的。

  3. “fast” 这种同步模式就是“full”模式和“light”模式的一个折衷,通过直接从网络同步状态数据而不是通过重放交易生成状态数据的方式,节省了很多时间,一般来说机器配置合理的话 2~3 天就可以完成主网数据同步。

0x03 三种模式的安全性

毋庸置疑,全节点模式是最安全的,在这种模式下,所有区块和区块中的交易都会被逐一验证。

在 “fast” 这种数据同步模式下,比较靠近现在的区块和其中包含的交易也都会被逐一验证。但不会验证比较老的区块数据。

在 ”light“ 这种轻节点模式下,不会对区块和区块中的交易进行交易。但在需要处理特定区块相关交易或需要读取某个区块中相关的状态数据时,会通过区块头中的哈希值对区块和状态数据进行校验。

0x04 该用什么模式

自己搭节点,没有特别需求的话,使用默认的 ”fast“ 同步模式就好了。

如果要在树莓派等低配置设备中,可以使用 ”light“ 同步模式。使用”light“模式时,本地签名并发送交易一般没什么问题,但要获取区块数据或账户余额时,对网络情况就有更多的要求了。

如果特别注重安全性,并且想获取所有区块链历史数据,只能使用全节点模式了。

0x06 常见问题

问题: light 节点与 full 节点是如何交互的? 解答: 首先,light 节点会维护多个与 full 节点的 p2p 连接。然后,当 light 节点需要与 full 节点交互时,会将需要发送的请求放到一个请求队列中。light 节点会启动一个 goroutine 不断从请求队列里获取请求,然后从 p2p 节点列表里选一个当前最好用的节点,将请求发出去。请求得到的结果会发到本地数据库和缓存里。

0x07 结语

本文介绍了自己搭节点时需要注意的几种数据同步模式。其实很多 DApp,包括一些去中心化钱包,自己是不搭节点,而是依赖于第三方节点比如 Infura 的。

如果你对以太坊节点还有任何疑问,欢迎给我留言或加我微信进行进一步探讨。

  • 发表于 2018-08-28 15:50
  • 阅读 ( 4526 )
  • 学分 ( 5 )
  • 分类:以太坊

评论