我使用 go-ethereum 实现了一个以太坊 PoA 网络
我已经在网络上部署了一个 ERC20 代币,其想法是必须从互联网上的任何钱包(即 metamask、myetherwallet 等)访问网络
这个网络的想法是:
- 拥有 N 个能够密封区块的完整节点(节点有未锁定的账户)
- 部署作为 ERC20 代币的智能合约
- 拥有一个暴露网络的节点,以便从任何来源访问,例如 Metamask、MyEtherWallet、带有钱包的移动应用程序等。这个想法是,如果有合适的客户端,任何人都可以点击 ERC20 代币。
为了实现这一点,我创建了 2 个负责密封块的完整节点。
我像这样运行这些节点:
geth --datadir sealer1/ --syncmode 'full' --port 30351 --rpc --rpcaddr 'localhost' --rpcport 8502 --rpcapi='admin,personal,db,eth,net,web3,txpool,miner' --networkid 20 --gasprice '1' -unlock 'someaccount' --password s2/password.txt --mine
如您所见,这些节点有一些重要的事情:
- 解锁帐户
- 只能从 localhost 访问(注意 rpcaddres)
- 这些节点是矿工
如果我将这样的节点暴露给互联网(允许从任何来源进行 RPC 访问),任何黑客都可以将以太币发送到另一个帐户,因此,我创建了第三个节点,一个标准节点,它不暴露 rpc api,但允许端口上的连接8545(为了被metamask、myetherwallet等点击)
我使用以下命令运行节点:
geth --datadir standard1/ --syncmode 'full' --port 30352 --rpc --rpcport 8545--rpccorsdomain '*' --rpcaddr 'SERVER_PUBLIC_IP' --networkid 20 --gasprice '1'
如您所见,此节点:
- 不解锁账户
- 允许从任何来源访问 rpc
- 不公开 rpc api,如个人、管理员等
我的问题是:
- 这种方法安全吗?
- 有没有另一种方法可以让世界上的任何人使用 Metamask 来访问我的智能合约,而无需在标准节点上打开 RPC 访问?
为什么我有这些问题?
因为有很多地方不推荐开放 RPC 端口,所以如果出现以下情况我不安全:
- 没有使用解锁帐户暴露的节点
- 不要暴露关键的 rpc api,比如管理员和个人
足以安全地公开我的节点。
以下是与打开 RPC 访问相关的一些问题:
https://blog.blockdaemon.com/ethereum-geth-configuration-made-in-ireland-7ba2e876c6e3 https://www.reddit.com/r/ethereum/comments/4z0mvi/ethereum_nodes_with_insecure_rpc_settings_are/
https://www.reddit.com/r/ethereum/comments/3ird55/holy_shit_my_eth_accounts_been_hacked/
https://www.reddit.com/r/ethereum/comments/4jav5u/mist_wallet_has_2_sec_vulnerability_for_rpc/
https://blog.3or.de/internet-wide-ethereum-json-rpc-scans.html
https://www.bokconsulting.com.au/blog/7218-ethers-stolen-from-miner-with-rpc-port-open/
这里是以太坊推荐的团队负责人:
好的,您的设置似乎非常危险。--rpcaddr=external_address 本质上是向世界上任何人开放节点以访问它。此外,--rpcapi 'admin,personal,db,eth,net,web3,txpool,miner' 允许任何有权访问的人做任何事情。我可以想象互联网上的某个人正在暴力破解密码。
https://github.com/ethereum/go-ethereum/issues/17417#issuecomment-413877558