哨兵节点是保护验证者免受 DOS 攻击的一种方法,它不会将验证者直接暴露在互联网上。 哨兵节点是连接到其他验证器和点对点网络并隔离验证器的完整节点。 验证器节点(具有签名密钥的节点)与 gossip 网络的其余部分保持隔离,并且仅连接到哨兵节点。
这个任务是创建一个哨兵节点配置和脚本,它可以启动两个独立的节点并让它们相互连接,这样一个节点是面向公众的 p2p 网络(哨兵),另一个只连接到哨兵(验证器) )。 验证者应该仍然能够参与 Alexander 测试网上的 Polkadot 共识。 当一切正常时,写一个关于如何部署它的简短指南。 您可以将指南基于当前的 Polkadot 验证器指南。 但是,不要重复已经写在那里的内容,而是将您的指南写成这个已经存在的指南的“扩展”。
问题状态:1.开放2. 开始 3. 已提交 4. 完成
__此问题现在附有 150.0 DAI(150.0 美元 @ 1.0 美元/DAI)的资金。__
问题状态:1.开放2. 开始 3. 已提交 4. 完成
__工人已申请开始工作__。
这些用户都声称他们可以在 12 个月后完成这项工作。
请在下面查看他们的行动计划:
1) gutsal-arsen已申请开始工作_(仅限资助者:批准工人|拒绝工人)_。
创建 2 节点配置(哨兵和验证器),创建部署指南。
在 Gitcoin 问题详情页面了解更多信息。
@Web3Foundation应用于 Gitcoin。 你能同意吗?
嘿,@agutsal gitcoin 一旦服务恢复将审查,目前就关闭了!
问题状态:1. 开放 2. 开始 3. 已提交 4.完成
__工作已经开始__。
这些用户都声称他们可以在 9 个月内完成工作,1 周后。
请在下面查看他们的行动计划:
1) gutsal-arsen已获准开工。
创建 2 节点配置(哨兵和验证器),创建部署指南。
在 Gitcoin 问题详情页面了解更多信息。
@agutsal您已获准开始工作。
@gitcoinbot活着,很快就会更新
@agutsal非常期待! :)
@gitcoinbot稍等
@gitcoinbot工作
@Web3Foundation尝试使用 polkadot Dockerfile进行构建。
docker build --tag polkadot -f Dockerfile .
命令失败并显示:
尝试了两次 - 结果相同。
@agutsal您是从主分支还是 v0.4 分支构建? 从v0.4
构建可能会更好,因为它更稳定并且将连接到 Alexander 测试网。
请联系 Riot 上的@logan:web3.foundation以获得更直接的沟通。
更糟糕的是v0.4
:
@lsaether @Web3Foundation
@lsaether什么是暴动? lz给个链接
看起来您在运行cargo build
之前没有编译 Wasm 二进制文件,请先尝试在scripts/build.sh
中运行脚本
@lsaether我只是在运行docker/build.sh
。 我认为它有效,但据我所见,它没有;)
@lsaether @Web3Foundation似乎我已经修复了 Dockerfile PR #308
请合并。
@gitcoinbot正在进行中
@gitcoinbot在 PR #308 上发言
@gitcoinbot请闭嘴
@gitcoinbot
@gitcoinbot刚刚结束了关于最近 WIP 公关的讨论继续工作
大声笑对不起我已经静音@gitcoinbot 100 天@agutsal
@Web3Foundation谢谢
@Web3Foundation似乎静音不起作用;(
@gitcoinbot是的,我仍在处理 docker-compose 网络配置以在一个节点之后运行一个节点。 @Web3Foundation请确认这是您的期望。
@Web3Foundation我仍在等待您对我在上面之前评论中的解释的回复。 docker-compose 自定义虚拟网络配置是您希望 2 个节点一个接一个运行的吗?
嘿@agutsal抱歉回复太长了; @lsaether或@fgimenez可能会在这里回答关于
“ docker-compose 自定义虚拟网络配置是您期望让 2 个节点一个接一个运行吗?”
@lsaether @fgimenez可能都在度假, @Web3Foundation ? ;)
现在将再次 ping, @agutsal事情刚刚超级忙,再次为等待道歉。
正确,两个节点,一个在另一个“后面”运行。 哨兵节点面向公共网络(并连接到 p2p 网络的其余部分)。 验证器节点位于防火墙后面,只能与哨兵节点通信。
* 公共网络 * <---> Sentry 节点 <-- 防火墙 --> Validator 节点
https://guide.kusama.network/en/latest/try/secure-validator-setup/
如果您有其他问题,请随时联系我。
@laboon再次 - 我们都在谈论撰写专用网络配置。
抱歉,我刚刚指出这一点并误解了你的问题。 我相信费德里科是他提出这个要求的,他本周正在休假。
_"是 docker-compose 自定义虚拟网络配置,您希望 2 个节点一个接一个地运行吗?""_
使用 Docker Compose 创建一个隔离的专用网络当然是一种方法,并且应该是可以接受的。 但是,我不知道这是否是最初的期望(我在这里看不到任何相反的东西-不确定您是否在其他地方进行了私人通信)。
如果我没有回答您的问题,请随时告诉我。
@agutsal在我看来,docker-compose 创建的覆盖网络不足以将验证器节点与 polkadot 网络的其余部分隔离开来; 一旦验证器连接到它的引导节点,网络就会知道它,如果你不采取任何额外的措施,其他对等节点将能够连接到它。 您可以通过使用 docker compose 文件启动网络来验证所有这些,如下所示:
version: '3'
services:
node:
image: parity/polkadot:v0.4.4
container_name: polkadot-node
command: >
--chain=alexander --validator
networks:
testing_net:
ipv4_address: 172.28.1.1
networks:
testing_net:
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
这个单一节点有一个内部 IP 地址,没有声明任何要从外部访问的 p2p 端口,并且在本地覆盖网络中没有任何其他对等点。 当我启动节点时:
$ docker-compose -f dcp.yml up --force-recreate
Recreating polkadot-node ... done
Attaching to polkadot-node
polkadot-node | 2019-08-12 08:52:16 Parity Polkadot
polkadot-node | 2019-08-12 08:52:16 version 0.4.4-aa49754-x86_64-linux-gnu
polkadot-node | 2019-08-12 08:52:16 by Parity Team <[email protected]>, 2017-2019
polkadot-node | 2019-08-12 08:52:16 Chain specification: Alexander
polkadot-node | 2019-08-12 08:52:16 Node name: dcp-test
polkadot-node | 2019-08-12 08:52:16 Roles: AUTHORITY
polkadot-node | 2019-08-12 08:52:16 Generated a new keypair: 568dbb11bcc8f4bd1480d381e2ee87f9e1ff3798c99efa23f550dcce7417a506 (5E2C5Usq...)
polkadot-node | 2019-08-12 08:52:16 Initializing Genesis block/state (state: 0xb7d6…2707, header-hash: 0xdcd1…025b)
polkadot-node | 2019-08-12 08:52:16 Loaded block-time = 6 seconds from genesis on first-launch
polkadot-node | 2019-08-12 08:52:16 Loading GRANDPA authority set from genesis on what appears to be first startup.
polkadot-node | 2019-08-12 08:52:16 Best block: #0
polkadot-node | 2019-08-12 08:52:16 Local node identity is: QmWg2c4V6qq1hFYUcbkmckUgtMfWiC7aq5u9e8X5Sq45Tu
polkadot-node | 2019-08-12 08:52:16 Listening for new connections on 127.0.0.1:9944.
polkadot-node | 2019-08-12 08:52:17 Using authority key 5E2C5Usqi8UhQLCB1CGobhB5aGMg6zWxvg2h7Vq39tWbj14Q
polkadot-node | 2019-08-12 08:52:18 Discovered external node address: /ip4/92.176.206.107/tcp/30333/p2p/QmWg2c4V6qq1hFYUcbkmckUgtMfWiC7aq5u9e8X5Sq45Tu
polkadot-node | 2019-08-12 08:52:22 Syncing, target=#2614309 (2 peers), best: #256 (0x7e81…c0f7), finalized #0 (0xdcd1…025b), ⬇ 84.0kiB/s ⬆ 5.9kiB/s
polkadot-node | 2019-08-12 08:52:28 Syncing 93.9 bps, target=#2614310 (4 peers), best: #896 (0x6da8…cd8f), finalized #0 (0xdcd1…025b), ⬇ 30.6kiB/s ⬆ 1.7kiB/s
polkadot-node | 2019-08-12 08:52:35 Syncing 94.4 bps, target=#2614311 (5 peers), best: #1536 (0xf9b0…8351), finalized #0 (0xdcd1…025b), ⬇ 34.8kiB/s ⬆ 3.1kiB/s
polkadot-node | 2019-08-12 08:52:41 Syncing 93.9 bps, target=#2614312 (5 peers), best: #2048 (0xaa1c…3b27), finalized #0 (0xdcd1…025b), ⬇ 40.4kiB/s ⬆ 2.8kiB/s
polkadot-node | 2019-08-12 08:52:46 Syncing 93.4 bps, target=#2614313 (5 peers), best: #2515 (0x8bff…4f0b), finalized #0 (0xdcd1…025b), ⬇ 7.6kiB/s ⬆ 1.3kiB/s
polkadot-node | 2019-08-12 08:52:51 Syncing 93.2 bps, target=#2614314 (5 peers), best: #2981 (0x47ab…67bd), finalized #0 (0xdcd1…025b), ⬇ 6.0kiB/s ⬆ 0.3kiB/s
[..........]
您可以看到其他对等方可以在启动后轻松连接到它。
但是,我认为覆盖网络是朝着正确方向迈出的良好一步,它创建了一个只有网络成员知道的网络地址空间,您可以配置验证器和公共节点以限制访问,也许使用 polkadot 二进制文件选项listen-addr
和reserved-nodes
。 我们提出了一个使用这种方法的安全验证器设置,但它不是使用 docker 覆盖网络作为私有网络地址空间,而是使用 VPN 来提高安全性。 看看这里https://hackmd.io/QSJlqjZpQBihEU_ojmtR8g#Conclusions -and-Proposal
这里提到的@fgimenez不起作用:
# Docker compose file to simulate a sentry node setup.
#
#
# Setup:
#
# Validator A is not supposed to be connected to the public internet. Instead it
# connects to a sentry node (sentry-a) which connects to the public internet.
# Validator B can reach validator A via sentry node A and vice versa.
#
#
# Usage:
#
# 1. Build `target/release/substrate` binary: `cargo build --release`
#
# 2. Start networks and containers: `sudo docker-compose -f scripts/sentry-node/docker-compose.yml up`
#
# 3. Reach:
# - polkadot/apps on localhost:3000
# - validator-a: localhost:9944
# - validator-b: localhost:9945
# - sentry-a: localhost:9946
version: "3.7"
services:
validator-a:
ports:
- "9944:9944"
volumes:
- ../../target/release/substrate:/usr/local/bin/substrate
image: parity/substrate
networks:
- network-a
command:
# Local node id: QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR
- "--node-key"
- "0000000000000000000000000000000000000000000000000000000000000001"
- "--base-path"
- "/tmp/alice"
- "--chain=local"
- "--key"
- "//Alice"
- "--port"
- "30333"
- "--validator"
- "--name"
- "AlicesNode"
- "--reserved-nodes"
- "/dns4/sentry-a/tcp/30333/p2p/QmV7EhW6J6KgmNdr558RH1mPx2xGGznW7At4BhXzntRFsi"
# Not only bind to localhost.
- "--ws-external"
- "--rpc-external"
# - "--log"
# - "sub-libp2p=trace"
# - "--log"
# - "afg=trace"
- "--no-telemetry"
- "--rpc-cors"
- "all"
sentry-a:
image: parity/substrate
ports:
- "9946:9944"
volumes:
- ../../target/release/substrate:/usr/local/bin/substrate
networks:
- network-a
- internet
command:
# Local node id: QmV7EhW6J6KgmNdr558RH1mPx2xGGznW7At4BhXzntRFsi
- "--node-key"
- "0000000000000000000000000000000000000000000000000000000000000003"
- "--base-path"
- "/tmp/sentry"
- "--chain=local"
# Don't configure a key, as sentry-a is not a validator.
# - "--key"
# - "//Charlie"
- "--port"
- "30333"
# sentry-a is not a validator.
# - "--validator"
- "--name"
- "CharliesNode"
- "--bootnodes"
- "/dns4/validator-a/tcp/30333/p2p/QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR"
- "--bootnodes"
- "/dns4/validator-b/tcp/30333/p2p/QmSVnNf9HwVMT1Y4cK1P6aoJcEZjmoTXpjKBmAABLMnZEk"
- "--no-telemetry"
- "--rpc-cors"
- "all"
# Not only bind to localhost.
- "--ws-external"
- "--rpc-external"
# Make sure sentry-a still participates as a grandpa voter to forward
# grandpa finality gossip messages.
- "--grandpa-voter"
validator-b:
image: parity/substrate
ports:
- "9945:9944"
volumes:
- ../../target/release/substrate:/usr/local/bin/substrate
networks:
- internet
command:
# Local node id: QmSVnNf9HwVMT1Y4cK1P6aoJcEZjmoTXpjKBmAABLMnZEk
- "--node-key"
- "0000000000000000000000000000000000000000000000000000000000000002"
- "--base-path"
- "/tmp/bob"
- "--chain=local"
- "--key"
- "//Bob"
- "--port"
- "30333"
- "--validator"
- "--name"
- "BobsNode"
- "--bootnodes"
- "/dns4/validator-a/tcp/30333/p2p/QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR"
- "--bootnodes"
- "/dns4/sentry-a/tcp/30333/p2p/QmV7EhW6J6KgmNdr558RH1mPx2xGGznW7At4BhXzntRFsi"
- "--no-telemetry"
- "--rpc-cors"
- "all"
# Not only bind to localhost.
- "--ws-external"
- "--rpc-external"
ui:
image: polkadot-js/apps
ports:
- "3000:80"
networks:
network-a:
internet:
@fgimenez好吧,经过几天的沉默,我会考虑这种方法
@agutsal对迟到的回复感到抱歉,结合 reserved-nodes 和 bootnodes 是一个不错的选择。 正如我之前的评论中所述,我还将在验证器中引入listen-addr,并在 docker compose 覆盖网络中使用验证器 ip,以便确保验证器仅接受来自该地址空间中对等方的连接。
感谢您的回复。 据我所知,他们使用substrate
docker 镜像,而我们不是。
基本上我应该遵循这个:
docker run -ti parity/polkadot:v0.4.4 --chain=alex --alice
<== 跑哨
它会产生这样的东西,我应该检查Discovered external node address
然后像这样将它传递给验证器:
docker run -ti parity/polkadot:v0.4.4 --chain=local --validator --reserved-nodes /ip4/5.58.235.221/tcp/30333/p2p/QmVUPpkU2LoBMqhagLmF6H2Xnb4ShK8KV2ZzKeJkmGGBkX
如果这是正确的,在哪里通过bootnodes
? 如果没有 - 请修复我, @fgimenez
正如我所看到的,您不应该使用任何外部发现的地址,而是应该使用包含 docker compose 覆盖网络上公共节点 ip 的 multiaddr。 不知道在 docker compose 网络启动之前你能不能知道。
我只提到了引导节点,因为它们出现在您 l8nked 的示例中,只有在您要创建本地网络时才需要它们。 如果您要加入 alex 或(在 imo 中更好的)kusama,则引导节点已在链规范中定义。
@fgimenez根据要求验证器节点应连接到哨兵节点。 我需要知道该怎么做。 而已。
是的,这是通过在验证器中设置--reserved-nodes
和公共节点的 multiaddr 来完成的(每个公共节点一个保留节点)。 在这里使用multiaddr的公共节点的私有地址应该更好,这有意义吗?
@fgimenez ;) 可能是,只是不知道指定多地址的--reserved-nodes
参数的格式。 将感谢样品。
当然,像这样/ip4/<private_ip>/tcp/30333/p2p/<peer_id>
您应该将私有 ip 设置为分配给 docker compose 覆盖网络中的公共节点的一个。 如果您未使用--node-key
指定节点密钥,则在引导时随机分配对等 ID。 此节点密钥应该是一个 64 十六进制字符字符串,您可以尝试通过设置已知节点密钥然后检查分配了哪个对等 id 来尝试在本地启动一个节点,并使用该对等 id 来构造保留节点 multiaddr。
因此,对于每个公共节点:
polkadot --node-key=<your_node_key>
启动本地节点--node-key
包含为先前的值,以便确保它始终具有相同的对等 id/ip4/<private_ip>/tcp/30333/p2p/<peer_id>
并在每个公共节点 multiaddr 中设置一个--reserved-nodes
来启动验证器
需要帮助请叫我。
@fgimenez我目前正在考虑如何在单个docker-compose.yml
文件中进行这两个步骤的过程。告诉我 - <your_node_key>
可以随机生成为一些 UUID?
类似的东西: $(openssl rand -base64 500 | tr -dc 'a-zA-Z0-9' | fold -w 45 | head -n 1)
您可以使用 libp2p 库之一来生成对等 id 和关联的密钥对,例如https://github.com/libp2p/js-peer-id node-key 是私钥,长度为 256 位。
@fgimenez请查看我的WIP PR
从docker
目录中运行docker-compose -f sentry-docker-compose.yml up
并查看输出。 似乎验证器成功连接到哨兵作为对等点。
如果被接受,我将添加更多配置并推送以合并到 master 中。
下周肯定会看看:+1:
@fgimenez一些更新被推送到我的WIP RP
请在审核后告诉我。
@agutsal看起来不错,它与https://github.com/paritytech/substrate/blob/master/scripts/sentry-node/docker-compose.yml非常相似,对吧? 将其添加到 polkadot 的 repo 有什么好处?
好吧@fgimenez ,它实际上是基于sentry-node/docker-compose.yml
但有很大的不同:我们可以传递一堆环境变量来控制两个容器:
{SENTRY,VALIDATOR}_NODE_KEY
{SENTRY,VALIDATOR}_BASE_PATH
{SENTRY,VALIDATOR}_CHAIN
{SENTRY,VALIDATOR}_PORT
{SENTRY,VALIDATOR}_NAME
VALIDATOR_RESERVED_NODES
SENTRY_BOOTNODES
这是在公共(非本地)链上运行具有唯一 NODE_KEY、RESERVED_NODES/BOOTNODES URI 的哨兵/验证器的必要条件。
默认情况下,它以 00000000000000000000000000000000000000000000000000000000000000001 运行
00000000000000000000000000000000000000000000000000000000000000003
这对于测试来说是可以的,但对于生产来说是不行的。 还清除了一些冗余参数。
问题状态:1. 开放 2. 开始 3. 已提交4. 完成
__为 150.0 DAI (150.0 USD @ $1.0/DAI) 的工作由__提交:
@Web3Foundation请看一下提交的作品:
问题状态:1. 开放 2. 开始 3. 已提交 4.完成
__与此问题相关的 150.0 DAI(150.0 美元 @ 1.0 美元/DAI)的资金已获批准并发给 @gutsal-arsen.__
@Web3Foundation感谢您的付款。 但是,我认为我还必须修复当前项目范围内的文档。 当前存储库不包含文档,我应该克隆https://github.com/w3f/polkadot-wiki并在那里修复它们吗?
@agutsal确定; 由于@fgimenez创建了一个可能更成功地解决此问题的工具,因此进行了一些反复的努力。 由于您在生态系统中的反复努力以及您在过去的赏金和本次赏金中所花费的持续时间,我们付出了代价。
随意修改文档并留下任何评论以供审查。
谢谢你让我知道。 今天会继续努力,让你知道@fgimenez @Web3Foundation。
由于哨兵节点已被弃用,因此关闭。
最有用的评论
大声笑对不起我已经静音@gitcoinbot 100 天@agutsal