提供一种获取免费RPC节点的方法,方便交易的部署
Dapp服务节点即开启了RPC的以太坊节点,对于钱包来说,只需要能把用户签名的交易发送出来,自己搭建节点和使用别人的节点发送数据是一样的,目前不管是快速同步还是轻节点都需要好长时间才可以达到可用的要求,为此很有必要通过P2P网络查找可用的RPC节点。
此文主要介绍如何从分布式网络中获取节点,然后尝试RPC连接,连接上后做chainId和networkId判断,尝试获取多个和以太坊主网一致的节点做备用服务节点。
这两个模块最先接触到的是P2P,记的那时候对区块链只是了解皮毛,有个面试官问了我什么是KAD
,多节点连接的时候如何判断对方是否在线
。对于从未接触这方面内容的我,支支吾吾随便说了一些变走了。后来了解到他们是基于以太坊
二次开发的,而以太坊Devp2p中的节点发现使用了KAD,一种结构化的分布式网络,不过以太坊只利用KAD中节点距离做节点分类
,对获得数据并没有有效利用
。
以太坊通过节点发现获得了很多邻居节点
,每个邻居节点的数据都以Enode
展示的,Enode
中含有公钥
+IP和端口
,p2p连接中会使用节点公钥做数据加密。
p2p一般对系统安全性要求较高,涉及到节点的随机加密连接,网络中收到的信息都需要验证。目前网络中发布的有3类信息。
RPC中的api想必做Dapp开发的一定特别熟悉,最常用的发送交易eth_sendTransaction
,查询收据eth_getTransactionReceipt
,查询余额eth_getBalance
,这些一定如数家珍。刚开始接触RPC的是通过nodejs学习的,需要配置web3 Provider,以至于后来用Go发交易的时候写出来的代码跟以太坊Go客户端的完全不一样,Go里面表示余额的big.int我都用string表示,Go客户端里有ethclient,这个可以很方便的调用,根本不需要写蹩脚的代码。
以太坊默认开放了如下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。
区别是一个面对Dapp用户需要对外提供某种服务,一个是区块链中的验证程序,需要保证网络的安全性。联系是JSON RPC的实现基于TCP,而目前大多数P2P网络是基于TCP连接的。
站在用户的角度考虑,肯定要尽快的同步数据,并将交易发出去。
此方案默认节点使用8545
端口,如果使用是其他端口,目前没有较好方法获取,可使用nmap获取,尚未实现IP端口扫描。
p2p的节点管理中当连接数低于8个
,会一直节点发现,我们可以拿到源源不断的新节点
做RPC连接,直到找到满足要求的节点。
以太坊中networkID在节点握手
的时候会判断,主网,测试网使用不同的配置,从而达到网络隔离。
以太坊EIP155
引入,在The DAO事件后,以太坊分叉出ETC,为防止重放攻击
引入,主网测试网的配置也不一样。
RCP查询eth_syncing
,只有同步完成的节点方可使用。
离线签名可以将交易在Dapp端签名后发送到节点,由节点验证通过发送到区块链网络中,交易签名是用账户私钥
签名交易的TxHash
,如果交易被节点篡改
,则签名验证无法通过,节点伪造签名和交易信息无意义。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!