在以太坊P2P网络中寻找Dapp服务节点

寄意兰舟 发布在 区块链 海盗号 22040

Dapp服务节点即开启了RPC的以太坊节点,对于钱包来说,只需要能把用户签名的交易发送出来,自己搭建节点和使用别人的节点发送数据是一样的,目前不管是快速同步还是轻节点都需要好长时间才可以达到可用的要求,为此很有必要通过P2P网络查找可用的RPC节点。

此文主要介绍如何从分布式网络中获取节点,然后尝试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,如果交易被节点篡改,则签名验证无法通过,节点伪造签名和交易信息无意义。

本文链接:https://www.8btc.com/media/628581
转载请注明文章出处

文章标签: 以太坊
评论
登录 账号发表你的看法,还没有账号?立即免费 注册