测试网络 Rinkeby 由 Infura 迁移到自有节点

===

测试的时候使用 Infura 真的非常方便, 但是最近经常出现无法连接, rpc 调用失败, 合约无法部署等问题, 经排查使用国外的 aws 则可以顺畅进行上面提及的所有操作.

再次郁闷我们的网络情况. 于是乎, 在 rinkeby 的申请测试币的网站, 发现两个比较好玩的东西.

  1. 安装自有节点 https://www.rinkeby.io/#geth
  2. Puppeth 一键安装管理私有网络 https://www.rinkeby.io/#about

本文字主要记录一下安装自有 rinkeby 节点的过程.

下载依赖环境

首先要有 Geth, 在下载地址 https://geth.ethereum.org/downloads/ 找到自己需要的版本, 我是在服务器上安装, 所有选择 Linux 版本.

例如 Geth & Tools 1.8.11.

然后我是使用 supervisor 进行的节点保护, 所以需要安装 Python 2.7.x 版本, 以及安装 pip install supervisor.

下载创世区块文件 wget https://www.rinkeby.io/rinkeby.json

使用默认参数启动一下

可以选择的钱包同步方式有四种,

  1. Archive node 用于同步全部的链信息, 非常消耗内存磁盘 CPU 等.
  2. Full node 全节点, 只同步从启动开始之后的全部链信息, 不同步启动之前的, 这意味着可以节省一大笔资源, 但是在启动自有节点前就有相关业务, 那么这些业务将无法从自有节点查询得到.
  3. Light node 轻节点, 依据需求同步数据, 只同步头部信息, 不存储任何的交易, 这意味着如果你想查询交易而不只是进行钱包的支付校验的话, 那么将无法查到交易信息.
  4. Embedded node 个人理解这个钱包是用于便携设备的, 目前还在试验当中.

由于我们当前的需求是可以根据交易的哈希查询交易日志, 并且解析交易日志进行合法性校验的, 所以我们选择 Full Node 全节点.

初始化创世区块 geth --datadir=$HOME/.rinkeby init rinkeby.json

启动节点

1
2
3
4
5
6
7

geth \
--networkid=4 \
--datadir=$HOME/.rinkeby \
--cache=512 \
--ethstats='yournode:Respect my authoritah!@stats.rinkeby.io' \
--bootnodes=enode://a24ac7c5484ef4ed0c5eb2d36620ba4e4aa13b8c84684e1b4aab0cebea2ae45cb4d375b77eab56516d34bfbd3c1a833fc51296ff084b770b94fb9028c4d25ccf@52.169.42.101:30303

其中 networkid 为 4 表示是 rinkeby 测试网络.
datadir 用于存储区块的文件.
cache 表示内部缓存使用的初始化内存 MB 大小.
ethstats 是用于在 https://www.rinkeby.io/#stats 上查看节点情况的配置, 其中 yournode 表示的是在该界面的展示主机名.
bootnodes 是初始化的链接邻居节点, 用于寻找最近的可用节点.

在区块监控的页面 https://www.rinkeby.io/#stats 可用看到我们自己节点的情况.

自定义一些配置

由于我们想要使用域名链接, 并且更改一下默认的端口什么的, 所以参数也有相应的修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

./bin/geth \
--networkid=4 \
--datadir=./data \
--cache=256 \
--rpc \
--rpcaddr 0.0.0.0 \
--rpcapi admin,debug,eth,miner,net,personal,rpc,txpool,web3 \
--rpcport 1221 \
--rpccorsdomain 'http://ri nkeby.xxx.com:1223' \
--rpcvhosts 'rinkeby.xxx.com' \
--ws \
--wsaddr 0.0.0.0 \
--wsport 1222 \
--wsapi admin,debug,eth,miner,net,personal,rpc,txpool,web3 \
--wsorigins 'http://rinkeby.xxx.com' \
--ethstats='bestspx-testnet:Respect my authoritah!@stats.rinkeby.io' \
--bootnodes=enode://a24ac7c5484ef4ed0c5eb2d36620ba4e4aa13b8c84684e1b4aab0cebea2ae45cb4d375b77eab56516d34bfbd3c1a833fc51296ff084b770b94fb9028c4d25ccf@52.169.42.101:30303 \
> ./logs/geth.log 2>&1

开启 rpc 支持远端通过 1221 端口访问, 注意绑定域名的时候使用 rpcvhosts 对该域名进行访问授权, cros 为使用 ajax 等访问的时候支持的访问源.
开完 ws 支持通过 1222 端口访问, 将日志写入指定文件.

注意: 此配置进行数据同步需要一段时间, 该时间内访问相关数据查询语句均返回 null 查询不到数据.

使用 supervisor 进行管理

Supervisor 配置文件

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
29
30
31
32
33
[supervisord]
logfile=./logs/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=debug
pidfile=./pids/supervisord.pid
nodaemon=false
minfds=1024
minprocs=200

[unix_http_server]
file=./pids/supervisor.sock

[supervisorctl]
serverurl=unix://./pids/supervisor.sock

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[program:geth]
command=/bin/bash ./start.sh
autostart=true
startsecs=10
autorestart=true
startretries=3
user=USERNAME
priority=999
redirect_stderr=true
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=20
stdout_logfile=./logs/geth.out
stopasgroup=false
killasgroup=false

启动脚本

1
2
3
4
5
6
#!/bin/bash

supervisord -c supervisord.conf
ps -ef | grep supervisord | egrep -v 'grep|start'
sleep 3
ps -ef | grep geth | egrep -v 'grep'

目录结构

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
.
|-- bin 存储下载的 geth 软件包
| |-- abigen 这些都是内置工具
| |-- bootnode
| |-- COPYING
| |-- evm
| |-- geth
| |-- puppeth
| |-- rlpdump
| |-- swarm
| `-- wnode
|-- conf 配置文件目录
| `-- rinkeby.json 创世块配置文件
|-- data 数据目录
| |-- geth 区块数据目录
| | |-- chaindata
| | | |-- 101805.log
| | | |-- CURRENT
| | | |-- LOCK
| | | |-- LOG
| | | `-- MANIFEST-000004
| | |-- lightchaindata
| | | |-- 000001.log
| | | |-- CURRENT
| | | |-- LOCK
| | | |-- LOG
| | | `-- MANIFEST-000000
| | |-- LOCK
| | |-- nodekey
| | |-- nodes
| | | |-- 000043.log
| | | |-- CURRENT
| | | |-- LOCK
| | | |-- LOG
| | | `-- MANIFEST-000000
| | `-- transactions.rlp
| |-- geth.ipc 启动后生成的用于本地连接的文件描述符
| `-- keystore 存放钱包地址的文件夹
|-- init.sh 初始化创世块脚本
|-- logs 日志文件
| |-- geth.log
| |-- geth.out
| `-- supervisord.log
|-- pids Supervisor 启动后的文件
| |-- supervisord.pid
| `-- supervisor.sock
|-- start.sh 启动脚本
|-- start-supervisor.sh Supervisor 启动脚本
`-- supervisord.conf Supervisor 配置文件
  1. 初始化创世块: ./init.sh
  2. 手动启动: ./start.sh
  3. 启动 Supervisor 管理: ./start-supervisor.sh
Donate - Support to make this site better.
捐助 - 支持我让我做得更好.