之前一直听说黑客RPC盗币,觉得挺有意思的,最近也体验了一下。这个Bug最新版的geth客户端已经没有,Http调用解锁账户早已被禁掉,以太坊Holder不需要担心。
### 矿池钱包
为了让大家有读下去的欲望,先抛出一个发现,通过扫描全网节点,发现了一个矿池**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 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)
此方法需要节点签名交易,正常情况下会返回账户锁定
错误。
本文参与区块链开发网写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。
- 发表于 2020-08-10 22:34
- 阅读 ( 2097 )
- 学分 ( 74 )
- 分类:以太坊