阅读源码对深入理解以太坊和区块链的原理是非常有用的,通过阅读源码可以知道交易、区块等核心数据结构的组成,可以对区块链的底层实现原理和运行过程有一个更清晰的认识,很多不明确的问题都可以从源码中找到答案。
网上以太坊的技术资料很多,但多数是关于智能合约和应用开发的,真正涉及底层实现和源码的很少。本文介绍以太坊go-ethereum源码的阅读环境配置,之后会陆续介绍一些源码阅读心得体会。以太坊有8种语言的实现,选择go-ethereum是因为它是以太坊的官方实现版本,包含了以太坊的所有特性,比较权威和全面,它是用go语言编写的,go语言学习起来比较容易,而且可读性也比较好。
阅读源码有一个代码编辑器就够了,但是为了更好的体验和更高的效率,还需要做一些配置,比如代码高亮、代码跳转等。
安装go语言
为了能支持代码跳转,需要安装go语言,安装教程参考这篇文章,其中最重要的是要保证正确设置了GOPATH
,这样才能进行代码跳转。如果想学习go语言,可以看一下在线教程A Tour of Go,或者去看《The Go Programming Language》这本书。
配置编辑器
看代码可以选择你喜欢的代码编辑器,我用的是Visual Studio Code,为了支持go语言代码高亮,需要安装一个插件。在vscode的插件面板中搜索lukehoban,安装即可。
接下来安装一些go语言工具(有些需要),在命令行中执行以下命令安装:
go get -u -v github.com/nsf/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v github.com/zmb3/gogetdoc
go get -u -v github.com/golang/lint/golint
go get -u -v github.com/lukehoban/go-outline
go get -u -v sourcegraph.com/sqs/goreturns
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v github.com/tpng/gopkgs
go get -u -v github.com/acroca/go-symbols
go get -u -v golang.org/x/tools/cmd/guru
go get -u -v github.com/cweill/gotests/...
go get -u -v golang.org/x/tools/cmd/godoc
go get -u -v github.com/fatih/gomodifytags
下载源码
以太坊代码都托管在github上,它的代码经常更新,每次更新会加入一些新的东西,也可能改变代码的组织架构,所以最好选择一个稳定版阅读,这里以1.5.9版本为例。
首先在GOPATH/src
下创建github.com/ethereum
目录:
$ mkdir -p $GOPATH/src/github.com/ethereum
然后进入上面创建的目录,下载go-ethereum项目源码:
$ cd $GOPATH/src/github.com/ethereum
$ git clone https://github.com/ethereum/go-ethereum.git
$ cd go-ethereum
$ git checkout v1.5.9
上面通过git clone
下载源码,然后通过git checkout
检出指定版本的代码,如果想使用其他版本,在git checkout
中指定相应的版本号即可。
下载完成后目录结构应该是这样的:
GOPATH/src
├── github.com
└── ethereum
└── go-ethereum
路径和目录名一定要与上面的一致,不能放到其他地方或者改成其他名字,因为go语言是按照路径搜索包的。
其实上面最重要的就是要正确设置了GOPATH
,并且要把源码放到GOPATH/src
中正确的路径中。接下来就可以开始阅读代码了。