当前位置: 首页 > news >正文

通过Docker搭建4节点的Tendermint集群

Tendermint:0.34.24
Docker:20.10.21
Docker-Compose:2.20.2
OS:Ubuntu 20.04
Go:1.19.2 Linux/amd64

1 修改Tendermint源码

1.1 修改监听IP

为什么要将127.0.1修改成0.0.0.0呢?因为容器内的服务如果是以127.0.0.1暴露的话,外部是无法通过端口映射访问docker容器内对应服务的。
127.0.0.1是一个特殊的IP地址,称为本地回环地址,只能用于在同一台计算机上的进程之间进行通信。当您将服务绑定到127.0.0.1地址时,它将只能在本机进行访问,无法通过外部网络访问该应用程序。
在这里插入图片描述

1.2 不产生空区块

在这里插入图片描述

1.3 统一ChainID

在这里插入图片描述

1.4 修改AddBookStrict为false,用来支持局域网通信

在这里插入图片描述

2 编译生成二进制可执行文件

make install
make install_abci

3 编写dockerfile定制镜像

FROM ubuntu
ENV MYPATH /usr/local
WORKDIR $MYPATH
ADD ./tendermint $MYPATH
ADD ./abci-cli $MYPATH
RUN apt update
RUN apt install curl

注意要将abci-cli和tendermint可执行文件与dockerfile文件放在同一目录下:
在这里插入图片描述
查看定制的docker镜像:
在这里插入图片描述

4 编写docker-compose编排容器

网络采用桥接模式,并对每个节点的RPC服务端口26657进行外部映射。

version: "3"
services:node0:image: tmcontainer_name: node0ports:- "26657:26657"volumes:- /usr/local/node0:$HOME/.tendermintnetworks:mynet:ipv4_address: 172.20.20.0command: - /bin/bash- -c- |./tendermint init./tendermint show-node-id > $HOME/.tendermint/nodeid.txt./abci-cli kvstorenode1:image: tmcontainer_name: node1ports:- "36657:26657"volumes:- /usr/local/node1:$HOME/.tendermintnetworks:mynet:ipv4_address: 172.20.20.1command:- /bin/bash- -c- |./tendermint init./tendermint show-node-id > $HOME/.tendermint/nodeid.txt./abci-cli kvstorenode2:image: tmcontainer_name: node2ports:- "46657:26657"networks:mynet:ipv4_address: 172.20.20.2volumes:- /usr/local/node2:$HOME/.tendermintcommand:- /bin/bash- -c- |./tendermint init./tendermint show-node-id > $HOME/.tendermint/nodeid.txt./abci-cli kvstorenode3:  image: tmcontainer_name: node3ports:- "56657:26657"networks:mynet:ipv4_address: 172.20.20.3volumes:  - /usr/local/node3:$HOME/.tendermintcommand:- /bin/bash- -c- |./tendermint init./tendermint show-node-id > $HOME/.tendermint/nodeid.txt./abci-cli kvstore
networks:mynet:ipam:driver: defaultconfig:- subnet: 172.20.0.0/16

启动容器:
docker-compose up -d
在这里插入图片描述

5 统一的genesis.json

因为容器卷的缘故,宿主机本地可以直接查看每个节点的config和data目录。
集群要求每个节点的genesis.json文件完全相同,并且包含所有节点的validator信息。
这里通过一个简单的Python脚本快速构建统一的genesis.json文件:

linesArr = []for i in range(0, 4):f = open("/usr/local/node%d/config/genesis.json" % i, 'r')linesArr.append(f.readlines())f.close()f = open("./genesis.json", 'w')for i in range(len(linesArr)):lines = linesArr[i]if i == 0:for j in range(23):f.write(lines[j])for j in range(23, 32):if i == len(linesArr) - 1:f.write(lines[j])else:if j < 31:f.write(lines[j])else:f.write(lines[j][:len(lines[j]) - 1])f.write(",\n")for i in range(32, len(linesArr[0])):f.write(linesArr[0][i])f.close()

生成的统一的genesis.json创世文件:

{"genesis_time": "2024-01-06T02:17:15.806171802Z","chain_id": "test-chain","initial_height": "0","consensus_params": {"block": {"max_bytes": "22020096","max_gas": "50","time_iota_ms": "1000"},"evidence": {"max_age_num_blocks": "100000","max_age_duration": "172800000000000","max_bytes": "1048576"},"validator": {"pub_key_types": ["ed25519"]},"version": {}},"validators": [{"address": "6DE6C6F2CD5AD081A1B6C7A87FC915E04B1E2219","pub_key": {"type": "tendermint/PubKeyEd25519","value": "iKt2epWBuZHFayrS4qb7AJAwbfSlrJxOsLSbwwsUn9A="},"power": "10","name": ""},{"address": "5993A76300771C1EF633D6801FF53D5B6527127A","pub_key": {"type": "tendermint/PubKeyEd25519","value": "uGc87MkuEtnMTcIQGUD22mNdTAQ7400FDqtIOkctbDg="},"power": "10","name": ""},{"address": "039D64F5C23FD4CA0E4563B282B0B6F96CE278CB","pub_key": {"type": "tendermint/PubKeyEd25519","value": "FWFS6CuHP+iOk8tktKfMm1A8WJIldFP+chjDj9AbD78="},"power": "10","name": ""},{"address": "73BFE884FB6C97F170FED9A9699EDB1B3E5341C4","pub_key": {"type": "tendermint/PubKeyEd25519","value": "xpPW7WNXZYJnUCOLT/Uv1czyfLEhpiDo7jN/DS/Ad2s="},"power": "10","name": ""}],"app_hash": ""
}

覆盖掉原来的genesis.json文件:
在这里插入图片描述

6 启动集群

如果没在docker-compose手动指定各容器的IP,则通过docker inspect查询各容器的IP:
在这里插入图片描述
查看每个节点的nodeID,由于容器卷以及容器启动时会将nodeID重定向到nodeid.txt文件,我们在宿主机本地就能够访问。
在这里插入图片描述

最后构造出统一的启动命令:
./tendermint node --p2p.persistent_peers=“15352fccfb6a2a177fa18253bfb4bd6cd71c0894@172.20.20.0:26656,c61f1ed46fef14b5d518dbe5f9831134cba72518@172.20.20.1:26656,891df109a91fb4fc97c936594aa694206fdbb8de@172.20.20.2:26656,fba18b7bc2d04a6a5aac41a40ab5f230be51b031@172.20.20.3:26656”

7 验证集群是否启动成功

7.1 第一种验证方式:

在这里插入图片描述
可以看到,node2的peer数量为3

7.2 第二种验证方式:

向node0发送一条name=jackie的交易:
在这里插入图片描述

分别从node1、node2、node3查询交易,得到的结果是base64格式:
在这里插入图片描述

对返回的结果进行base64解码:
在这里插入图片描述
不过,通过命令行提交交易太繁琐了,我们干脆写个简单的测试程序,向node0提交500个交易:

func main() {cli, err := http.New("http://localhost:26657", "/websocket")if err != nil {panic(err)}for i := 0; i < 500; i++ {_, err = cli.BroadcastTxAsync(context.TODO(), types.Tx(strconv.Itoa(i)))if err != nil {panic(err)}}
}

会发现四个节点的区块全部同步到同一个高度:
在这里插入图片描述
如果我们让节点node0宕机,会发现其他三个节点会打印出node0宕机的信息:
在这里插入图片描述
最后优雅关闭所有容器:
在这里插入图片描述

至此。

相关文章:

通过Docker搭建4节点的Tendermint集群

Tendermint&#xff1a;0.34.24 Docker&#xff1a;20.10.21 Docker-Compose&#xff1a;2.20.2 OS&#xff1a;Ubuntu 20.04 Go&#xff1a;1.19.2 Linux/amd64 1 修改Tendermint源码 1.1 修改监听IP 为什么要将127.0.1修改成0.0.0.0呢&#xff1f;因为容器内的服务如果是以…...

element plus 表格组件怎样在表格中显示图片

官方给的&#xff1a; <el-table-column label"Thumbnail" width"180"><template #default"scope"><div style"display: flex; align-items: center"><el-image :preview-src-list"srcList"/><…...

cad快速看图软件免费版(手机在线cad快速看图)

cad快速看图软件免费版(手机在线cad快速看图) 很多机械设计师日常工作过程中涉及到多种格式的cad图纸&#xff0c;cad图纸大多都需要cad设计软件才能打开&#xff0c;然而很多小伙伴并没有下载相应的cad设计软件&#xff0c;这种情况下如何进行cad快速看图呢&#xff1f; 今天…...

C#: Label、TextBox 鼠标停留时显示提示信息

说明&#xff1a;记录在 Label、TextBox 控件上 鼠标停留时显示提示信息的方法。 1.效果图 2.具体实现步骤 1. 在Form 窗口中先创建 Label 并取名&#xff1a;KEY_label &#xff0c;或 TextBox 取名&#xff1a;KEY_textBox 2. lable控件的 tips 实现方法1 &#xff1a;代码…...

.NET 8.0 本机 AOT

在软件开发领域&#xff0c;优化性能和简化效率仍然至关重要。.NET 平台二十年来不断创新&#xff0c;为开发人员提供了构建弹性且高效的软件解决方案的基础架构。 与本机 AOT&#xff08;提前&#xff09;编译相结合&#xff0c;取得了显着的进步。本文深入研究.NET Native AO…...

phpcms v9未审核推荐信息出现在推荐列表中【BUG修复】

修改文件&#xff1a;phpcms/modules/content/class/content_tag.class.php 调整过的方法&#xff1a; public function __construct() {$this->db pc_base::load_model(content_model);$this->position pc_base::load_model(position_model);$this->position_da…...

Linux第20步_在虚拟机上安装“Visual Studio Code”

1、双击windows系统桌面上的“FileZilla Client.exe”&#xff0c;打开FTP客户端&#xff0c;点击03软件下的Visual Studio Code&#xff0c;发现code_1.50.1-1602600906_amd64。 2、点击“文件”&#xff0c;然后点击“站点管理器”&#xff0c;见下图操作&#xff1a; 3、点…...

【服务器数据恢复】Raid5热备盘同步失败导致lvm结构损坏的数据恢复案例

服务器数据恢复环境&#xff1a; 两组由4块磁盘组建的raid5磁盘阵列&#xff0c;两组raid5阵列划分为lun并组成了lvm结构&#xff0c;ext3文件系统。 服务器故障&#xff1a; 一组raid5阵列中的一块硬盘离线&#xff0c;热备盘自动上线并开始同步数据。在热备盘完成同步之前&am…...

react+AntDesign 之 pc端项目案例

1.环境搭建以及初始化目录 CRA是一个底层基于webpack快速创建React项目的脚手架工具 # 使用npx创建项目 npx create-react-app react-jike# 进入到项 cd react-jike# 启动项目 npm start2.安装SCSS SASS 是一种预编译的 CSS&#xff0c;支持一些比较高级的语法&#xff0c;…...

实验笔记之——基于COLMAP的Instant-NGP与3D Gaussian Splatting的对比

之前博客进行了COLMAP在服务器下的测试 实验笔记之——Linux实现COLMAP-CSDN博客文章浏览阅读794次&#xff0c;点赞24次&#xff0c;收藏6次。学习笔记之——NeRF SLAM&#xff08;基于神经辐射场的SLAM&#xff09;-CSDN博客NeRF 所做的任务是 Novel View Synthesis&#xf…...

实战环境搭建-linux下安装悟空CRM

下载地址如下: 链接:https://pan.baidu.com/s/1OI9EA8Nc8ymWlERS9i0vjg?pwd=ws5c 提取码:ws5c 上传crm的程序包,如下图: 输入 unzip 72crm-java-master.zip 进行解压 create database crm9; use crm9; source /opt/72crm-java-master/docs/crm9.sql 修改/home/wukongcr…...

Redis 7.0性能大揭秘:如何优化缓存命中率?

Redis 7.0&#xff0c;这货不仅仅是一个简单的缓存工具&#xff0c;它更是一款高性能的数据结构服务器。现在&#xff0c;大家都知道缓存命中率对性能影响特别大&#xff0c;但怎么优化它呢&#xff1f; 本文&#xff0c;已收录于&#xff0c;我的技术网站 ddkk.com&#xff0…...

【深度学习每日小知识】Data Augmentation 数据增强

数据增强是通过对原始数据进行各种转换和修改来人工生成附加数据的过程&#xff0c;旨在增加机器学习模型中训练数据的大小和多样性。这对于计算机视觉领域尤为重要&#xff0c;因为图像经常被用作输入数据。 计算机视觉中的数据增强 数据增强的主要目标是解决过拟合问题&…...

网络调试 UDP1,开发板用动态地址-入门6

https://www.bilibili.com/video/BV1zx411d7eC?p11&vd_source109fb20ee1f39e5212cd7a443a0286c5 1, 开发板连接路由器 1.1&#xff0c;烧录无OS UDP例程 1.2&#xff0c;Mini USB连接电脑 1.3&#xff0c;开发板LAN接口连接路由器 2. Ping开发板与电脑之间通信* 2.1 根据…...

【Gin实战教程】快速入门

Gin是一个轻量级的Web框架&#xff0c;使用Go语言开发。它具有高性能、易用性和灵活性的特点&#xff0c;是构建可扩展的Web应用程序的理想选择。 首先&#xff0c;Gin是一个高性能的框架。它基于Go语言的原生HTTP包进行开发&#xff0c;利用了Go语言的并发特性和协程模型&…...

WPF真入门教程26--项目案例--欧姆龙PLC通讯工具

1、案例介绍 前面已经完成了25篇的文章介绍&#xff0c;概括起来就是从0开始&#xff0c;一步步熟悉了wpf的概念&#xff0c;UI布局控件&#xff0c;资源样式文件的使用&#xff0c;MVVM模式介绍&#xff0c;命令Command等内容&#xff0c;这节来完成一个实际的项目开发&#…...

C++ OpenGL 3D Game Tutorial 2: Making OpenGL 3D Engine学习笔记

视频地址https://www.youtube.com/watch?vPH5kH8h82L8&listPLv8DnRaQOs5-MR-zbP1QUdq5FL0FWqVzg&index3 一、main类 接上一篇内容&#xff0c;main.cpp的内容增加了一些代码&#xff0c;显得严谨一些&#xff1a; #include<OGL3D/Game/OGame.h> #include<i…...

Redis小计(4)

目录 1.Set和Get操作 2.mset和mget 3.mset&#xff0c;mget&#xff0c;set后加参数的优点 4.incr,incrby&#xff0c;incrbyfloat 1.Set和Get操作 flushall&#xff1a;清除所有k-v键值对。&#xff08;删库跑路小技巧&#xff09; set k v[ex | px]&#xff1a;设置超时…...

【React】常用Hook函数的梳理和总结(第二篇)

1. 前言 本篇梳理和总结React中常用的Hook函数。 欢迎大家来到Hook的世界&#xff0c;真的贼好用~ 2. 常用Hook函数 Hook说明示例useState(initialState) 功能&#xff1a;为函数组件添加状态变量&#xff0c;输入可是基本数据类型或引用数据类型&#xff0c;也可以是不带参数…...

【JaveWeb教程】(15) SpringBootWeb之 响应 详细代码示例讲解

目录 SpringBootWeb请求响应2. 响应2.1 ResponseBody2.2 统一响应结果2.3 案例2.3.1 需求说明2.3.2 准备工作2.3.3 实现步骤2.3.4 代码实现2.3.5 测试2.3.6 问题分析 SpringBootWeb请求响应 2. 响应 前面我们学习过HTTL协议的交互方式&#xff1a;请求响应模式&#xff08;有…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...