ethereum/go-ethereum
GitHub: ethereum/go-ethereum
以太坊协议的官方 Golang 执行层实现,提供全节点运行、JSON-RPC 接口和智能合约交互能力。
Stars: 50888 | Forks: 21828
## Go Ethereum
Ethereum 协议的 Golang 执行层实现。
[](https://pkg.go.dev/github.com/ethereum/go-ethereum?tab=doc)
[](https://goreportcard.com/report/github.com/ethereum/go-ethereum)
[](https://app.travis-ci.com/github/ethereum/go-ethereum)
[](https://discord.gg/nthXNEv)
[](https://x.com/go_ethereum)
针对稳定版本和不稳定的 master 分支均提供自动构建。二进制存档发布在 https://geth.ethereum.org/downloads/。
## 构建源码
有关前提条件和详细的构建说明,请阅读[安装说明](https://geth.ethereum.org/docs/getting-started/installing-geth)。
构建 `geth` 需要同时安装 Go(1.23 或更高版本)和 C 编译器。你可以使用你喜欢的包管理器来安装它们。安装依赖项后,运行
```
make geth
```
或者,构建完整的工具套件:
```
make all
```
## 可执行文件
go-ethereum 项目包含 `cmd` 目录中的几个包装器/可执行文件。
| 命令 | 描述 |
| :--------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`geth`** | 我们的主要 Ethereum CLI 客户端。它是进入 Ethereum 网络(主网、测试网或私有网络)的入口,能够作为全节点(默认)、归档节点(保留所有历史状态)或轻节点(实时检索数据)运行。其他进程可以通过 HTTP、WebSocket 和/或 IPC 传输层上暴露的 JSON RPC 端点将其用作进入 Ethereum 网网的网关。有关命令行选项,请参阅 `geth --help` 和 [CLI 页面](https://geth.ethereum.org/docs/fundamentals/command-line-options)。 |
| `clef` | 独立签名工具,可用作 `geth` 的后端签名器。 |
| `devp2p` | 用于与网络层上的节点交互的工具,无需运行完整的区块链。 |
| `abigen` | 源代码生成器,用于将 Ethereum 合约定义转换为易于使用、编译时类型安全的 Go 包。它作用于普通的 [Ethereum 合约 ABI](https://docs.soliditylang.org/en/develop/abi-spec.html),如果合约字节码也可用,则具有扩展功能。但是,它也接受 Solidity 源文件,使开发更加精简。请参阅我们的 [Native DApps](https://geth.ethereum.org/docs/developers/dapp-developer/native-bindings) 页面了解详情。 |
| `evm` | EVM (Ethereum Virtual Machine) 的开发者实用程序版本,能够在可配置的环境和执行模式下运行字节码片段。其目的是允许对 EVM 操作码进行隔离、细粒度的调试(例如 `evm --code 60ff60ff --debug run`)。 |
| `rlpdump` | 开发者实用工具,用于将二进制 RLP([递归长度前缀](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp))转储(Ethereum 协议在网络和共识方面使用的数据编码)转换为对用户更友好的分层表示(例如 `rlpdump --hex CE0183FFFFFFC4C304050583616263`)。 |
## 运行 `geth`
在这里遍历所有可能的命令行标志超出了范围(请查阅我们的 [CLI Wiki 页面](https://geth.ethereum.org/docs/fundamentals/command-line-options)),但我们列举了一些常见的参数组合,以帮助你快速了解如何运行自己的 `geth` 实例。
### 硬件要求
最低配置:
* 4 核以上的 CPU
* 8GB RAM
* 1TB 的可用存储空间用于同步主网
* 8 MBit/sec 的下载互联网服务
推荐配置:
* 8 核以上的快速 CPU
* 16GB+ RAM
* 至少有 1TB 可用空间的高性能 SSD
* 25+ MBit/sec 的下载互联网服务
### 主 Ethereum 网络上的全节点
到目前为止,最常见的场景是人们希望简单地与 Ethereum 网络交互:创建账户;转账;部署并与合约交互。对于这种特定用例,用户不关心多年前的历史数据,因此我们可以快速同步到网络的当前状态。为此:
```
$ geth console
```
此命令将:
* 在 snap 同步模式下启动 `geth`(默认,可以使用 `--syncmode` 标志更改),使其下载更多数据,以避免处理 Ethereum 网络的整个历史记录,因为这非常消耗 CPU 资源。
* 启动内置的交互式 [JavaScript 控制台](https://geth.ethereum.org/docs/interacting-with-geth/javascript-console)(通过尾随的 `console` 子命令),你可以通过它使用 [`web3` 方法](https://github.com/ChainSafe/web3.js/blob/0.20.7/DOCUMENTATION.md)(注意:`geth` 中捆绑的 `web3` 版本非常旧,与官方文档不同步)以及 `geth` 自己的[管理 API](https://geth.ethereum.org/docs/interacting-with-geth/rpc) 进行交互。
此工具是可选的,如果你省略它,你始终可以使用 `geth attach` 将其附加到已经运行的 `geth` 实例。
### Holesky 测试网络上的全节点
转向开发者方向,如果你想尝试创建 Ethereum 合约,几乎肯定希望在熟练掌握整个系统之前不涉及任何真实资金。换句话说,你不是连接到主网络,而是希望将你的节点加入**测试**网络,该网络与主网络完全等效,但仅使用模拟 Ether。
```
$ geth --holesky console
```
`console` 子命令的含义与上述相同,在测试网上也同样有用。
然而,指定 `--holesky` 标志会稍微重新配置你的 `geth` 实例:
* 客户端将连接到 Holesky 测试网络,而不是连接到主 Ethereum 网络,该测试网络使用不同的 P2P 引导节点、不同的网络 ID 和创世状态。
* `geth` 不会使用默认数据目录(例如 Linux 上的 `~/.ethereum`),而是会将其嵌套到 `holesky` 子文件夹中更深一层(Linux 上的 `~/.ethereum/holesky`)。请注意,在 OSX 和 Linux 上,这也意味着附加到正在运行的测试网节点需要使用自定义端点,因为 `geth attach` 默认会尝试附加到生产节点端点,例如 `geth attach /holesky/geth.ipc`。Windows 用户不受此影响。
*注意:尽管有一些内部保护措施可防止交易在主网络和测试网络之间交叉,但你应该始终为模拟资金和真实资金使用单独的账户。除非你手动移动账户,否则 `geth` 默认会正确分离这两个网络,并且不会在它们之间共享任何账户。*
### 配置
作为向 `geth` 二进制文件传递大量标志的替代方法,你还可以通过以下方式传递配置文件:
```
$ geth --config /path/to/your_config.toml
```
要了解文件应该是什么样子,你可以使用 `dumpconfig` 子命令导出你现有的配置:
```
$ geth --your-favourite-flags dumpconfig
```
#### Docker 快速入门
在你的机器上启动并运行 Ethereum 的最快方法之一是使用 Docker:
```
docker run -d --name ethereum-node -v /Users/alice/ethereum:/root \
-p 8545:8545 -p 30303:30303 \
ethereum/client-go
```
这将像上面的命令一样,以 snap-sync 模式启动 `geth`,并具有 1GB 的 DB 内存配额。它还将在你的主目录中创建一个持久化卷,用于保存你的区块链,以及映射默认端口。还有一个 `alpine` 标签可用于映像的精简版本。
如果你想从其他容器和/或主机访问 RPC,请不要忘记 `--http.addr 0.0.0.0`。默认情况下,`geth` 绑定到本地接口,RPC 端点无法从外部访问。
### 以编程方式接口 `geth` 节点
作为一名开发者,迟早你会希望通过自己的程序开始与 `geth` 和 Ethereum 网络交互,而不是通过控制台手动进行。为了辅助这一点,`geth` 内置了对基于 JSON-RPC 的 API([标准 API](https://ethereum.org/en/developers/docs/apis/json-rpc/) 和 [`geth` 特定 API](https://geth.ethereum.org/docs/interacting-with-geth/rpc))的支持。
这些可以通过 HTTP、WebSockets 和 IPC(基于 UNIX 平台上的 UNIX 套接字,以及 Windows 上的命名管道)暴露。
IPC 接口默认启用并暴露 `geth` 支持的所有 API,而 HTTP 和 WS 接口由于安全原因需要手动启用,并且只暴露 API 的一个子集。这些可以按你的预期打开/关闭和配置。
基于 HTTP 的 JSON-RPC API 选项:
* `--http` 启用 HTTP-RPC 服务器
* `--http.addr` HTTP-RPC 服务器监听接口(默认:`localhost`)
* `--http.port` HTTP-RPC 服务器监听端口(默认:`8545`)
* `--http.api` 通过 HTTP-RPC 接口提供的 API(默认:`eth,net,web3`)
* `--http.corsdomain` 接受跨域请求的域的逗号分隔列表(浏览器强制执行)
* `--ws` 启用 WS-RPC 服务器
* `--ws.addr` WS-RPC 服务器监听接口(默认:`localhost`)
* `--ws.port` WS-RPC 服务器监听端口(默认:`8546`)
* `--ws.api` 通过 WS-RPC 接口提供的 API(默认:`eth,net,web3`)
* `--ws.origins` 接受 WebSocket 请求的源
* `--ipcdisable` 禁用 IPC-RPC 服务器
* `--ipcpath` datadir 中 IPC 套接字/管道的文件名(显式路径转义它)
你需要使用自己的编程环境的功能(库、工具等)通过 HTTP、WS 或 IPC 连接到配置了上述标志的 `geth` 节点,并且你需要在所有传输层上使用 [JSON-RPC](https://www.jsonrpc.org/specification)。你可以为多个请求重用同一个连接!
**注意:在开放基于 HTTP/WS 的传输层之前,请理解其安全影响!互联网上的黑客正在积极尝试利用暴露的 API 破坏 Ethereum 节点!此外,所有浏览器标签页都可以访问本地运行的 Web 服务器,因此恶意网页可能会尝试破坏本地可用的 API!**
### 运营私有网络
维护你自己的私有网络更加复杂,因为在官方网络中理所当然的许多配置需要手动设置。
不幸的是,自从 [the Merge](https://ethereum.org/en/roadmap/merge/) 以来,不再可能在没有同时设置相应的信标链的情况下轻松设置 geth 节点网络。
根据你的用例,有三种不同的解决方案:
* 如果你正在寻找一种在 CI 中从 go 测试智能合约的简单方法,可以使用 [Simulated Backend](https://geth.ethereum.org/docs/developers/dapp-developer/native-bindings#blockchain-simulator)。
* 如果你想要一个方便的单节点测试环境,可以使用我们的 [Dev Mode](https://geth.ethereum.org/docs/developers/dapp-developer/dev-mode)。
* 如果你正在寻找多节点测试网络,可以使用 [Kurtosis](https://geth.ethereum.org/docs/fundamentals/kurtosis) 轻松设置一个。
## 贡献
感谢你考虑帮助处理源代码!我们欢迎来自互联网上任何人的贡献,并感激哪怕是最微小的修复!
如果你想为 go-ethereum 做出贡献,请 fork、修复、提交并发送 pull request,供维护者审查并合并到主代码库中。但是,如果你希望提交更复杂的更改,请先在我们的 [Discord 服务器](https://discord.gg/invite/nthXNEv)上与核心开发者确认,以确保这些更改符合项目的总体理念,和/或获得一些早期反馈,这既能减轻你的工作量,也能使我们的审查和合并过程快速而简单。
请确保你的贡献符合我们的编码准则:
* 代码必须遵守官方 Go [格式化](https://golang.org/doc/effective_go.html#formatting)准则(即使用 [gofmt](https://golang.org/cmd/gofmt/))。
* 代码文档必须遵守官方 Go [注释](https://golang.org/doc/effective_go.html#commentary)准则。
* Pull requests 需要基于 `master` 分支并针对该分支开启。
* 提交消息应以其修改的包作为前缀。
* 例如,“eth, rpc: make trace configs optional”
请参阅[开发者指南](https://geth.ethereum.org/docs/developers/geth-developer/dev-guide),了解有关配置环境、管理项目依赖项和测试过程的更多详细信息。
### 为 geth.ethereum.org 做贡献
若要为 [go-ethereum 网站](https://geth.ethereum.org)做出贡献,请检出 `website` 分支并针对该分支提出 pull requests。
有关更详细的说明,请参阅 `website` 分支的 [README](https://github.com/ethereum/go-ethereum/tree/website#readme) 或网站的[贡献](https://geth.ethereum.org/docs/developers/geth-developer/contributing)页面。
## 许可证
go-ethereum 库(即 `cmd` 目录之外的所有代码)根据 [GNU Lesser General Public License v3.0](https://www.gnu.org/licenses/lgpl-3.0.en.html) 授权,该许可证也包含在我们存储库的 `COPYING.LESSER` 文件中。
go-ethereum 二进制文件(即 `cmd` 目录内的所有代码)根据 [GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.en.html) 授权,该许可证也包含在我们存储库的 `COPYING` 文件中。
标签:DNS解析, EVTX分析, EVTX分析, Geth, Golang, Go语言, IP 地址批量处理, Layer 1, P2P网络, RPC接口, Web3, 以太坊, 全节点, 共识机制, 分布式账本, 加密货币, 区块链, 区块链开发, 去中心化, 安全编程, 开源项目, 执行层, 日志审计, 智能合约, 程序破解, 网络信息收集, 请求拦截, 高并发