其实之前从没有了解过“区块链”、“比特币”,只觉得它是一个很高深、很神秘、一听就很复杂的东西。
然鹅,我没想到这学期有一门课程竟然是学习区块链。
不在我的规划之中,还得占用我的时间和精力去完成作业,有点小烦躁。
但是,既然学了,那就好好学吧,总会有收获。
第一节课的任务是在Ubuntu中搭建以太坊私有链。
接下来进入正题:
一、准备环境
1.安装Ubuntu16.04的虚拟机:
2.安装Ubuntu系统:
3.安装VM Tools:
4.更新源:
sudo gedit /etc/apt/sources.list
然后替换成清华的、阿里云的都可以,具体教程网上找。
更新源:
sudo apt-get update
5.后面需要用vim文本编辑器修改配置文件,所以还要安装vim:
sudo apt-get install vim-gtk
- 需要提醒一下,vim有好几个版本,我之前都安装失败,然后看到有一个教程是安装的这个版本,然后就成功了。
二、安装go语言环境
1.在虚拟机中下载go语言的安装包:
wget https://studygolang.com/dl/golang/go1.10.3.linux-amd64.tar.gz
2.在下载好的压缩包的目录下,将其解压到 /usr/local 文件夹下:
sudo tar -xzvf go1.10.3.linux-amd64.tar.gz -C /usr/local
3.在Home目录下新建一个文件夹go:
mkdir go
4.配置环境变量
打开环境变量配置文件:
sudo vim ~/.bashrc
将下列代码复制粘贴到文件最后,保存退出:
export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOBIN
使环境变量生效:
source ~/.bashrc
5.查看是否安装成功:
go version
至此,go语言环境已经安装完成!
三、安装以太坊Ethereum客户端Geth
Geth是GoEthereum开源项目的简称,它是使用Go语言编写且实现了Ethereum协议的客户端软件,也是目前用户最多,使用最广泛的客户端。
1.依次输入以下命令:
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
-
我在执行第二条命令sudo add-apt-repository -y ppa:ethereum/ethereum的时候遇到了报错!然后在经过了长达七个多小时的迂回绕转、艰苦奋战,最后想到了解决办法!
如果你的报错信息和我下图所示一样的话,可以尝试一下我的方法:
-
1.首先要确保自己的虚拟机能连上网,具体的配网教程网上找
-
2.如果连了网依然报错的话,可以尝试更新Ubuntu软件包仓库管理:
-
3.添加geth的PPA源,在https://launchpad.net/ubuntu/+ppas搜索geth的PPA源,将其添加到“其他软件”里,也要用sudo gedit /etc/apt/sources.list写进源文件里:
更新完成以后再来执行上面的命令,就可以正常执行第二条命令了。 -
然鹅,第四条命令sudo apt-get install ethereum在执行的时候也会出现下图的报错。我找到的解决办法就是:不停的重复执行这条命令。
因为虽然它每次都失败,但它的下载进度是累加的,我们可以一直重复下载,直到进度条拉满。我用了一个晚上都没下好,第二天早上起来才下好的:
2.查看是否安装成功:
geth version
至此,Geth安装完成!
四、搭建以太坊私有链
1.新建文件夹例如Mychain,用来保存私有链的数据:
mkdir Mychain
2.创建创世块文件genesis.json:
vim genesis.json
写入以下内容:
- 我本来按照老师的要求写入指定的创世块文件,但是出现报错信息:
Failed to write genesis block: unsupported fork
ordering: eip150Block not enabled, but eip155Block enabled at 0
上网查了一下,于是改成了以下内容:
{
"config": {
"chainId": 666,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"ethash": {}
},
"nonce": "0x0",
"timestamp": "0x5ddf8f3e",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x47b760",
"difficulty": "0x00002",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": { },
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
3.初始化创世区块,并指定数据存放路径:
geth --datadir Mychain init genesis.json
4.初始化成功后,会在数据目录 Mychain中生成 geth和 keystore 两个文件夹。其中 geth/chaindata 中存放的是区块数据,keystore 中存放的是账户数据:
5.启动私有链节点:
geth --identity "TestNode" --rpc --rpcport "8545" --datadir mydata --port "30303" --networkid 6666 --nodiscover console
- identity:指定节点 ID
- rpc:表示开启 HTTP-RPC 服务;
- rpcport:指定 HTTP-RPC 服务监听端口号(默认为 8545);
- datadir:指定区块链数据的存储位置;
- port:指定和其他节点连接所用的端口号(默认为 30303);
- networkid: 指定私有链网络号;
- nodiscover:关闭节点发现机制,防止加入有同样初始配置的陌生节点
出现了如下页面就表示启动了区块链节点并进入了该节点的控制台:
至此,Ubuntu16.04下的以太坊私有链环境已经搭建好了!
总结一下:
环境不停报错,我已经记不清我尝试过过少次方法、恢复了多少次快照了。
搭环境这种事,真的是别人能搭好、你用同样的方法就不一定能搭好,总会遇到一些奇奇怪怪的报错……所以虽然我的安装步骤是已经进行了种种排错的,但可能你们按照我的步骤来搭建依然会遇到问题。
收获就是,这应该是我真正意义上的第一次独立完成的环境搭建。在这个过程中,更大的收获不是搭建成功,而是遇到报错时的排错思维。因为并不是所有报错问题别人都遇到了、网上都有解决方法,而是需要自己分析,自己判断大致方向,然后去找相应的解决方法后灵活套用到自己的问题上。