GethDevelop 1.5.4

GethDevelop 1.5.4

测试已测试
Lang语言 Obj-CObjective C
许可协议 自定义
发布最后发布2016年11月

Go Ethereum iOS Builder维护。



  • 由以下人员贡献:
  • Ales Katona, Alex Leverington, Alexandre Van de Sande, Aron Fischer, Bas van Kervel, Benjamin Brent, Casey Detrio, Christoph Jentzsch, Daniel A. Nagy, Elliot Shepherd, Enrique Fynn, Ethan Buchman, Fabian Vogelsteller, Fabio Berger, Felix Lange, Gregg Dourgarian, Gustav Simonsson, Hao Bryan Cheng, Henning Diedrich, Isidoro Ghezzi, Jae Kwon, Jason Carver, Jeff R. Allen, Jeffrey Wilcke, Jens Agerberg, Jonathan Brown, Joseph Chow, Justin Clark-Casey, Kenji Siu, Kobi Gurkan, Lefteris Karapetsas, Leif Jurvetson, Maran Hidskes, Marek Kotewicz, Martin Holst Swende, Matthew Di Ferrante, Matthew Wampler-Doty, Nchinda Nchinda, Nick Dodson, Nick Johnson, Paulo L F Casaretto, Peter Pratscher, Péter Szilágyi, RJ Catalano, Ramesh Nair, Ricardo Catalinas Jiménez, Rémy Roy, Stein Dekker, Steven Roose, Taylor Gerring, Thomas Bocek, Tosh Camille, Viktor Trón, Ville Sundell, Vincent G, Vitalik Buterin, Vlad Gluhovsky, Yohann Léon, Yoichi Hirai, Zsolt Felföldi 和 ΞTHΞЯSPHΞЯΞ

Ethereum Go

Ethereum 协议的官方 golang 实现。

API Reference

可自动构建稳定版本和未稳定的主分支。二进制归档文件发布在 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 --helpCLI 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用于命令行选项

运行geth

在这里遍历所有可能的命令行选项超出了范围(请参阅我们的CLI Wiki页面),但我们已列出了一些常见的参数组合,以快速了解您如何运行自己的Geth实例。

主Ethereum网络上的全节点

最常见的情况是人们想要简单地与Ethereum网络互动:创建账户;转账;部署和交互合同。对于这个特定的用例,用户不关心多年的历史数据,因此我们可以快速同步到网络的当前状态。要这样做

$ geth --fast --cache=512 console

此命令将

  • 以快速同步模式启动geth(--fast),从而在不处理整个Ethereum网络历史记录(这非常耗时)的情况下下载更多数据。
  • 将数据库内存配额提高到512MB(--cache=512),这对于同步时间可以显著帮助,特别是对于HDD用户。此标志是可选的,您可以将其设置为任何高度,但我们建议范围为512MB - 2GB。
  • 启动Geth内置的交互式JavaScript控制台(通过末尾的console子命令),通过它可以调用所有官方web3方法以及Geth自己的管理API。这也是可选的,如果您省略它,您始终可以通过geth --attach附加到一个已经运行的Geth实例。

Ethereum测试网络上的全节点

转换到开发者模式,如果您想尝试创建以太坊合约,您很可能希望在没有实际资金参与的情况下完成,直到您完全掌握了整个系统。换句话说,您想替代连接主网络,而是希望将您的节点加入测试网络,这与主网络完全等效,但只支持模拟以太币。

$ geth --testnet --fast --cache=512 console

--fast--cache标志和console子命令与上述命令具有完全相同的意义,并在测试网上同样有用。请查看上面的说明,如果您已经跳到此处。

然而,指定--testnet标志将稍微重新配置您的Geth实例

  • 而不是使用默认的数据目录(例如Linux上的~/.ethereum),Geth将自行深入一个testnet子目录(在Linux上为~/.ethereum/testnet)。
  • 客户端将连接到测试网络,而不是主以太坊网络,测试网络使用不同的P2P引导节点、不同的网络ID和创世状态。

注意:尽管有一些内部保护措施来防止事务在主网络和测试网络之间交叉(不同的起始非ces),但您应该始终确保为模拟货币和真实货币使用独立的账户。除非您手动移动账户,否则Geth会默认正确分离两个网络,并不会有任何账户在它们之间可供使用。

Docker快速启动

将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和以太坊网络交互。为了帮助您实现这一点,Geth内置了对基于JSON-RPC的API(标准APIGeth特定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 subredditGenoil挖矿机仓库

然而,在一个私有网络环境中,单个CPU挖矿实例就足以满足实用需求,因为它可以在正确的时间间隔内产生稳定的区块流,而不需要大量的资源(考虑在单个线程上运行,也不需要多个线程)。要启动一个用于挖矿的Geth实例,运行它时使用您所有的常规标志,并通过以下方式扩展

$ geth <usual-flags> --mine --minerthreads=1 --etherbase=0x0000000000000000000000000000000000000000

这将启动在单个CPU线程上挖矿块和事务,并将所有收入归入由–etherbase指定的账户。您可以通过更改默认的gas限制区块收敛到(《–targetgaslimit》)和接受事务的gas价格(《–gasprice》)来进一步调整挖矿。

贡献

感谢您考虑为源代码提供帮助!我们欢迎来自互联网上任何人的贡献,并对任何微小的修复都表示感谢!

如果您想为go-ethereum做出贡献,请将其分叉、修复、提交并发送拉取请求以供维护者审查和合并到主代码库。但是,如果您希望提交更复杂的变化,请首先在我们的gitter通道上与核心开发者检查,以确保这些更改与项目的一般理念相符并/或获取一些早期反馈,这将使您的努力更加轻松,同时将我们的审查和合并程序变得快速和简单。

请确保您的贡献符合我们的编码指南

  • 代码必须遵循官方Go 格式化指南(即使用gofmt)。
  • 代码必须遵循官方Go 注释指南。
  • 拉取请求需要基于并对master分支打开。
  • 提交信息应以它们修改的包(们)前缀。
    • 例如:“eth, rpc:使跟踪配置可选”

有关配置您的环境、管理项目依赖项和测试程序的更多详细信息,请参阅开发者指南

许可证

go-ethereum库(即cmd目录之外的所有代码)是根据GNU Lesser General Public License v3.0许可的,也包括在我们存储库的COPYING.LESSER文件中。

go-ethereum二进制文件(即cmd目录中的所有代码)是根据GNU General Public License v3.0许可的,也包括在我们存储库的COPYING文件中。