Geth搭建以太坊私链并连接对方以太坊节点的geth客户端


前言

原本是老师push的一个关于”RPC漏洞检测“的小任务,涉及到以太坊节点的连接及对方geth节点信息的获取。这篇会对以太坊rpc端口简单介绍、记录geth节点连接过程以及过程中遇到的小bug。


提示:不排除由于系统不同的原因导致bug解决方法不同。

一、RPC漏洞利用

1. RPC漏洞介绍

RPC(remote procedure call)远程过程调用是一个计算机通信协议,该协议允许运行于一台计算机的程序调用另一台计算机的子程序。

2. 以太坊RPC漏洞利用

以太坊节点提供RPC API用于对接矿池、钱包等其他第三方程序。默认情况下,节点的RPC服务是无需密码就可以进行接口调用,因此,一旦将RPC端口暴露在互联网非常危险。
通过eth_accounts方法获取节点的以太坊地址,直接溯源
通过admin_peers方法获取节点的当前连接,可用于其他节点的推测溯源

二、Geth是什么

Geth是以太坊的客户端,有两种方法进行获取,一种是直接下载程序进行安装,另一种是通过编译源码安装。这里我选择的是通过下载程序安装,可以参考以太坊(Ethereum)之Geth,这里直接下载程序进行安装,不是重点不在阐述。

三、实验过程

1. 实验环境

节点位于日本东京,选择Ubuntu 22.04 64位操作系统,geth版本为1.13.8。

2. 发现开放rpc接口的以太坊节点

在ethernodes.org 或 etherscan.io发现可以一些公开的以太坊节点的信息,包括IP地址、端口号、客户端版本等。
公开的以太坊节点
接着,使用主动端口扫描的方式(扫描工具masscan)扫描由上面整理的IP地址范围或网络段,寻找开放了8545端口(以太坊默认的JSON-RPC端口)的节点。
masscan进行端口扫描

3. 验证以太坊节点真实性

验证IP是否开启JSON-RPC端口:向以太坊节点编写好的脚本,脚本构造了发送的JSON-RPC请求,根据响应状态码以及响应内容(包含jsonrpc字段),则认为开放了JSON-RPC端口,保留IP。

4.创建并配置geth客户端

Ⅰ 安装Geth客户端

打开命令行窗口,依次执行以下命令:

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo add-apt-repository -y ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install ethereum

一路选择”y“,下面是我的运行结果
运行结果
然后可以查看验证一下geth版本和命令参数……

geth --help

geth信息

Ⅱ 创建创世区块

创建工作目录

mkdir ~/privatechain

在工作目录下创建用于存放账户信息和区块数据的目录(即data)

mkdir ~/privatechain/data

创建创世区块的配置文件

cd privatechain
touch genesis.json
vim genesis.json

genesis.json的详细文件内容如下:

{
  "config": {
        "chainId": 202311061200,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0,
        "eip150Block": 0,
    	"byzantiumBlock": 0,
        "constantinopleBlock": 0,
        "petersburgBlock": 0,
        "istanbulBlock": 0
  },
  "alloc"      : {},
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x20000",
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}

其中,chainid指定了独立的区块链网络 ID。网络 ID 在连接到其他节点的时候会用到,以太坊公网的网络 ID 是 1,为了不与公有链网络冲突,运行私有链节点的时候要指定自己的网络 ID。不同 ID 网络的节点无法相互连接。其他的参数和描述很多博主都写得很全了,我也就不再多说。
定义完之后就可以创建创世区块啦

cd ~/privatechain
geth --datadir ./data init genesis.json

创建结果

看生成的目录,geth目录用于保存我们所建私有链的区块数据,keystore目录用于保存用户的账户数据。
目录
接着,就可以启动私有链。

Ⅲ 启动私有链

geth --datadir data --networkid 202311061200 --rpc.enabledeprecatedpersonal --http --http.addr 0.0.0.0 console 2>2.log

有的uu们可能会出现下面“Fatal: Failed to register the Ethereum service”的报错,这是因为datadir目录的路径不对,如果执行上述命令记得先返回root。
报错
返回root再执行
修改后启动成功
【注意】–networkid参数即为创世区块配置文件中的chainId。

Ⅳ 对geth客户端进行操作

随便举几个例子:
比如,创建账户,参数值为密码:

> personal.newAccount("001")
> personal.newAccount("002")

创建账户后会返回一个哈希值(代表新建账户的地址)
创建账户
查询私链上的账户信息(对应上面创建的俩个账户)
私链账户信息
查询私链上账户的账户余额,账户当作一个列表,查询第几个账户取下标即可。
第一个账户的余额
到这里,还有很多……

5. 连接对方节点geth客户端并查询信息安装Geth

为方便测试,我配置了两个节点的geth客户端,分别是geth01(202.182.121.223)和geth02(207.148.105.75)

geth attach http://xxx.xxx.xxx.xxx:8545
# xxx.xxx.xxx.xxx表示对方节点IP

直接使用命令连接很可能就直接报错了。
context deadline exceeded

原因:对方节点(geth02)防火墙未开启8545端口,进入geth02开启端口
开启8545端口
然后再使用geth01连接geth02,连接成功!
成功连接对方节点geth客户端
接着就可以获取geth02的信息啦!还有有很多属性可供查询……
获取对方节点信息
以上仅供参考!欢迎批评指正!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值