Ethereum 协议的官方 golang 实现。
可自动构建稳定版本和未稳定的主分支。二进制归档文件发布在 https://geth.ethereum.org/downloads/。
有关先决条件和详细的构建说明,请阅读 wiki 上的 安装说明。
构建geth需要同时拥有一个 Go 和一个 C 编译器。您可以使用您喜欢的包管理器来安装它们。一旦安装了依赖项,运行
make geth
或者,要构建全部工具
make all
go-ethereum 项目包含几个在 cmd
目录下找到的包装器/可执行文件。
命令 | 描述 |
---|---|
geth |
我们的主要 Ethereum CLI 客户端。它是 Ethereum 网络的入口点(主网、测试网或私有网),可以作为一个全节点(默认)归档节点(保留所有历史状态)或轻节点(实时检索数据)。它可以由其他进程用作通过 HTTP、WebSocket 和/或 IPC 转载在顶部的 JSON RPC 端点进入 Ethereum 网络的网关。请参阅 geth --help 和 CLI Wiki 页面 以获取命令行选项 |
abigen |
将 Ethereum 合约定义转换为易于使用、编译时类型安全的 Go 包的源代码生成器。它操作的是普通的 Ethereum 合约 ABIs,如果合约字节码也可用,则具有扩展的功能。然而,它也可以接受 Solidity 源文件,使开发过程更加流畅。请参阅我们的 原生 DApps wiki 页面以获取详细信息。 |
bootnode |
我们以太坊客户端实现的一种精简版本,仅参与网络节点发现协议,但不运行任何高级应用协议。它可以作为一个轻量级的引导节点,帮助在私有网络中找到Peer。 |
disasm |
将EVM(以太坊虚拟机)字节码转换为更用户友好的汇编式指令(例如:echo "6001" | disasm )。有关单个指令的详细信息,请参阅以太坊黄皮书的第22-30页。 |
evm |
具有运行字节码片段并在可配置环境中执行的模式。它的目的是允许对EVM指令进行隔离、精细的调试(例如:evm --code 60ff60ff --debug )。 |
gethrpctest |
开发者工具,支持我们的ethereum/rpc-test测试套件,该套件验证了基本符合以太坊JSON-RPC规范。有关测试套件的详细信息,请参阅test suite的readme。 |
rlpdump |
开发者工具,将二进制RLP(递归长度前缀)转储(以太坊协议在网络和一致性方面的数据编码)转换为更友好的分层表示(例如:rlpdump --hex CE0183FFFFFFC4C304050583616263 )。 |
bzzd |
swarm守护程序。这是swarm网络的入口点。bzzd --help 用于命令行选项。请参阅https://swarm-guide.readthedocs.io获取swarm文档。 |
bzzup |
swarm命令行文件上传器。bzzup --help 用于命令行选项 |
bzzhash |
计算文件或目录的swarm哈希的命令。bzzhash --help 用于命令行选项 |
在这里遍历所有可能的命令行选项超出了范围(请参阅我们的CLI Wiki页面),但我们已列出了一些常见的参数组合,以快速了解您如何运行自己的Geth实例。
最常见的情况是人们想要简单地与Ethereum网络互动:创建账户;转账;部署和交互合同。对于这个特定的用例,用户不关心多年的历史数据,因此我们可以快速同步到网络的当前状态。要这样做
$ geth --fast --cache=512 console
此命令将
--fast
),从而在不处理整个Ethereum网络历史记录(这非常耗时)的情况下下载更多数据。--cache=512
),这对于同步时间可以显著帮助,特别是对于HDD用户。此标志是可选的,您可以将其设置为任何高度,但我们建议范围为512MB - 2GB。console
子命令),通过它可以调用所有官方web3
方法以及Geth自己的管理API。这也是可选的,如果您省略它,您始终可以通过geth --attach
附加到一个已经运行的Geth实例。转换到开发者模式,如果您想尝试创建以太坊合约,您很可能希望在没有实际资金参与的情况下完成,直到您完全掌握了整个系统。换句话说,您想替代连接主网络,而是希望将您的节点加入测试网络,这与主网络完全等效,但只支持模拟以太币。
$ geth --testnet --fast --cache=512 console
--fast
、--cache
标志和console
子命令与上述命令具有完全相同的意义,并在测试网上同样有用。请查看上面的说明,如果您已经跳到此处。
然而,指定--testnet
标志将稍微重新配置您的Geth实例
~/.ethereum
),Geth将自行深入一个testnet
子目录(在Linux上为~/.ethereum/testnet
)。注意:尽管有一些内部保护措施来防止事务在主网络和测试网络之间交叉(不同的起始非ces),但您应该始终确保为模拟货币和真实货币使用独立的账户。除非您手动移动账户,否则Geth会默认正确分离两个网络,并不会有任何账户在它们之间可供使用。
将Ethereum应用程序快速部署到您的计算机上的最快方法之一是使用Docker
docker run -d --name ethereum-node -v /Users/alice/ethereum:/root \
-p 8545:8545 -p 30303:30303 \
ethereum/client-go --fast --cache=512
这将像上述命令一样启动geth以进行快速同步,并允许数据库内存使用量为512MB。它还将为您的主目录创建一个持久性卷,用于保存区块链以及映射默认端口。还有一个可供alpine
标记使用的紧凑型版本映像。
作为一名开发者,您迟早会想通过您自己的程序而不是手动通过控制台与Geth和以太坊网络交互。为了帮助您实现这一点,Geth内置了对基于JSON-RPC的API(标准API和Geth特定API)的支持。这些可以通过HTTP、WebSockets和IPC(Unix平台上的Unix套接字,Windows上的命名管道)暴露。
IPC接口是默认启用的,公开了Geth支持的所有API,而HTTP和WS接口需要手动启用并仅公开API的一部分,这是出于安全原因。这些都可以根据您的期望打开/关闭和配置。
基于HTTP的JSON-RPCAPI选项
--rpc
启用HTTP-RPC服务器--rpcaddr
HTTP-RPC服务器监听接口(默认:"localhost")--rpcport
HTTP-RPC服务器监听端口(默认:8545)--rpcapi
在HTTP-RPC接口上提供的API(默认:"eth,net,web3")--rpccorsdomain
以逗号分隔的域列表,允许接收跨源请求(浏览器强制执行)--ws
启用WS-RPC服务器--wsaddr
WS-RPC服务器监听接口(默认:"localhost")--wsport
WS-RPC服务器监听端口(默认:8546)--wsapi
在WS-RPC接口上提供的API(默认:"eth,net,web3")--wsorigins
允许接收WebSocket请求的源--ipcdisable
禁用IPC-RPC服务器--ipcapi
在IPC-RPC接口上提供的API(默认:"admin,debug,eth,miner,net,personal,shh,txpool,web3")--ipcpath
数据目录中IPC套接字/管道的文件名(明确路径将其转义)您需要使用自己的编程环境的能力(库、工具等)通过HTTP、WS或IPC连接到使用上述标志配置的Geth节点,并且需要在所有传输中使用[1]JSON-RPC进行通信。您可以重复使用相同的连接来发送多个请求!
注意:在开放HTTP/WS基于的传输之前,请了解其安全影响!互联网上的黑客正在积极尝试破坏暴露API的以太坊节点!此外,所有浏览器标签都可以访问本地运行的Web服务器,因此恶意网页可能会尝试破坏本地可用的API!
维护自己的私有网络更为复杂,因为在官方网络中默认的许多配置需要手动设置。
首先,您需要创建您的网络创世状态,所有的节点都需要了解并对此达成一致。这由一个小JSON文件组成(例如,可以将其命名为genesis.json
)
{
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x20000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
上述字段对于大多数用途应该都是足够的,尽管我们建议将nonce
更改为某个随机值,以防止未知远程节点连接到您。如果您想要预先为一些账户充币以便更容易测试,可以在alloc
字段中设置账户配置
"alloc": {
"0x0000000000000000000000000000000000000001": {"balance": "111111111"},
"0x0000000000000000000000000000000000000002": {"balance": "222222222"}
}
在上述JSON文件中定义了创世状态后,您在启动之前需要初始化每个Geth节点,以确保所有区块链参数都正确设置。
$ geth init path/to/genesis.json
所有的节点都初始化到所需的创世状态后,您需要启动一个引导节点,以便其他人可以使用它在您的网络中和/或互联网上找到彼此。干净的做法是配置和运行一个专门的bootnode。
$ bootnode --genkey=boot.key
$ bootnode --nodekey=boot.key
bootnode上线后,它会显示一个enode
URL,其他节点可以使用它来连接到bootnode并交换对等信息。确保将显示的IP地址信息(大多数情况下为[::]
)替换为您外网可访问的IP地址以获取实际的enode
URL。
注意:您也可以使用完整的Geth节点作为bootnode,但这不是推荐的做法。
引导节点运行并且外网可访问(您可以通过尝试telnet <ip> <port>
来确保它确实可访问),启动每个后续的Geth节点并将其指向bootnode,通过--bootnodes
标志进行对等发现。也可能需要保持您的私有网络数据目录分离,因此也指定一个自定义的--datadir
标志。
$ geth --datadir=path/to/custom/data/folder --bootnodes=<bootnode-enode-url-from-above>
注意:由于您的网络将完全从主网络和测试网络隔离,您还需要配置一个挖矿机来处理交易并为您创建新块。
在公共以太坊网络上挖矿是一个复杂的过程,因为它只能使用GPU,需要启用OpenCL或CUDA的ethminer
实例。有关此类设置的更多信息,请参阅EtherMining subreddit和Genoil挖矿机仓库。
然而,在一个私有网络环境中,单个CPU挖矿实例就足以满足实用需求,因为它可以在正确的时间间隔内产生稳定的区块流,而不需要大量的资源(考虑在单个线程上运行,也不需要多个线程)。要启动一个用于挖矿的Geth实例,运行它时使用您所有的常规标志,并通过以下方式扩展
$ geth <usual-flags> --mine --minerthreads=1 --etherbase=0x0000000000000000000000000000000000000000
这将启动在单个CPU线程上挖矿块和事务,并将所有收入归入由–etherbase
指定的账户。您可以通过更改默认的gas限制区块收敛到(《–targetgaslimit》)和接受事务的gas价格(《–gasprice》)来进一步调整挖矿。
感谢您考虑为源代码提供帮助!我们欢迎来自互联网上任何人的贡献,并对任何微小的修复都表示感谢!
如果您想为go-ethereum做出贡献,请将其分叉、修复、提交并发送拉取请求以供维护者审查和合并到主代码库。但是,如果您希望提交更复杂的变化,请首先在我们的gitter通道上与核心开发者检查,以确保这些更改与项目的一般理念相符并/或获取一些早期反馈,这将使您的努力更加轻松,同时将我们的审查和合并程序变得快速和简单。
请确保您的贡献符合我们的编码指南
master
分支打开。有关配置您的环境、管理项目依赖项和测试程序的更多详细信息,请参阅开发者指南。
go-ethereum库(即cmd
目录之外的所有代码)是根据GNU Lesser General Public License v3.0许可的,也包括在我们存储库的COPYING.LESSER
文件中。
go-ethereum二进制文件(即cmd
目录中的所有代码)是根据GNU General Public License v3.0许可的,也包括在我们存储库的COPYING
文件中。