0%

《7天以太坊源码解读》 — 1、前言、环境准备及启动

欢迎阅读《7天以太坊源码解读》系列。

>> 前言

今天是农历大年30,我本人2019年春节放假的第一天,我在杭州比特币中国上班。最近新型冠状病毒肆掠,导致很多在外工作的年轻人无法正常回家,我就是其中一个,我是湖北人,本是昨天回家的高铁(途径武汉),因为武汉市的情况,武汉市实行出入管控,所以我取消了行程,准备在杭州过完这个春节。7天假,今天是第一天假期,思考了一番,7天不能就这样潦草度过,需要做一些有意义的事情,所以有了这个《7天以太坊源码解读》系列教程,希望能帮助很多朋友了解以太坊的工作原理,以及它内部蕴含的区块链知识。顺口一提,我个人非常看好区块链技术在以后生活中的应用,希望结实相关技术人才,一起交流,一起在这个行业发挥光和热。

以太坊源码我本人之前对较老版本代码有些阅读,算是有些资本,如今代码变更较多,这次打算系统的跟大家一起研究学习一下。如有差错,请各位谅解并多多指出,我也是抱着学习的心态写出这个系列,希望能起到抛砖引玉的效果。

所以,让我们开始奇妙而又有意义的旅程吧!!!

>> 环境准备

>>> Golang安装

官方是是用Golang语言实现的以太坊协议,名作Geth(还有很多其他语言版本实现的以太坊协议,比如Rust版本的Parity),所以我们这里要安装Golang。

https://golang.org/

这里下载安装包安装Golang

Golang安装

安装完成后,验证你的安装:

1
go version

显示类似“go version go1.13.6 darwin/amd64”的字眼说明安装成功

>>> 下载以太坊源码

克隆官方源码。(家里网不行,我花了半个小时,无力吐槽。。。)

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

切换到v1.9.10,当前最新版本,我们以这个来分析源码

1
git checkout v1.9.10

IDE推荐使用Goland,下载地址:http://jetbrains.com/go/

>>> 启动以太坊

>>>> 编译

编译出二进制文件

1
make all

如果包下载不下来的话,可以先将GOPROXY设置为https://goproxy.io后再编译

1
export GOPROXY=https://goproxy.io

编译完成之后,在 build/bin 目录会生成一些二进制文件,可以直接运行

现在让我们看看geth的帮助吧

1
./build/bin/geth --help

然后看看版本号吧

1
./build/bin/geth version

geth版本

>>>> 搭建并启动私有网络

现在很多项目其实都是华而不实,直接复制以太坊代码启动一个私有网络就说自己独立开发的主链,并以此来募资,对于这种行为我是极端鄙视的

>>>>> 准备 genesis.json(创世区块等初始配置) 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"config": {
"chainId": 888,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0
},
"alloc": {
"0x0000000000000000000000000000000000000001": {
"balance": "1000000"
},
"0x0000000000000000000000000000000000000002": {
"balance": "2000000"
}
},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x20000",
"extraData": "",
"gasLimit": "0x2fefd8",
"nonce": "0x0000000000000378",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}

上面一般只需要改三个地方

  1. config.chainId 我改成了888(吉利数字)
  2. nonce 改成了888的16进制
  3. alloc 可以给任意地址预分配这么多ETH

我把它放在了当前目录

>>>>> 启动节点并开启挖矿(挖矿奖励设置给 0x0000000000000000000000000000000000000003)

初始化配置。这里我把数据目录设置成了 private 目录

1
./build/bin/geth init genesis.json --datadir ./private

查看 private 目录,可以看到生成了些数据

private目录

1
./build/bin/geth --datadir=./private/ --mine --miner.threads=1 --etherbase=0x0000000000000000000000000000000000000003 --port 33303 --rpc --rpcport 8545 --rpcapi eth,web3,net,rpc,admin --ethash.dagdir ./private/tagdir/

通过输出可以看到已经启动了一个节点,并且开启了挖矿

验证挖矿是否开启

1
2
3
curl --location --request POST 'http://localhost:8545' \
--header 'Content-Type: application/json' \
--data-raw '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}'

可以看出 {“jsonrpc”:”2.0”,”id”:1,”result”:”0x97”} 的输出,通过输出也可以看出

private目录

查看本节点的信息

1
2
3
curl --location --request POST 'http://localhost:8545' \
--header 'Content-Type: application/json' \
--data-raw '{ "jsonrpc":"2.0", "method":"admin_nodeInfo", "params":[], "id":1 }'

记下来 enode 信息

我这里是 enode://b65cd2486393fec8b106bfe1c39fee0f6fd0728f22c02639d23b7ed44c1bf31ee[email protected]192.168.1.3:33303

>>>>> 启动第二个节点

使用同一个 genesis.json 初始化配置

1
./build/bin/geth init genesis.json --datadir=./private1

使用上面记下来的 enode 信息启动第二个节点,不开启挖矿

1
./build/bin/geth --datadir=./private1 --bootnodes=enode://b65cd2486393fec8b106bfe1c39fee0f6fd0728f22c02639d23b7ed44c1bf31ee[email protected]127.0.0.1:33303 --port 33304 --rpc --rpcport=8546

可以验证是否正常同步了

1
2
3
curl --location --request POST 'localhost:8546' \
--header 'Content-Type: application/json' \
--data-raw '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}'
>>>>> 你还可以启动n个节点,跟启动第二节点一样操作

到这里整个私有网络就搭建完成了!!!

文章仅供参考,若有错误,还望不吝指正 !!!




微信关注我,及时接收最新技术文章