文档: erigon.gitbook.io博客: erigon.substack.com Twitter:x.com/ErigonEth
Erigon 是以太坊(具有可嵌入共识层的执行层)在效率前沿的实现。默认情况下存档节点。
erigon
港caplin
港beaconAPI
端口shared
端口other
港口systemd
示例htop
显示不正确的内存使用情况重要默认值:Erigon 默认是一个存档节点:如果需要,请使用--prune.mode
使其更小(首次启动后不允许更改)
In-depth links are marked by the microscope sign (?)
内存:>=32GB,Golang>=1.22; GCC 10+ 或 Clang;在 Linux 上:内核 > v4。 64 位架构。
SSD 或 NVMe。不推荐 HDD - 在 HDD 上,Erigon 将始终落后链尖 N 个区块,但不会落后。请记住,当接近容量时,SSD 性能会下降。 CloudDrives(如 gp3):云网络驱动器上的块执行速度很慢
?有关 Erigon3 数据目录大小的更多详细信息
?有关此处存储的数据类型的更多详细信息
发行说明和二进制文件
构建最新版本(这适合大多数只想运行节点的用户):
git clone --branch release/ < x.xx > --single-branch https://github.com/erigontech/erigon.git
cd erigon
make erigon
./build/bin/erigon
通过--torrent.download.rate=20mb
提高下载速度。 ? See Downloader docs
使用--datadir
选择存储数据的位置。
对于 Gnosis Chain 使用--chain=gnosis
,对于 Polygon Mainnet 使用--chain=bor-mainnet
,对于 Polygon Amoy 使用--chain=amoy
。对于 Gnosis Chain,您需要一个共识层客户端以及 Erigon (https://docs.gnosischain.com/category/step--3---run-consensus-client)。
运行make help
将列出并描述 Makefile 中可用的便捷命令。
datadir
chaindata # "Recently-updated Latest State", "Recent History", "Recent Blocks"
snapshots # contains `.seg` files - it's old blocks
domain # Latest State
history # Historical values
idx # InvertedIndices: can search/filtering/union/intersect them - to find historical data. like eth_getLogs or trace_transaction
accessors # Additional (generated) indices of history - have "random-touch" read-pattern. They can serve only `Get` requests (no search/filters).
txpool # pending transactions. safe to remove.
nodes # p2p peers. safe to remove.
temp # used to sort data bigger than RAM. can grow to ~100gb. cleaned at startup.
# There is 4 domains: account, storage, code, commitment
如果您能负担得起在 1 个 nvme-raid 上存储 datadir - 那就太好了。如果不能 - 可以将历史记录存储在廉价的驱动器上。
# place (or ln -s) `datadir` on slow disk. link some sub-folders to fast (low-latency) disk.
# Example: what need link to fast disk to speedup execution
datadir
chaindata # link to fast disk
snapshots
domain # link to fast disk
history
idx
accessors
temp # buffers to sort data >> RAM. sequential-buffered IO - is slow-disk-friendly
# Example: how to speedup history access:
# - go step-by-step - first try store `accessors` on fast disk
# - if speed is not good enough: `idx`
# - if still not enough: `history`
# eth-mainnet - archive - April 2024
du -hsc /erigon/ *
6G /erigon/caplin
50G /erigon/chaindata
1.8T /erigon/snapshots
1.9T total
du -hsc /erigon/snapshots/ *
100G /erigon/snapshots/accessor
240G /erigon/snapshots/domain
260G /erigon/snapshots/history
410G /erigon/snapshots/idx
1.7T /erigon/snapshots
# bor-mainnet - archive - Jun 2024
du -hsc /erigon/ *
160M /erigon/bor
50G /erigon/chaindata
3.7T /erigon/snapshots
3.8T total
du -hsc /erigon/snapshots/ *
260G /erigon-data/snapshots/accessor
850G /erigon-data/snapshots/domain
650G /erigon-data/snapshots/history
1.4T /erigon-data/snapshots/idx
4.1T /erigon/snapshots
debug_getModifiedAccountsByNumber
返回该值--internalcl
默认启用。禁用使用--externalcl
。chaindata
小于15gb
。 rm -rf chaindata
就可以了。 (为了防止增长:建议--batchSize <= 1G
)--prune
标志已更改:请参阅--prune.mode
(默认: archive
,full: full
,EIP-4444: minimal
)--sync.loop.block.limit=5_000
默认启用标志:
verbosity
log.console.verbosity
(覆盖verbosity
的别名)log.json
log.console.json
( log.json
的别名)log.dir.path
log.dir.prefix
log.dir.verbosity
log.dir.json
为了仅记录到 stdout/stderr,可以使用--verbosity
(或log.console.verbosity
)标志来提供指定最高输出日志级别的 int 值:
LvlCrit = 0
LvlError = 1
LvlWarn = 2
LvlInfo = 3
LvlDebug = 4
LvlTrace = 5
要设置要在磁盘上收集的日志的输出目录,请设置--log.dir.path
如果要更改从erigon
生成的文件名,还应该将--log.dir.prefix
标志设置为备用名称。标志--log.dir.verbosity
也可用于控制此日志记录的详细程度,具有与上面相同的 int 值,或字符串值,例如“debug”或“info”。对于磁盘日志记录,默认详细程度为“调试”(4)。
可以使用布尔标志log.json
或log.console.json
将日志格式设置为 json,或者将日志格式设置为磁盘输出--log.dir.json
。
Erigon 默认情况下是“全合一二进制”解决方案,但可以将 TxPool 作为单独的进程启动。同样的情况还有:JSON RPC 层(RPCDaemon)、p2p 层(Sentry)、历史下载层(Downloader)、共识。不要将服务作为单独的进程启动,除非您有明确的理由:资源限制、扩展、替换为您自己的实现、安全性。如何将 Erigon 的服务作为单独的进程启动,请参阅 docker-compose.yml。每个服务都有自己的./cmd/*/README.md
文件。埃里贡博客。
以太坊主网、Sepolia、Holesky、Gnosis 的内置共识。要使用外部共识层: --externalcl
。
如果您想尝试一下 Erigon:一个不错的选择是开始同步公共测试网之一 Holesky(或 Amoy)。它同步速度更快,并且不占用太多磁盘空间:
git clone https://github.com/erigontech/erigon.git
cd erigon
make erigon
./build/bin/erigon --datadir= < your_datadir > --chain=holesky --prune.mode=full
请注意--datadir
选项允许您将 Erigon 文件存储在非默认位置。目录名称--datadir
不必与--chain
中的链名称匹配。
以太坊和 Gnosis 链完全支持区块生产。 Polygon 仍处于实验阶段。
您可以通过 TOML 配置文件使用标志--config
设置 Erigon 标志。可以通过直接在 Erigon 命令行上写入标志来覆盖配置文件中设置的标志
./build/bin/erigon --config ./config.toml --chain=sepolia
假设我们的配置文件中有chain : "mainnet"
,通过添加--chain=sepolia
允许覆盖 toml 配置文件内的标志并将链设置为 sepolia
datadir = ' your datadir '
port = 1111
chain = " mainnet "
http = true
"private.api.addr" = " localhost:9090 "
"http.api" = [ " eth " , " debug " , " net " ]
Erigon 可用作共识层客户端 (CL) 的执行层 (EL)。默认配置就OK了。
如果您的 CL 客户端位于不同的设备上,请添加--authrpc.addr 0.0.0.0
(引擎 API 默认在本地主机上侦听)以及--authrpc.vhosts
其中
是您的源主机或any
。
为了在共识层和执行层之间建立安全连接,会自动生成 JWT 密钥。
默认情况下,JWT 密钥将以jwt.hex
的名称出现在 datadir 中,并且可以使用标志--authrpc.jwtsecret
指定其路径。
为了成功建立连接,这条信息也需要在共识层中指定。更多信息可以在这里找到。
Erigon 运行后,您需要将 CL 客户端指向
,其中
是localhost
或运行 Erigon 的设备的 IP 地址,并且还指向 Erigon 创建的 JWT 秘密路径。
Caplin 是一个成熟的验证共识客户端,如 Prysm、Lighthouse、Teku、Nimbus 和 Lodestar。其目标是:
开发新共识层的主要原因是尝试它可能带来的好处。例如,引擎 API 不能很好地与 Erigon 配合使用。引擎 API 一次发送一个数据块,这不适合 Erigon 的工作方式。 Erigon 旨在同时处理多个块,并且需要高效地排序和处理数据。因此,Erigon 最好独立处理块,而不是依赖引擎 API。
默认情况下启用 Caplin。要禁用它并启用引擎 API,请使用--externalcl
标志。从那时起,将不再需要外部共识层。
Caplin 还具有历史状态和区块的档案模式。它可以通过--caplin.archive
标志启用。为了启用 caplin 的 Beacon API,必须添加标志--beacon.api=
。例如: --beacon.api=beacon,builder,config,debug,node,validator,lighthouse
将启用所有端点。 **注意:Caplin 尚未做好质押准备,因此聚合端点仍有待实施。另外启用 Beacon API 将导致 RAM 使用量增加 6 GB。
定义 6 个标志以避免冲突: --datadir --port --http.port --authrpc.port --torrent.port --private.api.addr
。同一台机器上的多个链的示例:
# mainnet
./build/bin/erigon --datadir="" --chain=mainnet --port=30303 --http.port=8545 --authrpc.port=8551 --torrent.port=42069 --private.api.addr=127.0.0.1:9090 --http --ws --http.api=eth,debug,net,trace,web3,erigon
# sepolia
./build/bin/erigon --datadir="" --chain=sepolia --port=30304 --http.port=8546 --authrpc.port=8552 --torrent.port=42068 --private.api.addr=127.0.0.1:9091 --http --ws --http.api=eth,debug,net,trace,web3,erigon
如果路径中有空格,请引用它。
? Detailed explanation is DEV_CHAIN.
在网络带宽良好的情况下,以太坊主网 FullNode 在 3 小时内同步:OtterSync 可以同步
扁平 KV 存储。 Erigon 使用键值数据库并以简单的方式存储帐户和存储。
? See our detailed DB walkthrough here.
预处理。对于某些操作,Erigon 在将数据插入主数据库之前使用临时文件来预处理数据。这减少了写入放大,并且数据库插入速度快了几个数量级。
? See our detailed ETL explanation here.
平原状态
单一帐户/状态特里树。 Erigon 使用单个 Merkle trie 来存储帐户和存储。
? Staged Sync Readme
大多数 Erigon 组件(txpool、rpcdaemon、快照下载器、哨兵等)可以在 Erigon 内部工作,并作为同一服务器(或另一服务器)上的独立进程。例子:
make erigon rpcdaemon
./build/bin/erigon --datadir=/my --http=false
# To run RPCDaemon as separated process: use same `--datadir` as Erigon
./build/bin/rpcdaemon --datadir=/my --http.api=eth,erigon,web3,net,debug,trace,txpool --ws
--rpc.batch.concurrency
、 --rpc.batch.limit
、 --db.read.concurrency
--http.compression
、 --ws.compression
? See RPC-Daemon docs
docker compose up prometheus grafana
,详细文档。
# please use git branch name (or commit hash). don't use git tags
go mod edit -replace github.com/erigontech/erigon-lib=github.com/erigontech/erigon/erigon-lib@5498f854e44df5c8f0804ff4f0747c0dec3caad5
go get github.com/erigontech/erigon@main
go mod tidy
erigon
港成分 | 港口 | 协议 | 目的 | 应该暴露 |
---|---|---|---|---|
引擎 | 9090 | 传输控制协议 | gRPC服务器 | 私人的 |
引擎 | 42069 | TCP 和 UDP | 快照同步(BitTorrent) | 民众 |
引擎 | 8551 | 传输控制协议 | 引擎 API(JWT 身份验证) | 私人的 |
哨兵 | 30303 | TCP 和 UDP | eth/68 对等互连 | 民众 |
哨兵 | 30304 | TCP 和 UDP | eth/67 对等互连 | 民众 |
哨兵 | 9091 | 传输控制协议 | 传入 gRPC 连接 | 私人的 |
RPC守护进程 | 8545 | 传输控制协议 | HTTP、WebSocket 和 GraphQL | 私人的 |
通常,30303 和 30304 暴露于互联网以允许传入对等连接。 9090 仅在 rpcdaemon 或其他连接内部公开(例如 rpcdaemon -> erigon)。端口 8551(经过 JWT 身份验证)仅在内部公开,用于来自共识层节点的引擎 API JSON-RPC 查询。
caplin
港成分 | 港口 | 协议 | 目的 | 应该暴露 |
---|---|---|---|---|
哨兵 | 4000 | UDP协议 | 对等 | 民众 |
哨兵 | 4001 | 传输控制协议 | 对等 | 民众 |
要配置端口,请使用:
--caplin.discovery.addr value Address for Caplin DISCV5 protocol (default: "127.0.0.1")
--caplin.discovery.port value Port for Caplin DISCV5 protocol (default: 4000)
--caplin.discovery.tcpport value TCP Port for Caplin DISCV5 protocol (default: 4001)
beaconAPI
端口成分 | 港口 | 协议 | 目的 | 应该暴露 |
---|---|---|---|---|
休息 | 5555 | 传输控制协议 | 休息 | 民众 |
shared
端口成分 | 港口 | 协议 | 目的 | 应该暴露 |
---|---|---|---|---|
全部 | 6060 | 传输控制协议 | 普教授 | 私人的 |
全部 | 6061 | 传输控制协议 | 指标 | 私人的 |
可以启用可选标志来启用 pprof 或指标(或两者)。使用--help
与二进制文件获取更多信息。
other
港口保留供将来使用: gRPC 端口: 9092
共识引擎、 9093
快照下载器、 9094
TxPool
0.0.0.0/8 "This" Network RFC 1122, Section 3.2.1.3
10.0.0.0/8 Private-Use Networks RFC 1918
100.64.0.0/10 Carrier-Grade NAT (CGN) RFC 6598, Section 7
127.16.0.0/12 Private-Use Networks RFC 1918
169.254.0.0/16 Link Local RFC 3927
172.16.0.0/12 Private-Use Networks RFC 1918
192.0.0.0/24 IETF Protocol Assignments RFC 5736
192.0.2.0/24 TEST-NET-1 RFC 5737
192.88.99.0/24 6to4 Relay Anycast RFC 3068
192.168.0.0/16 Private-Use Networks RFC 1918
198.18.0.0/15 Network Interconnect
Device Benchmark Testing RFC 2544
198.51.100.0/24 TEST-NET-2 RFC 5737
203.0.113.0/24 TEST-NET-3 RFC 5737
224.0.0.0/4 Multicast RFC 3171
240.0.0.0/4 Reserved for Future Use RFC 1112, Section 4
255.255.255.255/32 Limited Broadcast RFC 919, Section 7
RFC 922, Section 7
IpTables 语法相同
systemd
示例作为单独的用户从build/bin
运行 erigon 可能会产生错误:
error while loading shared libraries: libsilkworm_capi.so: cannot open shared object file: No such file or directory
需要使用make DIST=
为另一个用户安装该库。您可以使用$HOME/erigon
或/opt/erigon
作为安装路径,例如:
make DIST=/opt/erigon install
kill -SIGUSR1
,获取跟踪并停止: kill -6
--pprof
标志并运行go tool pprof -png http://127.0.0.1:6060/debug/pprof/profile?seconds=20 > cpu.png
--pprof
标志并运行go tool pprof -inuse_space -png http://127.0.0.1:6060/debug/pprof/heap > mem.png
? Detailed explanation is here.
Docker 使用 UID/GID 1000 的用户 erigon(出于安全原因)。您可以在 Dockerfile 中看到正在创建该用户。可以通过向主机的用户授予该文件夹的所有权来修复,其中主机的用户 UID/GID 与 docker 的用户 UID/GID (1000) 相同。帖子中有更多详细信息
--txpool.nolocals=true
--http.api
列表中添加admin
--http.corsdomain="*"
是不好的做法:设置准确的主机名或 IP--rpc.batch.concurrency
、 --rpc.batch.limit
来防止 DOShttps://github.com/mathMakesArt/Erigon-on-RPi-4
Docker 允许通过容器构建和运行 Erigon。这减少了将构建依赖项安装到主机操作系统的需要。
用户 UID/GID 需要在主机操作系统和容器之间同步,以便以正确的权限写入文件。
您可能希望在主机操作系统上设置专用用户/组,在这种情况下,以下make
目标可用。
# create "erigon" user
make user_linux
# or
make user_macos
存储库的根目录中有一个.env.example
文件。
DOCKER_UID
- docker 用户的 UIDDOCKER_GID
- docker 用户的 GIDXDG_DATA_HOME
- 将安装到 docker 容器的数据目录如果未指定,UID/GID 将使用当前用户。
XDG_DATA_HOME
的一个不错选择是使用由帮助器目标make user_linux
或make user_macos
创建的~erigon/.ethereum
目录。
检查权限:在所有情况下, XDG_DATA_HOME
(指定或默认)必须可由docker中的用户UID/GID写入,这将在构建时由DOCKER_UID
和DOCKER_GID
确定。如果由于权限原因导致构建或服务启动失败,请检查这些环境变量控制的所有目录、UID 和 GID 是否正确。
下一个命令启动:Erigon 在端口 30303 上,rpcdaemon 在端口 8545 上,prometheus 在端口 9090 上,grafana 在端口 3000 上。
#
# Will mount ~/.local/share/erigon to /home/erigon/.local/share/erigon inside container
#
make docker-compose
#
# or
#
# if you want to use a custom data directory
# or, if you want to use different uid/gid for a dedicated user
#
# To solve this, pass in the uid/gid parameters into the container.
#
# DOCKER_UID: the user id
# DOCKER_GID: the group id
# XDG_DATA_HOME: the data directory (default: ~/.local/share)
#
# Note: /preferred/data/folder must be read/writeable on host OS by user with UID/GID given
# if you followed above instructions
#
# Note: uid/gid syntax below will automatically use uid/gid of running user so this syntax
# is intended to be run via the dedicated user setup earlier
#
DOCKER_UID= $( id -u ) DOCKER_GID= $( id -g ) XDG_DATA_HOME=/preferred/data/folder DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 make docker-compose
#
# if you want to run the docker, but you are not logged in as the $ERIGON_USER
# then you'll need to adjust the syntax above to grab the correct uid/gid
#
# To run the command via another user, use
#
ERIGON_USER=erigon
sudo -u ${ERIGON_USER} DOCKER_UID= $( id -u ${ERIGON_USER} ) DOCKER_GID= $( id -g ${ERIGON_USER} ) XDG_DATA_HOME= ~ ${ERIGON_USER} /.ethereum DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 make docker-compose
Makefile 为 erigon、prometheus 和 grafana 创建初始目录。 PID 命名空间在 erigon 和 rpcdaemon 之间共享,需要从另一个进程(RPCDaemon 本地模式)打开 Erigon 的数据库。请参阅:https://github.com/erigontech/erigon/pull/2392/files
如果您的 docker 安装需要 docker 守护进程以 root 身份运行(默认情况下),则需要在上面的命令前面加上sudo
前缀。但是,出于安全原因,有时建议以非 root 用户身份运行 docker(及其容器)。有关如何执行此操作的更多信息,请参阅本文。
邮政
--sync.loop.block.limit=10_000
SNAPSHOT_MADV_RND=false
vmtouch -vdlw /mnt/erigon/snapshots/domain/*bt
ls /mnt/erigon/snapshots/domain/*.kv | parallel vmtouch -vdlw
# if it failing with "can't allocate memory", try:
sync && sudo sysctl vm.drop_caches=3
echo 1 > /proc/sys/vm/compact_memory
Windows 用户可以通过 3 种可能的方式运行 erigon:
使用提供的wmake.ps1
PowerShell 脚本为 Windows 本地构建可执行二进制文件。使用语法与make
命令相同,因此您必须运行.wmake.ps1 [-target]
。示例: .wmake.ps1 erigon
构建 erigon 可执行文件。所有二进制文件都放置在.buildbin
子文件夹中。在 Windows 上成功进行本机构建有一些要求:
chocolatey
包管理器 - 请参阅以下几点).wmake.ps1 db-tools
),则必须安装适用于 Windows 的 Chocolatey 包管理器。通过 Chocolatey,您需要安装以下组件: cmake
、 make
、 mingw
by choco install cmake make mingw
。确保 Windows 系统“Path”变量具有:C:ProgramDatachocolateylibmingwtoolsinstallmingw64bin关于反病毒的重要说明在 MinGW 的编译器检测阶段,会生成一些临时可执行文件来测试编译器功能。据报道,一些防病毒程序检测到这些文件可能被Win64/Kryptic.CIS
特洛伊木马(或其变体)感染。尽管这些都是误报,但我们无法控制 100 多家 Windows 安全产品供应商及其各自的检测算法,我们知道这可能会让您的 Windows 版本体验感到不舒服。要解决此问题,您可以专门为克隆存储库的buildbinmdbxCMakeFiles
子文件夹设置防病毒排除项,或者可以使用以下其他两个选项运行 erigon
使用 Docker :参见 docker-compose.yml
严格在版本 2 上使用 WSL(适用于 Linux 的 Windows 子系统)。在此选项下,您可以像在常规 Linux 发行版上一样构建 Erigon。您还可以将数据指向任何已安装的 Windows 分区(例如/mnt/c/[...]
、 /mnt/d/[...]
等),但在这种情况下,请注意性能会受到影响:这这是因为这些挂载点使用DrvFS
(一种网络文件系统),此外,MDBX 锁定数据库以进行独占访问,这意味着一次只有一个进程可以访问数据。这会对rpcdaemon
的运行产生影响,即使它在同一台计算机上执行,也必须将其配置为远程 DB。相反,如果您的数据托管在本机 Linux 文件系统上,则不存在任何限制。另请注意,默认 WSL2 环境有自己的 IP 地址,该地址与 Windows 主机的网络接口之一不匹配:在路由器上为端口 30303 配置 NAT 时请考虑到这一点。
主要讨论发生在我们的 Discord 服务器上。要获得邀请,请发送电子邮件至bloxster [at] proton.me
并注明您的姓名、职业、简要说明您想加入 Discord 的原因以及您是如何听说 Erigon 的。
erigon.substack.com
x.com/ErigonEth
发送电子邮件至security [at] torquem.ch
。
htop
显示不正确的内存使用情况Erigon 的内部 DB (MDBX) 使用MemoryMap
- 当操作系统管理所有read, write, cache
操作而不是应用程序时(linux、windows)
res
列上的htop
显示“App + OS 用于保存给定应用程序的页面缓存”的内存,但这并不提供信息,因为如果htop
说该应用程序使用了 90% 的内存,您仍然可以在同一台计算机上运行 3 个以上的应用程序实例- 因为90%
的大部分是“操作系统页面缓存”。操作系统在需要内存时会自动释放该缓存。较小的“页面缓存大小”可能根本不会影响 Erigon 的性能。
接下来的工具显示了 Erigon 的正确内存使用情况:
vmmap -summary PID | grep -i "Physical footprint"
。不用grep
就可以看到详细信息section MALLOC ZONE column Resident Size
显示应用程序内存使用情况, section REGION TYPE column Resident Size
显示操作系统页面缓存大小。Prometheus
仪表板显示没有操作系统页面缓存的 Go 应用程序的内存( make prometheus
,在浏览器中打开localhost:3000
,凭证admin/admin
)cat /proc//smaps
Erigon 在创世同步期间使用约 4Gb 的 RAM,在正常工作期间使用约 1Gb 的 RAM。操作系统页面缓存可以利用无限量的内存。
警告:同一台计算机上的多个 Erigon 实例将同时接触磁盘,这会影响性能 - 主要的 Erigon 优化之一:“减少磁盘随机访问”。 “块执行阶段”仍然执行许多随机读取 - 这就是它是最慢阶段的原因。我们不建议在同一磁盘上运行多个创世同步。如果创世同步通过,那么可以在同一磁盘上运行多个 Erigon 实例。
(如 gp3)您可能会阅读:#1516(评论)简而言之:网络磁盘不利于块执行 - 因为块执行以非并行非批处理方式从数据库读取数据。技巧:如果你投入足够的 RAM 并设置环境变量ERIGON_SNAPSHOT_MADV_RND=false
- 那么 Erigon 将在云驱动器上工作得足够好 - 以更高的 IO 成本。
例如:btrfs 的 autodefrag 选项 - 可能会将写入 IO 增加 100 倍
Gnome Tracker - 检测矿工并杀死他们。
对于其他在尝试以旧方式启动 Erigon 时遇到 BuildKit 错误的人,您可以使用以下命令...
XDG_DATA_HOME=/preferred/data/folder DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 make docker-compose