以太坊源码解析(三)安装和构建

Posted by 姚飞亮 on 2020-07-10

以太坊源码解析(三)安装和构建

安装Geth

您可以使用多种方式安装以太坊的Go实施。其中包括通过您最喜欢的软件包管理器进行安装;下载独立的预建套件;作为docker容器运行; 或自己建造。本文档详细介绍了以任何您喜欢的方式让您加入以太坊网络的所有可能性。

从程序包管理器安装

通过Homebrew在macOS上安装

安装以太坊的最简单方法是使用我们的Homebrew水龙头。如果没有Homebrew,请先安装它

运行以下命令以添加水龙头并进行安装geth

1
2
brew tap ethereum/ethereum
brew install ethereum

您可以使用以下--devel参数安装master分支:

1
brew install ethereum --devel

abigenbootnodecheckpoint-adminclefdevp2pethkeyevmfaucetgethp2psimpuppethrlpdump,和wnode命令是那么你的系统上可用/usr/local/bin/

查找可用的其他选项和命令geth --help

通过PPA在Ubuntu上安装

在基于Ubuntu的发行版上安装go-ethereum的最简单方法是使用内置的启动板PPA(个人软件包档案)。我们提供的是包含了我们的稳定和开发版本的Ubuntu版本的单PPA仓库trustyxenialzestyartful

要启用我们的启动板存储库,请运行:

1
sudo add-apt-repository -y ppa:ethereum/ethereum

然后安装稳定版的go-ethereum:

1
2
sudo apt-get update
sudo apt-get install ethereum

或通过以下方式开发版本:

1
2
sudo apt-get update
sudo apt-get install ethereum-unstable

abigenbootnodeclefevmgethpuppethrlpdump,和wnode命令是那么你的系统上可用/usr/bin/

查找可用的其他选项和命令geth --help

在Windows上安装

安装go-ethereum的最简单方法是从下载页面下载预编译的二进制文件。该页面提供了一个安装程序以及一个zip文件。安装程序将自动geth放入您的PATH系统。该zip文件包含.exe可通过在命令提示符下运行而无需安装即可使用的命令文件。

通过pkg在FreeBSD上安装
1
pkg install go-ethereum

geth然后,该命令将在您的系统上的中提供/usr/local/bin/。您可以使用以下方法在您的节点上创建一个新帐户:

1
geth account new

查找可用的其他选项和命令geth --help

通过端口安装在FreeBSD上

转到net-p2p/go-ethereum端口目录:

1
cd /usr/ports/net-p2p/go-ethereum

然后以标准方式(作为根)构建它:

1
make install

abigenbootnodeclefevmgethpuppethrlpdump,和wnode命令是那么你的系统上可用/usr/local/bin/

查找可用的其他选项和命令geth --help

通过以下方式在Arch Linux上安装 pacman

geth软件包可从社区仓库中获得

您可以使用以下方法安装它:

1
pacman -S geth

abigenbootnodeclefevmgethpuppethrlpdump,和wnode命令是那么你的系统上可用/usr/bin/

查找可用的其他选项和命令geth --help

下载独立捆绑包

我们以独立捆绑包的形式分发稳定的发行版和开发版本。当您希望:a)安装特定版本的代码(例如,用于可重现的环境)时,这些功能非常有用。b)安装在无法访问互联网的机器上(例如,装有气隙的计算机);或c)不喜欢自动更新,而宁愿手动安装软件。

我们创建以下独立捆绑包:

  • .tar.gzLinux上的32位,64位,ARMv5,ARMv6,ARMv7和ARM64归档文件()
  • .tar.gzmacOS上的64位归档文件()
  • Windows上的32位和64位归档文件(.zip)和安装程序(.exe

我们提供包含Geth的只含有Geth的档案,档案与我们的资源库的开发工具一起(abigenbootnodedisasmevmrlpdump)。阅读我们README以获取有关这些可执行文件的更多信息。

Go Ethereum下载页面下载这些捆绑包。

在Docker容器中运行

如果您喜欢容器化的流程,我们会维护一个Docker映像,其中包含我们develop在DockerHub上的分支机构的最新快照。我们维护四个不同的Docker映像,以运行Geth的最新稳定版本或开发版本。

  • ethereum/client-go:latest 是Geth的最新开发版本(默认)
  • ethereum/client-go:stable 是Geth的最新稳定版本
  • ethereum/client-go:{version} 是Geth在特定版本号上的稳定版本
  • ethereum/client-go:release-{version} 是Geth在特定版本系列中的最新稳定版本

要提取图像并启动节点,请运行以下命令:

1
2
docker pull ethereum/client-go
docker run -it -p 30303:30303 ethereum/client-go

我们还维护了四个不同的Docker镜像,以运行其他以太坊工具的最新稳定版或开发版。

  • ethereum/client-go:alltools-latest 是以太坊工具的最新开发版本
  • ethereum/client-go:alltools-stable 是以太坊工具的最新稳定版本
  • ethereum/client-go:alltools-{version} 是特定版本号的以太坊工具的稳定版本
  • ethereum/client-go:alltools-release-{version} 是特定版本系列中以太坊工具的最新稳定版本

该映像具有以下自动暴露的端口:

  • 8545 TCP,由基于HTTP的JSON RPC API使用
  • 8546 TCP,由基于WebSocket的JSON RPC API使用
  • 8547 GraphQL API使用的TCP
  • 30303 TCP和UDP,由运行网络的P2P协议使用

请注意,如果您正在Docker容器中运行以太坊客户端,则应将数据卷挂载为客户端的数据目录(位于/root/.ethereum容器内部),以确保在重启和/或容器生命周期之间保留下载的数据。

从源代码构建Go-ethereum

大多数Linux系统和macOS

Go Ethereum是用Go编写的,因此要从源代码构建,您需要Go的最新版本。本指南没有介绍如何安装Go本身,有关详细信息,请阅读Go安装说明,并从Go下载页面获取所需的捆绑包。

安装Go之后,您可以通过以下方式将项目下载到您的GOPATH工作区中:

1
go get -d github.com/ethereum/go-ethereum

上面的命令不生成任何可执行文件。为此,您可以专门构建一个:

1
go install github.com/ethereum/go-ethereum/cmd/geth

或者,您可以geth通过go install ./...在工作空间ethereum/go-ethereum内的存储库根目录中运行来构建整个项目并与所有开发人员工具一起安装GOPATH

如果您使用的是macOS,并看到与macOS头文件有关的错误,请使用来安装XCode命令行工具xcode-select --install,然后重试。

windows

Chocolatey软件包管理器提供了一种简单的方法来安装所需的构建工具。如果您没有巧克力味,请按照说明进行安装。

然后打开管理员命令提示符并安装所需的构建工具:

1
2
3
C:\Windows\system32> choco install git
C:\Windows\system32> choco install golang
C:\Windows\system32> choco install mingw

安装这些软件包会设置路径环境变量,您需要打开新的命令提示符以获取新路径。

以下步骤不需要管理员权限。首先创建并设置Go工作区目录布局,然后克隆源并进行构建。

1
2
3
4
5
C:\Users\xxx> mkdir src\github.com\ethereum
C:\Users\xxx> git clone https://github.com/ethereum/go-ethereum src\github.com\ethereum\go-ethereum
C:\Users\xxx> cd src\github.com\ethereum\go-ethereum
C:\Users\xxx> go get -u -v golang.org/x/net/context
C:\Users\xxx\src\github.com\ethereum\go-ethereum> go install -v ./cmd/...
FreeBSD

端口稍微更新一些(撰写本文时为1.8.14)

将存储库克隆到您选择的目录中:

1
git clone https://github.com/ethereum/go-ethereum

构建geth需要Go编译器:

1
pkg install go

如果您的golang版本> = 1.5,请geth使用以下命令构建程序:

1
2
cd go-ethereum
make geth

如果您的golang版本小于1.5(例如,季度软件包),请改用以下命令:

1
2
cd go-ethereum
CC=clang make geth

现在,您可以运行build/bin/geth以启动节点。

没有Go工作流程的构建

如果您不想在机器上设置Go工作区,而只希望构建geth而忘了构建过程,则可以克隆我们的存储库并使用make命令,该命令将所有内容配置为临时构建并随后进行清理。这种构建方法仅适用于类似UNIX的操作系统,并且您仍然需要安装Go。

1
2
3
git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum
make geth

这些命令gethgo-ethereum/build/bin文件夹中创建一个可执行文件,您可以将其移动到任何要从其运行的位置。二进制文件是独立的,不需要任何其他文件。

备份与还原

最重要的信息是:记住您的密码备份您的键盘存储

资料目录

一切geth持久的内容都会写入其数据目录中。默认数据目录位置是特定于平台的:

  • 苹果电脑: ~/Library/Ethereum
  • Linux: ~/.ethereum
  • windows: %APPDATA%\Ethereum

帐户存储在keystore子目录中。该目录的内容应可在节点,平台,实现(C ++,Go,Python)之间传输。

要配置数据目录的位置,--datadir可以指定参数。有关更多详细信息,请参见CLI选项

请注意,ethash dag存储在~/.ethash(Mac / Linux)或 %APPDATA%\Ethash(Windows)中,以便所有客户端都可以重复使用。您可以使用符号链接将其存储在其他位置。

清理

盖斯的区块链和状态数据库可以通过以下方式删除:

1
geth removedb

这对于删除旧链并同步到新链很有用。它仅影响可以在同步时重新创建的数据目录,并且不涉及密钥库。

区块链导入/导出

使用以下格式以二进制格式导出区块链:

1
geth export <filename>

或者,如果您想随时间备份部分链,则可以指定第一个和最后一个块。例如,备份第一个纪元:

1
geth export <filename> 0 29999

请注意,备份部分链时,文件将被附加而不是被截断。

通过以下方式导入二进制格式的区块链导出:

1
geth import <filename>

有关更多信息,请参见https://github.com/ethereum/wiki/wiki/Blockchain-import-export

最后:记住您的密码备份您的键盘存储

交叉编译Geth

注意:所有这些以及更多内容都已合并到项目Makefile中。您可以通过交叉构建,make geth--而无需从下面知道这些详细信息。

开发人员通常拥有一个使他们感到最舒适的首选平台,并为最佳工作流设置了所有必要的工具,库和环境。但是,通常需要针对不同的CPU体系结构或完全不同的操作系统进行构建。但是为每个维护一个开发环境并在它们之间快速切换变得很笨拙。

在这里,我们提供了一种非常简单的方法,即使用最少的先决条件和完全容器化的方法将以太坊交叉编译到各种操作系统和体系结构,即使在复杂的交叉编译要求和机制之后,也可以确保您的开发环境保持干净。

当前支持的目标平台是:

  • ARMv7 Android和iOS
  • 32位,64位和ARMv5 Linux
  • 32位和64位Mac OSX
  • 32位和64位Windows

请注意,交叉编译不会替代发行版本。尽管生成的二进制文件通常可以在所需的平台上完美运行,但是使用由官方供应商提供的专用工具在本机系统上进行编译通常可以产生更为精细的代码。

交叉编译环境

尽管该go-ethereum项目是用Go编写的,但它确实包含了一些在所有实现之间共享的C代码,以确保所有实现均表现良好,包括对GNU多精度算法库的依赖。因此,Go本身无法编译到与主机不同的平台。为了克服这一限制,我们将使用xgo基于Docker容器的Go交叉编译器软件包,该软件包经过专门设计,可在编译过程中同时包含嵌入式C代码片段和更简单的外部C依赖项。

xgo项目具有两个简单的依赖项:Docker(以确保完全包含构建环境)和Go。在大多数平台上,这些都可以从官方程序包存储库中获得。要手动安装它们,请分别在DockerGo上查阅其安装指南。本指南假定满足这两个依赖性。

要安装和/或更新xgo,只需键入:

1
$ go get -u github.com/karalabe/xgo

您可以xgo通过请求自身进行交叉编译并验证所有交叉编译是否成功来测试其是否正常运行。

1
2
3
4
5
6
7
8
9
10
11
12
$ xgo github.com/karalabe/xgo
...

$ ls -al
-rwxr-xr-x 1 root root 2792436 Sep 14 16:45 xgo-android-21-arm
-rwxr-xr-x 1 root root 2353212 Sep 14 16:45 xgo-darwin-386
-rwxr-xr-x 1 root root 2906128 Sep 14 16:45 xgo-darwin-amd64
-rwxr-xr-x 1 root root 2388288 Sep 14 16:45 xgo-linux-386
-rwxr-xr-x 1 root root 2960560 Sep 14 16:45 xgo-linux-amd64
-rwxr-xr-x 1 root root 2437864 Sep 14 16:45 xgo-linux-arm
-rwxr-xr-x 1 root root 2551808 Sep 14 16:45 xgo-windows-386.exe
-rwxr-xr-x 1 root root 3130368 Sep 14 16:45 xgo-windows-amd64.exe
建立以太坊

交叉编译以太坊类似于上面的示例,但是需要额外的标志来满足依赖关系:

  • --deps 用于注入任意C依赖包并进行预构建

注入GNU算术库依赖项并进行选择geth将是:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ xgo --deps=https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2 \
github.com/ethereum/go-ethereum/cmd/geth
...

$ ls -al
-rwxr-xr-x 1 root root 23213372 Sep 14 17:59 geth-android-21-arm
-rwxr-xr-x 1 root root 14373980 Sep 14 17:59 geth-darwin-386
-rwxr-xr-x 1 root root 17373676 Sep 14 17:59 geth-darwin-amd64
-rwxr-xr-x 1 root root 21098910 Sep 14 17:59 geth-linux-386
-rwxr-xr-x 1 root root 25049693 Sep 14 17:59 geth-linux-amd64
-rwxr-xr-x 1 root root 20578535 Sep 14 17:59 geth-linux-arm
-rwxr-xr-x 1 root root 16351260 Sep 14 17:59 geth-windows-386.exe
-rwxr-xr-x 1 root root 19418071 Sep 14 17:59 geth-windows-amd64.exe

由于交叉编译器需要为每个平台构建所有依赖关系以及主项目本身,因此可能需要一段时间才能完成构建(在Core i7 3770K计算机上大约需要3-4分钟)。

微调构建

默认情况下,Go(当然是Go)xgo会签出并尝试构建源存储库的master分支。但是,通常,您可能希望从可能完全不同的远程存储库中构建一个不同的分支。这些可以通过--remote--branch标志进行控制。

要构建develop官方go-ethereum存储库的分支而不是默认master分支,只需将其指定为其他命令行标志(--branch):

1
2
3
$ xgo --deps=https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2 \
--branch=develop \
github.com/ethereum/go-ethereum/cmd/geth

此外,在开发过程中,您很可能不仅要构建一个自定义分支,而且要构建一个来自您自己的存储库分支的分支,而不是上游分支。这可以通过--remote标志来完成:

1
2
3
4
$ xgo --deps=https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2 \
--remote=https://github.com/karalabe/go-ethereum \
--branch=rpi-staging \
github.com/ethereum/go-ethereum/cmd/geth

默认情况下,xgo会为所有受支持的平台和体系结构生成二进制文件,而Android二进制文件默认为发布的最高Android NDK平台。要限制构建目标或将其编译为其他Android平台,请使用--targetsCLI参数。

1
2
3
$ xgo --deps=https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2 \
--targets=android-16/arm,windows/* \
github.com/ethereum/go-ethereum/cmd/geth
本地建筑

如果您想交叉编译您的本地开发版本,只需指定一个本地路径(以.或开头/),xgo并将使用中的所有本地代码GOPATH,仅下载缺少的依赖项。当然,在这种情况下--branch--remote--pkg参数是无操作的:

1
2
$ xgo --deps=https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2 \
./cmd/geth
使用Makefile

了解了xgo基础交叉编译的要点后,您实际上不需要记住和维护这些命令,因为它们已被合并到官方的 Makefile中,并且可以通过简单的make请求来调用:

  • make geth-cross:交叉编译到所有受支持的操作系统和体系结构
  • make geth-:交叉编译特定操作系统的支持架构(例如linux
  • make geth--:交叉编译到一个特定的OS /体系结构(例如linuxarm

我们建议使用make基于命令的命令,而不是手动调用,xgo因为我们会积极维护Makefile,但我们不能保证此文档将始终保持最新状态。

调整十字架的身材

一些xgo构建选项也已经直接出现在Makefile中,以使微调构建可以解决上游Go问题或启用一些更高级的机制。

  • make ... GO=:使用特定的Go运行时(例如1.5.11.5-developdevelop
  • make ... MODE=:建立一个特定的目标类型(例如exec-archive)。

请注意,这些尚未完全完成,因此将来随着我们的代码和Go运行时功能的更改,它们可能会更改,也可能不会更改。



Ω