欢迎阅读《7天以太坊源码解读》系列。
>> 前言
今天是农历大年30,我本人2019年春节放假的第一天,我在杭州比特币中国上班。最近新型冠状病毒肆掠,导致很多在外工作的年轻人无法正常回家,我就是其中一个,我是湖北人,本是昨天回家的高铁(途径武汉),因为武汉市的情况,武汉市实行出入管控,所以我取消了行程,准备在杭州过完这个春节。7天假,今天是第一天假期,思考了一番,7天不能就这样潦草度过,需要做一些有意义的事情,所以有了这个《7天以太坊源码解读》系列教程,希望能帮助很多朋友了解以太坊的工作原理,以及它内部蕴含的区块链知识。顺口一提,我个人非常看好区块链技术在以后生活中的应用,希望结实相关技术人才,一起交流,一起在这个行业发挥光和热。
以太坊源码我本人之前对较老版本代码有些阅读,算是有些资本,如今代码变更较多,这次打算系统的跟大家一起研究学习一下。如有差错,请各位谅解并多多指出,我也是抱着学习的心态写出这个系列,希望能起到抛砖引玉的效果。
所以,让我们开始奇妙而又有意义的旅程吧!!!
>> 环境准备
>>> Golang安装
官方是是用Golang语言实现的以太坊协议,名作Geth(还有很多其他语言版本实现的以太坊协议,比如Rust版本的Parity),所以我们这里要安装Golang。
这里下载安装包安装Golang
安装完成后,验证你的安装:
go version
显示类似“go version go1.13.6 darwin/amd64”的字眼说明安装成功
>>> 下载以太坊源码
克隆官方源码。(家里网不行,我花了半个小时,无力吐槽。。。)
git clone https://github.com/ethereum/go-ethereum.git
切换到v1.9.10,当前最新版本,我们以这个来分析源码
git checkout v1.9.10
IDE推荐使用Goland,下载地址:http://jetbrains.com/go/
>>> 启动以太坊
>>>> 编译
编译出二进制文件
make all
如果包下载不下来的话,可以先将GOPROXY设置为https://goproxy.io后再编译
export GOPROXY=https://goproxy.io
编译完成之后,在 build/bin 目录会生成一些二进制文件,可以直接运行
现在让我们看看geth的帮助吧
./build/bin/geth --help
然后看看版本号吧
./build/bin/geth version
>>>> 搭建并启动私有网络
<span style="color: red">现在很多项目其实都是华而不实,直接复制以太坊代码启动一个私有网络就说自己独立开发的主链,并以此来募资,对于这种行为我是极端鄙视的</span>
>>>>> 准备 genesis.json(创世区块等初始配置) 文件
{
"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"
}
上面一般只需要改三个地方
- config.chainId 我改成了888(吉利数字)
- nonce 改成了888的16进制
- alloc 可以给任意地址预分配这么多ETH
我把它放在了当前目录
>>>>> 启动节点并开启挖矿(挖矿奖励设置给 0x0000000000000000000000000000000000000003)
初始化配置。这里我把数据目录设置成了 private 目录
./build/bin/geth init genesis.json --datadir ./private
查看 private 目录,可以看到生成了些数据
./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/
通过输出可以看到已经启动了一个节点,并且开启了挖矿
验证挖矿是否开启
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"} 的输出,通过输出也可以看出
[图片上传失败...(image-fb2df6-1579876501857)]
查看本节点的信息
curl --location --request POST 'http://localhost:8545' \
--header 'Content-Type: application/json' \
--data-raw '{ "jsonrpc":"2.0", "method":"admin_nodeInfo", "params":[], "id":1 }'
<span style="color: red">记下来 enode 信息</span>
>>>>> 启动第二个节点
使用同一个 genesis.json 初始化配置
./build/bin/geth init genesis.json --datadir=./private1
使用上面记下来的 enode 信息启动第二个节点,不开启挖矿
./build/bin/geth --datadir=./private1 --bootnodes=enode://b65cd2486393fec8b106bfe1c39fee0f6fd0728f22c02639d23b7ed44c1bf31eeb506cd2939bc302f178c0e0d51addc0e36fc348c442e11ebcf1f7f9627168ec@127.0.0.1:33303 --port 33304 --rpc --rpcport=8546
可以验证是否正常同步了
curl --location --request POST 'localhost:8546' \
--header 'Content-Type: application/json' \
--data-raw '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}'
>>>>> 你还可以启动n个节点,跟启动第二节点一样操作
到这里整个私有网络就搭建完成了!!!
有疑问加站长微信联系(非本文作者)