前言
Metropolis阶段的eth让人看着揪心,具体的区块高度和分叉高度可以查询https://fork.codetract.io/这个网站。不过通过现在的情况来看,估计eth归零只是时间问题了。本着学习的态度,让我们来最后一次回顾一下eth这个技术吧。
由于eth主网的接入和合约部署还是很消耗rmb的,因此,我们要做的第一件事情就是搭建一个属于自己的私链。本文便是围绕着如何搭建并使用eth私链展开的。
安装与部署
环境
为了打造一个自己的私有链体系,我特地准备了阿里云的高效服务器(每个月大概1300多的租金的那种配置)。如果是要链接到eth主网,那么还需要ssd高效云盘才行(月租金还会更高)。本文只介绍最快速的eth私有链搭建,因此,一切从简。当然,如果是仅仅只是想试试以太坊,也可以在个人电脑上弄,步骤是一样的(本文说的步骤都说基于linux的,win或者mac会有一些小的出入,可以参考https://github.com/ethereum/go-ethereum/wiki提供的各个平台的安装步骤)。
我准备的操作系统是ubuntu,参考的文章是https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Ubuntu。我没有选择基于编译的方式去安装,我是用的是PPA方案。(当然,以后如果要定制自己的独特服务或者功能,还是需要通过编译的方式进行安装的)
步骤
1.Installing from PPA
PPA = Personal Package Archives for Ubuntu
我们需要执行如下命令,执行命令的行数很长,我就不再此处贴截图了
sudo apt-get update
sudo apt-get upgrade
//以上两项会执行一段时间
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get install ethereum
经过了一小段时间之后,eth所需要的程序都安装完毕了。执行geth -help
可以验证是否安装成功。并且,版本也是目前最新的。
![](https://img.haomeiwen.com/i3112582/becd6517d07d8fcc.png)
上面的图片展示了eth的基础用法、命令、参数等信息。此部分内容会在后边详细叙述。eth安装完成后,接下来就要部署私有链了。
2.准备创世纪区块
此步骤参考了https://github.com/ethereum/go-ethereum网站的相关文字。首先创建一个名为genesis.json的文件(genesis.json这个文件,是eth的作者仿效btc而起的,当然文件的名字您可以任意起,只要程序能找到这个文件就行)
genesis.json的文件内容,我们根据官网提供的文字进行填写,内容如下:
{
"config": {
"chainId": 0,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x20000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
简单说明一下这个配置文件的内容都是什么意思:
内容 | 说明 |
---|---|
chainId | 不同版本的eth的id,比较经典有,1代表主网,2代表普通测试网络,3代表Ropsten测试网络,4代表Rinkeby测试网络,42代表Kovan测试网络(其他的值代表哪些网络,可以参考https://ethereum.stackexchange.com/questions/17051/how-to-select-a-network-id-or-is-there-a-list-of-network-ids/17101#17101),chainId的值要与在geth命令中的--networkid参数保持一致 |
homesteadBlock | Homestead 硬分叉区块高度,填写官网的默认值即可,后续硬分叉时才需要调整 |
eip155Block | EIP 155 硬分叉高度,填写官网的默认值即可,后续硬分叉时才需要调整 |
eip158Block | EIP 158 硬分叉高度,填写官网的默认值即可,后续硬分叉时才需要调整 |
alloc | 预设账号以及账号的以太币数量,私有链挖矿比较容易可以不配置 |
coinbase | 矿工账号 |
difficulty | 难度值,越大越难 |
extraData | 附加信息,以0x开头填写,可以不填,我也选择了不填 |
gasLimit | gas 的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填的很大 |
nonce | 64 位随机数,默认即可 |
mixhash | 与 nonce 配合用于挖矿,由上一个区块的一部分生成的 hash,默认即可。因为是第一个区块,因此,默认就是0了。 |
parentHash | 上一个区块的 hash 值,默认即可。因为是第一个区块,因此,默认就是0了。 |
3.初始化创世纪区块
上边的步骤将准备工作都做完了,接下来是进行创世纪区块的初始化了(geth init
)
geth --datadir /privatePeer/bootOf init genesis.json
//--datadir 指定数据存放的目录
![](https://img.haomeiwen.com/i3112582/c4b88f354d64b2fe.png)
4.启动私链节点
启动私链节点其实就是将控制台挂接过去。通过执行一条命令就可以做了,命令上的参数可以通过geth -h
来查看。另外,我们需要让geth成为一个后台运行的服务,因此,还要加上nohup命令。
nohup geth
--nodiscover
--maxpeers 300
--identity "yourEthName"
--rpc --rpccorsdomain "*" --rpcport 8545
--datadir "/home/yourpeer/"
--port "30303"
--allow-insecure-unlock
--rpcapi "db,eth,net,web3"
--networkid 123456
--cache 512
--verbosity 4
&
我们来简单说明一下使用到的参数
参数 | 说明 |
---|---|
nohup和& | 指定geth启动为后台服务 |
nodiscover | 关闭节点自动发现 |
maxpeers | 最大节点连接数 |
identity | 设置节点名称 |
rpc组 | --rpc --rpccorsdomain "" --rpcport 8545,这是一组参数,rpc端口默认就是8545,访问域如果写的话代表是任何域名都可以访问,也可以指定特殊的域名访问。 |
datadir | geth安装的目录,这个与初始化时候的路径一样即可 |
port | geth节点的端口,默认也是30303 |
rpcapi | 允许rpc接入的方式 |
networkid | 网络id,该值与创世纪区块中的chainId一致即可,否则就会连到别人的服务上去了 |
cache | 调整内存分配 最小16MB,默认128MB |
verbosity | 日志等级:0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default: 3) |
nohup geth --nodiscover --maxpeers 300 --identity "privatepeer" --rpc --rpccorsdomain "*" --datadir /home/privatepeer/bootof --port "30303" --allow-insecure-unlock --rpcapi "db,eth,net,web3" --networkid 0 --cache 512 --verbosity 4 &
执行完该命令后,就会生成对应的文件一个是.ipc文件,用于之后挂载控制台的,一个.out文件,这个是默认的日志文件输出
![](https://img.haomeiwen.com/i3112582/29e14319dbb40f21.png)
5.控制台挂载到geth上
因为是后台运行geth,因此,可以通过ipc方式进入控制台
geth attach ipc:/yourPeerDoc/geth.ipc
![](https://img.haomeiwen.com/i3112582/8754d30c7b1c89a9.png)
6.查看区块的内容
在没有开始挖矿之前,我们只能看到创世纪区块,执行命令eth.getBlock(0)
> eth.getBlock(0)
{
difficulty: 131072,
extraData: "0x",
gasLimit: 3141592,
gasUsed: 0,
hash: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
miner: "0x0000000000000000000000000000000000000000",
mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
nonce: "0x0000000000000042",
number: 0,
parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 507,
stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
timestamp: 0,
totalDifficulty: 131072,
transactions: [],
transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
uncles: []
}
虽然创世纪区块是我们自己创建的,但是,通过geth初始化后,还是有些不一样,我们来解释一下这些参数
参数 | 说明 |
---|---|
difficulty | 挖矿难度,这里转化为 10 进制,等于”0x2000”,后面区块难度会随着区块高度升高而提高 |
extraData | 当前区块附加信息,若创世区块该值为空,在第二个区块中会保存,创建该私有链时的 geth,go,及操作系统版本,保存信息为第一个挖到该区块的矿工信息,例如:0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421 |
gasLimit | 十进制的 gasLimit 值,会随之区块高度提高而提高 |
gasUsed | gas 花费,在以太坊中交易和部署智能合约会消耗 gas,暂时可以理解为以太币 |
hash | 当前区块hash值 |
logsBloom | 保存当前区块日志 |
miner | 挖到该区块的矿工地址,当前尚未分配矿工,因此,无挖矿矿工信息 |
mixHash | 与 nonce 配合用于挖矿,由上一个区块的一部分生成的 hash |
nonce | 工作量证明的随机数,因为是第一块,这个是由我们人工创建的 |
number | 当前区块高度 |
parentHash | 上一个区块 hash 值 |
receiptsRoot | 块的收益树根结果 |
sha3Uncles | 对叔区块进行 hash 运算的结果 |
size | 区块大小,以字节为单位 |
stateRoot | 块的状态树根结果 |
timestamp | 时间戳 |
totalDifficulty | 达到该区块的难度总数 |
transactions | 以数组的形式保存交易的 tx 值 |
transactionsRoot | 交易的默克尔树根 |
uncles | 以数组表示数区块的哈希 |
总结
至此,我们就完成了一个相对标准的eth私链的搭建,此处还差了如何加入新节点等文字的说明,此部分内容我会后续更新。关于eth私链的使用,我会再另外一篇文章《使用自己的eth私有链》中进行详细讲解
附录:win下的节点创建
![](https://img.haomeiwen.com/i3112582/6becf41d34ac642b.png)
![](https://img.haomeiwen.com/i3112582/c9a278770a04c22c.png)
![](https://img.haomeiwen.com/i3112582/a32849b8fdb9ae47.png)
nohup geth --nodiscover --maxpeers 300 --identity "privatepeer" --rpc --rpccorsdomain "*" --rpcport 8545 --datadir /home/ubuntu/pp_data --allow-insecure-unlock --port "30303" --rpcapi "db,eth,net,web3" --networkid 8945121267 --cache 512 --verbosity 4 &
关于节点安全
关于端口
一般不应该把默认的8545作为rpc端口,我一般使用8991,ws使用8992
nohup geth --nodiscover --maxpeers 1024 --identity "han" --rpc --rpccorsdomain "" --datadir /home/ubuntu/gethnode --port 30303 --rpcaddr 0.0.0.0 --rpcport 8991 --ws --wsaddr 0.0.0.0 --wsport 8992 --wsorigins "" --allow-insecure-unlock --rpcapi "db,eth,net,web3" --networkid 1 --cache 4096 --verbosity 4 &
geth节点间连接并建立点对点网络的端口30303需要开放。
如果开发rpcport、wasport,不建议在此节点上进行账户管理
一般来说,生产环境应用节点,主要是查询数据、广播交易。账户管理,最好在去中心化钱包中去做。将签名后的交易通过sendRawTransaction 发送到我们搭建的节点上。
当这两个参数的值设为 0.0.0.0 时,将允许来自任何机器的 http 和 web socket 连接。
这个时候如果在自己搭的 geth 节点上创建或导入钱包,并执行 personal.unlockAccount 命令,别人就可以通过开放的 http或 web socket 连接执行 sendTransaction 调用将钱包中的以太币资产转出。
节点加固
SSH Tunnel,通过下面的命令将远程调用限制于本地连接,这里将 rpcaddr 和 wsaddr 参数的值都设为了 127.0.0.1
geth --datadir --cache 4096 data --rpc --rpcport 6666 --rpcaddr 127.0.0.1 --ws --wsaddr 127.0.0.1 --wsport 6667 --wsorigins "*"
其它机器要调用这个节点怎么办呢?可以通过 SSH Tunnel 建立该机器与节点机器间的可信连接。
Basic Auth
可以在节点服务器上搭建 nginx 服务器,配置相应的 basic auth,通过用户名密码来限制对 geth 节点 rpc 服务的调用。
full、fast、ligth
full:从开始到结束,获取区块的header,获取区块的body,从创始块开始校验每一个元素,需要下载所有区块数据信息。速度最慢,但是能获取到所有的历史数据。geth –syncmode full(默认是full)
fast:获取区块的header,获取区块的body,在同步到当前块之前不处理任何事务。下载的数据量较少。然后获得一个快照,此后,像full节点一样进行后面的同步操作。这种方法用得最多,目的在不要在意历史数据,将历史数据按照快照的方式,不逐一验证,沿着区块下载最近数据库中的交易,有可能丢失历史数据。此方法可能会对历史数据有部分丢失,但是不影响今后的使用。geth –syncmode fast
注意:默认情况下full模式,在以太坊源码中,如果本地当前块是number 0 (创始区块),不管指定的哪种模式都默认是 --fast模式,当geth第二次启动的时候,默认情况下full模式同步。
因此很多小伙伴在没有指定同步模式的时候,在同步区块的前期非常快,当再次重启机器或者断掉geth再启动发现更新区块速度非常慢,就是这个原因
handler.go 代码中 新建以太坊子协议管理器func NewProtocolManager()
// Figure out whether to allow fast sync or not
if mode == downloader.FastSync && blockchain.CurrentBlock().NumberU64() > 0 {
log.Warn("Blockchain not empty, fast sync disabled")
mode = downloader.FullSync
}
if mode == downloader.FastSync {
manager.fastSync = uint32(1)
}
主网节点
nohup geth --syncmode fast --maxpeers 1024 --rpc --rpccorsdomain "" --datadir /home/ubuntu/datageth --rpcaddr 0.0.0.0 --rpcport 8991 --ws --wsaddr 0.0.0.0 --wsport 8992 --wsorigins "" --allow-insecure-unlock --rpcapi "db,eth,net,web3" --networkid 1 --cache 4096 --verbosity 4 &
–identity:指定节点 ID;
–rpc:表示开启 HTTP-RPC 服务;
–rpcaddr:HTTP-RPC 服务ip地址;
–rpcport:指定 HTTP-RPC 服务监听端口号(默认为 8545);
–datadir:指定区块链数据的存储位置;
–port:指定和其他节点连接所用的端口号(默认为 30303,默认的话,可以不写)
–nodiscover:关闭节点发现机制,防止加入有同样初始配置的陌生节点。这个如果是配置主网的话,请不要打开。
重启干净后需要用geth removedb掉数据
新购买磁盘挂载
1.fdisk -l,查看是否存在未格式化的磁盘,其中vda表示的系统盘,vdb表示的其他磁盘
2.格式化其他磁盘,mkfs.ext3 /dev/vdb
3.创建磁盘挂载点,也就是创建一个新的目录,mkdir /data
4.磁盘挂载,mount /dev/vdb /data/
5.修改fstab,向其中添加分区信息,以便系统启动时自动挂载磁盘,echo '/dev/vdb /data ext3 defaults 0 0' >> /etc/fstab
6.reboot
7.df -h 查看磁盘是否已经挂载
网友评论