【连载】以太坊源码分析(1)本地搭建以太坊开发环境
发布于 1 年前 作者 路人-戊 3350 次浏览 来自 分享

最近由于工作原因,需要阅读以太坊源码,就顺便分享一下心得

准备编辑器

1、vim

个人比较习惯vim编辑器,可照此教程 来配置vim下的go开发环境。另外,除前面教程提到的vim插件,以下几个常用vim插件也推荐安装

  • scrooloose/nerdtree, 可以像IDE那样,树形浏览你的工程
  • mileszs/ack.vim, 全文搜索
  • scrooloose/nerdcommenter, 快速注释
  • yonchu/accelerated-smooth-scroll, 可以让vim滚屏操作更加流畅
  • ianva/vim-youdao-translater, 友道翻译
  • majutsushi/tagbar, 可以将正在编辑的文件生成一个大纲, 包含类/方法/变量等, 可以选中快速跳转到目标位置 更多插件可根据个人喜好来安装,戳这里可以查看我的最终配置

2、IDE

支持go语言的IDE都可以很好的满足需求,所以你可以根据个人喜好选择IDE,此处推荐几个(楼主表示都没用过)

  • Visual Studio Code
  • Sublime Text
  • LiteIDE
  • GoClipse

配置go的环境

go版本需要是1.7以上的,安装go的过程就不再赘述,Ubuntu上安装的过程可以参照这里 以下是楼主的go环境变量的配置,读者可自行参考

export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export PATH=$GOROOT/bin:$PATH
export GOPATH=/home/luren5/Project

如上,GOPATH路径为/home/luren5/Project, 以下为GOPATH目录下的子目录结构

- bin
- pkg
- src
  - github.com
    - ethereum
	  - go-ethereum

是的,你没看错!源码的路径非常深,go-ethereum 的绝对路径为/home/luren5/Project/src/github.com/ethereum/go-ethereum

下载源码

上述的go-ethereum 并不用自己新建,只需要切换到/home/luren5/Project/src/github.com/ethereum/目录下(如果没有,就需要自己新建了),然后执行git clone git@github.com:ethereum/go-ethereum.git即可

编译生成可执行文件

luren5@ubuntu:~/Project/src/github.com/ethereum/go-ethereum$ ls cmd/
abigen	bootnode  evm  faucet  geth  internal  puppeth	rlpdump  swarm	utils  wnode

可以看到,以上列出的每个子目录,都是一个单独的可编译的程序(都包含main.go文件),其中包括我们最常见的geth,来make一下

luren5@ubuntu:~/Project/src/github.com/ethereum/go-ethereum$ make geth
……(省略若干提示信息)
Done building.
Run "build/bin/geth" to launch geth.

最后生成的可执行文件为 build/bin/geth ,来验证一下

luren5@ubuntu:~/Project/src/github.com/ethereum/go-ethereum$ cd build/bin/
luren5@ubuntu:~/Project/src/github.com/ethereum/go-ethereum/build/bin$ ./geth 
INFO [04-25|01:06:54] Starting peer-to-peer node               instance=Geth/v1.6.1-unstable-54253aae/linux-amd64/go1.7.4
INFO [04-25|01:06:54] Allocated cache and file handles         database=/home/luren5/.ethereum/geth/chaindata cache=128 handles=1024
INFO [04-25|01:06:54] Initialised chain configuration          config="{ChainID: 1 Homestead: 1150000 DAO: 1920000 DAOSupport: true EIP150: 2463000 EIP155: 2675000 EIP158: 2675000 Engine: ethash}"

如上,可以正常启动geth, 也可以添加需要的参数(比如 --datadir, -rpcport之类的)。可以发现,这里编译生成的geth和通过apt-get安装的作用是一样的

9 回复

成功get到go的开发工具,太好了,谢谢分享。

在编译生成可执行文件时,出现以下错误,请问是什么原因呢 go版本是:go version go1.8.1 darwin/amd64

MacBook-Air-2:go-ethereum zhangyunlong$ ls cmd/
abigen		disasm		evm		gethrpctest	utils
bootnode	ethtest		geth		rlpdump
MacBook-Air-2:go-ethereum zhangyunlong$ make geth
build/env.sh go run build/ci.go install ./cmd/geth
unexpected directory layout:
	import path: _/Users/zhangyunlong/go/src/github.com/ethereum/go-ethereum/build/_workspace/src/github.com/ethereum/go-ethereum/internal/build
	root: /Users/zhangyunlong/go/src/github.com/ethereum/go-ethereum/build/_workspace/src
	dir: /Users/zhangyunlong/go/src/github.com/ethereum/go-ethereum/build/_workspace/src/github.com/ethereum/go-ethereum/internal/build
	expand root: /Users/zhangyunlong/go/src/github.com/ethereum/go-ethereum/build/_workspace/src
	expand dir: /Users/zhangyunlong/go/src/github.com/ethereum/go-ethereum/internal/build
	separator: /
make: *** [geth] Error 1

@小良苏 检查下你的go环境变量的配置以及你的代码目录结构是否正确

@路人-戊 我的go环境变量配置如下:

MacBook-Air-2:go-ethereum zhangyunlong$ go env
GOARCH="amd64"
GOBIN="/Users/zhangyunlong/go/bin"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/zhangyunlong/go"
GORACE=""
GOROOT="/usr/local/Cellar/go/1.8.1/libexec"
GOTOOLDIR="/usr/local/Cellar/go/1.8.1/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -gno-record-gcc-switches -fno-common"
CXX="clang++"
CGO_ENABLED="1"
PKG_CONFIG="pkg-config"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"

代码目录确认了是正确的。 我google了一些我的错误,有一个跟我go版本一样的也有一样的错误, image.png 相关链接 难道是go版本问题?

@小良苏 这个我不确定额…如下是我的go版本

luren5@ubuntu:~$ go version
go version go1.7.4 linux/amd64

和您一样,因为学习工作原因,需要阅读以太坊源码,和您一样,以太坊的开发环境,和源码都已经编译成功,能否请教一下接下来的源码分析该怎么进展吗?

目前go1.8版本还不能使用make命令,在下载源码之后,可以使用 go get github.com/ethereum/go-ethereum/cmd/geth 来代替make geth 可以参考 详细链接 如果是下载的最新的1.6.1版本的geth源码,执行go get会显示一些undefined的信息,不过貌似没什么影响。 然后就可以按照楼主的步骤执行geth啦

@小良苏 go版本是1.9.4的呢? 也是这么处理吗

@小良苏 通过 go get -d github.com/ethereum/go-ethereum 下载 通过 go install github.com/ethereum/go-ethereum/cmd/geth 安装 最后执行 make geth 齐活儿~

回到顶部