以太坊网络爬虫,深度剖析以太坊网络

之前一直听说黑客RPC盗币,觉得挺有意思的,最近也体验了一下。这个Bug最新版的geth客户端已经没有,Http调用解锁账户早已被禁掉,以太坊Holder不需要担心。

写这篇文章是想让区块链充满趣味性,不再是核心开发者中晦涩的代码。目前以太坊网络中夹杂着很多其他链的节点信息,由于很多公链基于以太坊二次开发,没有修改p2p参数,导致节点信息污染了真实的以太坊节点。通过`devp2p节点发现`拿到的节点数据,通过查询`network ID`,有很大一部分不属于以太坊网络,有趣的是在这些链里面,查询你自己的账户,余额竟然不为零,可惜有的项目不开源,都不知道是哪些公链项目。 ### 矿池钱包 为了让大家有读下去的欲望,先抛出一个发现,通过扫描全网节点,发现了一个矿池**Hiveon Pool**,里面有6个账户,以太坊总持仓在`1W`个左右。这是其中一个地址**0x4c549990a7ef3fea8784406c1eecc98bf4211fa5**。 ### 可用RPC节点 以下是扫描到的一些可用RPC节点,Dapp终于可以愉快的部署了。 * 解决Dapp开发没有部署节点 * 快速同步老是追不上最新块 * 同步占用硬盘和同步慢 使用下面节点发送`离线交易`可快速实现合约和转账操作,GAS费不要太低就行,离线交易的安全性在于节点无法作恶,只可选择是否继续广播。 “` http://95.217.58.225:8545 apis map[admin:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0] http://144.91.122.52:8545 apis map[eth:1.0 net:1.0 personal:1.0 rpc:1.0 web3:1.0] http://95.217.163.203:8545 apis map[eth:1.0 net:1.0 rpc:1.0 web3:1.0] http://167.99.192.187:8545 apis map[admin:1.0 debug:1.0 eth:1.0 ethash:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0] http://142.93.227.185:8545 apis map[eth:1.0 net:1.0 rpc:1.0 web3:1.0] http://161.97.81.18:8545 apis map[debug:1.0 eth:1.0 net:1.0 parity:1.0 parity_accounts:1.0 parity_pubsub:1.0 parity_set:1.0 parity_transactions_pool:1.0 personal:1.0 private:1.0 pubsub:1.0 rpc:1.0 secretstore:1.0 signer:1.0 traces:1.0 web3:1.0] http://46.4.63.234:8545 apis map[admin:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0] http://157.230.142.236:8545 apis map[eth:1.0 net:1.0 rpc:1.0] http://46.4.86.252:8545 apis map[admin:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0] http://95.217.87.230:8545 apis map[eth:1.0 personal:1.0 rpc:1.0 web3:1.0] http://195.154.81.121:8545 apis map[debug:1.0 eth:1.0 net:1.0 parity:1.0 parity_accounts:1.0 parity_pubsub:1.0 parity_set:1.0 personal:1.0 private:1.0 pubsub:1.0 rpc:1.0 secretstore:1.0 shh:1.0 shh_pubsub:1.0 signer:1.0 traces:1.0 web3:1.0] http://49.12.93.10:8545 apis map[admin:1.0 debug:1.0 eth:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0] http://165.227.99.131:8545 apis map[eth:1.0 net:1.0 rpc:1.0] “` 这些大部分是`geth节点`,少量是`parity节点`,由于较熟悉geth代码,所以下面的操作都是基于Geth客户端。 **原理可读上一篇文章。** ### 查询节点信息 在上篇文章中已讲过大致的原理,通过节点发现不停的遍历全网节点,使用默认的8545端口去连接,获取连接成功的节点。 以太坊默认开发的api是`[eth:1.0 net:1.0 rpc:1.0 web3:1.0]`这几个,可通过`SupportedModules`方法获取 #### 过滤主网节点 节点发现了太多的无用节点,需要通过`network ID`和`chainID`过滤拿到主网节点。 “` client.Call(&ver, “net_version”) client.CallContext(ctx, &result, “eth_chainId”) “` #### 查询矿工信息 “` err := client.Call(&mine, “eth_mining”) err = client.Call(&coinbase, “eth_coinbase”) err = client.Call(&hashrate, “eth_hashrate”) “` 上面的方法可依次查询节点是否在挖矿,查询挖矿奖励地址和当前挖矿的hash率。 #### 查询节点账户 “` err := client.Call(&account, “eth_accounts”) “` 这个返回的是当前节点的账户数,通过keystore导入到节点中的账户,地址都会返回出来。 #### 查询账户余额 “` client.Call(&result, “eth_getBalance”, account, toBlockNumArg(blockNumber)) “` 此api可将节点的挖矿地址和账户余额都查询出来。 #### 查询账户信息 “` client.Call(&raws, “personal_listWallets”) for _, account := range raws { if account.Status == “Unlocked” { arr = append(arr, rawAccount{“Unlocked”, account.Accounts[0].Address.String()}) } else { arr = append(arr, rawAccount{“Locked”, account.Accounts[0].Address.String()}) } } “` 此方法可查询节点账户状态,是否锁定,需要节点启动时显示指定。 #### 转账 “` ec.c.CallContext(ctx, nil, “eth_sendRawTransaction”, hexutil.Encode(data)) “` 此方法为发起离线交易 “` err := client.Call(&result, “eth_sendTransaction”, mapData) “` 此方法需要节点签名交易,正常情况下会返回`账户锁定`错误。

写这篇文章是想让区块链充满趣味性,不再是核心开发者中晦涩的代码。目前以太坊网络中夹杂着很多其他链的节点信息,由于很多公链基于以太坊二次开发,没有修改p2p参数,导致节点信息污染了真实的以太坊节点。通过devp2p节点发现拿到的节点数据,通过查询network ID,有很大一部分不属于以太坊网络,有趣的是在这些链里面,查询你自己的账户,余额竟然不为零,可惜有的项目不开源,都不知道是哪些公链项目。

矿池钱包

为了让大家有读下去的欲望,先抛出一个发现,通过扫描全网节点,发现了一个矿池Hiveon Pool,里面有6个账户,以太坊总持仓在1W个左右。这是其中一个地址0x4c549990a7ef3fea8784406c1eecc98bf4211fa5

可用RPC节点

以下是扫描到的一些可用RPC节点,Dapp终于可以愉快的部署了。

  • 解决Dapp开发没有部署节点
  • 快速同步老是追不上最新块
  • 同步占用硬盘和同步慢

使用下面节点发送离线交易可快速实现合约和转账操作,GAS费不要太低就行,离线交易的安全性在于节点无法作恶,只可选择是否继续广播。

http://95.217.58.225:8545 apis map[admin:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0]
http://144.91.122.52:8545 apis map[eth:1.0 net:1.0 personal:1.0 rpc:1.0 web3:1.0]
http://95.217.163.203:8545 apis map[eth:1.0 net:1.0 rpc:1.0 web3:1.0]
http://167.99.192.187:8545 apis map[admin:1.0 debug:1.0 eth:1.0 ethash:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0]
http://142.93.227.185:8545 apis map[eth:1.0 net:1.0 rpc:1.0 web3:1.0]
http://161.97.81.18:8545 apis map[debug:1.0 eth:1.0 net:1.0 parity:1.0 parity_accounts:1.0 parity_pubsub:1.0 parity_set:1.0 parity_transactions_pool:1.0 personal:1.0 private:1.0 pubsub:1.0 rpc:1.0 secretstore:1.0 signer:1.0 traces:1.0 web3:1.0]
http://46.4.63.234:8545 apis map[admin:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0]
http://157.230.142.236:8545 apis map[eth:1.0 net:1.0 rpc:1.0]
http://46.4.86.252:8545 apis map[admin:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0]
http://95.217.87.230:8545 apis map[eth:1.0 personal:1.0 rpc:1.0 web3:1.0]
http://195.154.81.121:8545 apis map[debug:1.0 eth:1.0 net:1.0 parity:1.0 parity_accounts:1.0 parity_pubsub:1.0 parity_set:1.0 personal:1.0 private:1.0 pubsub:1.0 rpc:1.0 secretstore:1.0 shh:1.0 shh_pubsub:1.0 signer:1.0 traces:1.0 web3:1.0]
http://49.12.93.10:8545 apis map[admin:1.0 debug:1.0 eth:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0]
http://165.227.99.131:8545 apis map[eth:1.0 net:1.0 rpc:1.0]

这些大部分是geth节点,少量是parity节点,由于较熟悉geth代码,所以下面的操作都是基于Geth客户端。 原理可读上一篇文章。

查询节点信息

在上篇文章中已讲过大致的原理,通过节点发现不停的遍历全网节点,使用默认的8545端口去连接,获取连接成功的节点。 以太坊默认开发的api是[eth:1.0 net:1.0 rpc:1.0 web3:1.0]这几个,可通过SupportedModules方法获取

过滤主网节点

节点发现了太多的无用节点,需要通过network IDchainID过滤拿到主网节点。

client.Call(&ver, "net_version")
client.CallContext(ctx, &result, "eth_chainId")

查询矿工信息

        err := client.Call(&mine, "eth_mining")
        err = client.Call(&coinbase, "eth_coinbase")
        err = client.Call(&hashrate, "eth_hashrate")

上面的方法可依次查询节点是否在挖矿,查询挖矿奖励地址和当前挖矿的hash率。

查询节点账户

    err := client.Call(&account, "eth_accounts")

这个返回的是当前节点的账户数,通过keystore导入到节点中的账户,地址都会返回出来。

查询账户余额

client.Call(&result, "eth_getBalance", account, toBlockNumArg(blockNumber))

此api可将节点的挖矿地址和账户余额都查询出来。

查询账户信息

        client.Call(&raws, "personal_listWallets")
        for _, account := range raws {
            if account.Status == "Unlocked" {
                arr = append(arr, rawAccount{"Unlocked", account.Accounts[0].Address.String()})
            } else {
                arr = append(arr, rawAccount{"Locked", account.Accounts[0].Address.String()})
            }
        }

此方法可查询节点账户状态,是否锁定,需要节点启动时显示指定。

转账

 ec.c.CallContext(ctx, nil, "eth_sendRawTransaction", hexutil.Encode(data))

此方法为发起离线交易

    err := client.Call(&result, "eth_sendTransaction", mapData)

此方法需要节点签名交易,正常情况下会返回账户锁定错误。

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

  • 发表于 2020-08-10 22:34
  • 阅读 ( 331 )
  • 学分 ( 68 )
  • 分类:Geth

该内容来自于互联网公开内容,非区块链原创内容,如若转载,请注明出处:https://htzkw.com/archives/27818

联系我们

aliyinhang@gmail.com