此文主要介绍如何从分布式网络中获取节点,然后尝试 RPC 连接,连接上后做 chainId 和 networkId 判断,尝试获取多个和以太坊主网一致的节点做备用服务节点。
P2P
这两个模块最先接触到的是 P2P, 记得那时候对区块链只是了解皮毛,有个面试官问了我什么是 KAD
,多节点连接的时候如何判断对方 是否在线
。对于从未接触这方面内容的我,支支吾吾随便说了一些。后来了解到他们是基于 以太坊
二次开发的,而以太坊 Devp2p 中的节点发现使用了 KAD,一种结构化的分布式网络,不过以太坊只利用 KAD 中节点距离做 节点分类
,对获得的数据并没有 有效利用
。
ENODE
以太坊通过节点发现获得了很多 邻居节点
,每个邻居节点的数据都以 Enode
展示的,Enode
中含有 公钥
+IP 和端口
,p2p 连接中会使用节点公钥做数据加密。
用法
p2p 一般对系统安全性要求较高,涉及到节点的随机加密连接,网络中收到的信息都需要验证。目前网络中发布的有 3 类信息。
-
节点发现
- pingpong,finnode,neighbor
-
加密连接
- rlpx,协议验证
-
上层消息
- 握手,发交易,发区块,区块 hash,获取区块
RPC
RPC 中的 api 想必做 Dapp 开发的一定特别熟悉,最常用的发送交易 eth_sendTransaction
,查询收据 eth_getTransactionReceipt
,查询余额 eth_getBalance
,这些一定如数家珍。刚开始接触 RPC 是通过 nodejs 学习的,需要配置 web3 Provider, 以至于后来用 Go 发交易的时候写出来的代码跟以太坊 Go 客户端的完全不一样,Go 里面表示余额的 big.int 都用 string 表示,Go 客户端里有 ethclient,这个可以很方便的调用,根本不需要写蹩脚的代码。
开放 API
以太坊默认开放了如下 api,eth:1.0 net:1.0 rpc:1.0 web3:1.0
只要对方开启 rpc,并设置 rpcaddr
为 0.0.0.0
,外部节点即可连接查询。Go 客户端在 web3.js
和 web3ext.go
中定义了 js 代码如何调用 rpc。
RPC 和 P2P
区别是一个面对 Dapp 用户需要对外提供某种服务,一个是区块链中的验证程序,需要保证网络的安全性。联系是 JSON RPC 的实现基于 TCP,而目前大多数 P2P 网络是基于 TCP 连接的。
站在用户的角度考虑,肯定要尽快的同步数据,并将交易发出去。
-
快速同步,需要服务器,存储 20G,同步时间较长。
-
轻节点同步 需要半小时以上,提供轻节点服务的节点较少
-
此方案 几分钟内可查找到多个可用节点
此方案默认节点使用 8545
端口 , 如果使用是其他端口,目前没有较好方法获取,可使用 nmap 获取,尚未实现 IP 端口扫描。
p2p 的节点管理中当连 接数低于 8 个
,会一直节点发现,我们可以拿到 源源不断的新节点
做 RPC 连接,直到找到满足要求的节点。
NetworkID
以太坊中 networkID 在 节点握手
的时候会判断,主网,测试网使用不同的配置,从而达到网络隔离。
ChainID
以太坊 EIP155
引入,在 The DAO 事件后,以太坊分叉出 ETC,为防止 重放攻击
引入,主网测试网的配置不一样。
syncing
RCP 查询 eth_syncing
,只有同步完成的节点方可使用。
离线签名
离线签名可以将交易在 Dapp 端签名后发送到节点,由节点验证通过发送到区块链网络中,交易签名是用 账户私钥
签名交易的 TxHash
,如果 交易被节点篡改
,则签名验证无法通过,节点伪造签名和交易信息无意义。
来源链接:mp.weixin.qq.com
来源:科帆区块链