2

我使用 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

如您所见,这些节点有一些重要的事情:

  1. 解锁帐户
  2. 只能从 localhost 访问(注意 rpcaddres)
  3. 这些节点是矿工

如果我将这样的节点暴露给互联网(允许从任何来源进行 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'  

如您所见,此节点:

  1. 不解锁账户
  2. 允许从任何来源访问 rpc
  3. 不公开 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/

https://blog.ethereum.org/2015/08/29/security-alert-insecurely-configured-geth-can-make-funds-remotely-accessible/

这里是以太坊推荐的团队负责人:

好的,您的设置似乎非常危险。--rpcaddr=external_address 本质上是向世界上任何人开放节点以访问它。此外,--rpcapi 'admin,personal,db,eth,net,web3,txpool,miner' 允许任何有权访问的人做任何事情。我可以想象互联网上的某个人正在暴力破解密码。

https://github.com/ethereum/go-ethereum/issues/17417#issuecomment-413877558

4

1 回答 1

1

这种方法安全吗?

你明白了,是的,但还有改进的余地。

  1. 首先,我永远不会运行一个同时启用personalAPI 的节点,使用-unlock它可以永久地使任何有权访问您的节点的人都可以访问该帐户。所以想象一下,有人通过其他一些门获得了对您节点的访问权,他们将能够立即从该帐户中花费您的资金,从而从 localhost 产生交易。请考虑仅在该节点上公开安全API 或完全删除解锁语句。
  2. 如果您坚持按上述方式配置密封节点,请添加一些强化。有多种选择,您可以使用强大的防火墙规则集基本上阻止来自外部网络的所有内容,但端口 30351 上的节点通信除外。或者,我会做的是隐藏将该节点与公共 Internet 完全断开连接,并且仅通过线路连接从该节点到其他代理节点的 p2p 流量连接到您的节点和 Internet 上的其他节点。但是,这可能会带来网络稳定性的缺点。

有没有另一种方法可以让世界上的任何人使用 Metamask 来访问我的智能合约,而无需在标准节点上打开 RPC 访问?

您是否考虑过研究诸如poa.net 之类的公共 PoA 网络?这基本上允许您的用户将 metamask 或 mycrypto 连接到现有的 POA 基础设施。

于 2018-08-21T15:39:37.590 回答