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

pefish · · 4611 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

>> 前言

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

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

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

>> 环境准备

>>> Golang安装

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

https://golang.org/

这里下载安装包安装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
geth版本

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

<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"
}

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

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

我把它放在了当前目录

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

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

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

查看 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>

我这里是 enode://b65cd2486393fec8b106bfe1c39fee0f6fd0728f22c02639d23b7ed44c1bf31eeb506cd2939bc302f178c0e0d51addc0e36fc348c442e11ebcf1f7f9627168ec@192.168.1.3:33303

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

使用同一个 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个节点,跟启动第二节点一样操作

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


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4611 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传