添加和删除 IBFT 验证节点
在 IBFT 网络的整个生命周期中,随着权限的变化,需要添加和删除验证节点。 在这里,我们将展示向 IBFT 网络添加新验证节点并删除现有验证节点。
将节点添加到验证集
一旦节点成为网络的一部分,将节点添加到 IBFT 验证集相对容易。 节点是否已经在线并不重要,因为添加新节点作为验证的过程只需要现有的验证节点。
添加新验证节点需要大多数现有验证节点提议要添加的新节点。 这是通过调用具有 true 值的 proposeRPC 方法并将地址替换为您需要的地址来实现的:在 geth 控制台中,运行:
在 geth 控制台中,运行:
返回 null 。
这表明当前节点希望添加地址 0xb131288f355bc27090e542ae0be213c20350b767 作为新的验证节点。
例子
1. 您可以在 quorum-examples 存储库中找到运行示例所需的资源。
这些示例使用 docker-compose 作为容器定义。 如果您通过复制所描述的命令进行操作,那么为 Docker Compose 设置项目名称很重要,或者记住更改目录的前缀。 有关更多详细信息,请参阅 Docker documentation 。
要设置项目名称,请运行以下命令:
2.启动网络,其中包含 7 个节点,其中 6 个是验证节点。
我们将添加第 7 个节点作为验证节点。 您可能会在节点 7 消息的日志中注意到 node7_1 | WARN [01-20|10:37:16.034] Block sealing failed err=unauthorized 。 这是因为该节点在启动时启用了铸造,但没有创建区块的权限,因此会引发此错误。
3.现在我们需要从现有节点中提议节点 7 作为新提议者。
在更改生效之前,我们需要大多数现有验证节点来提议新节点。
让我们从节点 1 开始,看看会发生什么:
从节点 1 提出节点 7 :
返回 null 。
等待大约 5 秒钟,然后运行:
结果是:
让我们分解一下。 首先,我们建议添加地址 0xb131288f355bc27090e542ae0be213c20350b767 ; 这就是 true 参数的用途。 如果我们将其设置为 false ,则意味着我们要删除具有该地址的现有验证节点。
其次,我们获取了当前的快照,这让我们可以深入了解投票的当前运行状态。 我们可以看到新地址在 tally 部分下有 1 票, 而 这 1 票描述在 votes 部分。 您的投票已登记!
4. 让我们从节点 2 运行它并查看类似的结果:
返回 null 。
同样,您可能需要等待 5-10 秒的快照才能显示投票
结果是:
一如往常,您已经登记了第二票!
5. 好的,让我们最后对节点 3 和 4 进行投票。
返回 null
返回 null
6. 现在您获得了多数票,让我们再次检查快照:
结果是:
您可以看到投票现在已被清除,准备进行新一轮。 此外,您添加的地址 0xb131288f355bc27090e542ae0be213c20350b767 现在存在于 validators 列表中! 最后,节点 7 之前发出的未经授权的消息已经停止,因为它现在有权创建区块。
从验证节点集中删除节点
删除验证节点类似于添加节点,但这次您想提议值为 false 的节点,以表明您正在取消对它们的授权。 节点是否仍然在线并不重要,因为它不需要来自被删除节点的任何输入。
删除新验证节点需要大多数现有验证节点提议删除新节点。 这是通过使用值为 false 调用 propose 的 RPC 方法并将地址替换为您需要的地址来实现的:
返回 null
例子
可以在 quorum-examples 存储库中找到运行示例所需的资源。
1. 这些示例使用 docker-compose 作为容器定义。 如果您通过复制所描述的命令进行操作,那么为 Docker Compose 设置项目名称很重要,或者记住更改目录的前缀。 有关更多详细信息,请参阅 Docker documentation 。
要设置项目名称,请运行以下命令:
2.启动网络,其中包含 7 个节点,其中 6 个是验证节点。
为 docker-compose 设置环境变量:
启动 7 节点网络,其中 6 个是验证者:
3.现在您需要提议节点 6 作为要删除的节点
让我们从节点 1 开始,看看会发生什么:返回空值。
从节点 1 提出节点 7 :
返回 null
待大约 5 秒钟,然后运行:
结果是:
让我们分解一下。 首先,您建议删除地址 0x8157d4437104e3b8df4451a85f7b2438ef6699ff ; 这就是 false 参数的用途。
其次,您获取了当前快照,这使我们可以深入了解投票的当前运行状态。 您可以看到提议的地址在计数部分下有 1 票,而在 votes 部分下描述了 1 票。 在这里, authorize 部分设置为 false ,这符合我们删除验证节点的建议。
1. 您需要获得多数票,所以让我们在另外 3 个节点上运行提案
返回 null
返回 null
现在让我们检查快照,所有必需的投票都在:
结果是:
验证节点已从 validators 列表中删除,剩下的 5 个仍然存在。 您还将在节点 6 的日志中看到类似 node6_1 | WARN [01-20|11:35:52.044] Block sealing failed err=unauthorized 。 这是因为它仍在铸造块,但意识到它无权将它们推送到网络上的任何其他节点(您还将看到节点 7 的此消息,该节点从未被授权但仍设置为挖掘 )。
另见