区块链中文技术社区

Solana 检查交易confirmed状态时间过长

问题

业务中发送交易后,等待状态变为 confirmed 的时间较长,约 3 秒左右。

环境

  • 基于 Solana Agave 部署
  • 单 validator 私链

原因分析

confirmed 并不是交易立即执行的状态,而依赖 slot / vote / block commitment

单 validator 下 confirmed 延迟原因

  • processed:leader 已执行交易(最快)
  • confirmed:交易所在 block 被投票确认
  • finalized:达到 supermajority

单 validator 情况:

  • 即便只有一个节点,也必须出 vote
  • vote 是单独交易,通常在 下一个或后续 slot 才完成
  • slot 时间偏大或交易量低 → vote 延迟 → confirmed 累积到 1–3 秒

即使 slot = 50ms,在低 TPS 私链下,confirmed 仍可能慢,因为 vote 被节流或跨多个 slot 才出。

解决方案

1. 客户端改用 processed

connection.confirmTransaction(sig, "processed")

sendAndConfirmTransaction(
  connection,
  tx,
  signers,
  { commitment: "processed" }
)
  • processed 延迟:几十 ms
  • confirmed 延迟:1–3 秒

单 validator 私链中,processed 基本安全,不会发生共识回滚。


2. 风险说明

  • 唯一风险来自 节点崩溃/重启:block 未落盘 → 交易可能丢失
  • 非共识风险,仅进程级别

3. 优化 confirmed 延迟

  • 低 TPS 私链可通过增加压测交易:
    • 每个 slot 保持交易 → vote 更快产生 → confirmed 延迟缩短
  • 压测交易可使用无害空交易
    • 发送 0 SOL 的转账
    • from/to 同一个账户

4. 综合方案(推荐)

目标:保证业务交易快速反馈,同时降低 confirmed 延迟

  1. 客户端
    • 使用 commitment = processed
    • 立即返回成功,提升用户体验
  2. 后台服务
    • 异步监听交易 signature
    • confirmed / finalized
    • 极端情况(几秒后未 confirmed) → 补偿或重发
  3. 压测优化(可选)
    • 在私链 TPS 较低时,可增加持续模拟交易
    • 每个 slot 都有交易 → vote 更快生成 → confirmed 时间缩短
    • 可使用无害空交易,不影响业务逻辑

该方案兼顾速度、确认可靠性,并可通过压测交易进一步降低 confirmed 延迟

更换Git子模块的仓库地址

更换子模块地址

  1. 修改 .gitmodules
    [submodule "libs/foo"]
     path = libs/foo
     url  = https://github.com/old-org/foo.git

    改成:

    [submodule "libs/foo"]
     path = libs/foo
     url  = https://github.com/new-org/foo.git
  2. 同步配置
    git submodule sync
  3. 更新子模块
    git submodule update --init --recursive
  4. 更新仓库
    git add .gitmodules
    git commit -m "chore: update submodule foo url"
    git push

更换主仓库地址

  1. 查看当前远端
    git remote -v

    你会看到类似:

    origin  https://github.com/old-org/project.git (fetch)
    origin  https://github.com/old-org/project.git (push)
  2. 修改 origin 地址
    git remote set-url origin https://github.com/new-org/project.git

    验证

    git remote -v
  3. 推送到新组织(第一次建议加 -u)
    git push -u origin main
    # 或
    git push -u origin master

OpenVPN 管理器:面向企业 VPN 管理的完整开源解决方案

管理整个组织内的 VPN 用户不应该再像 2005 年那样了。不再需要使用包含凭据的电子表格、手动配置文件,也不再需要费心去了解“现在谁在线?”。

OpenVPN Manager——一个开源的 Web 应用程序,它为您的 VPN 基础架构带来现代化的用户管理;同时发布的还有OpenVPN Client——一个配套工具,它可以将所有内容无缝集成。

问题

如果你曾经为团队管理过 OpenVPN 服务器,你就会了解这些痛点:

  • 用户管理一片混乱——添加用户意味着生成证书、编辑配置,还要祈祷别搞砸了什么。
  • 完全看不到任何信息——谁在线?带宽使用情况如何?连接历史记录?祝你好运,希望能找到答案。
  • 访问控制难题——工程部门和人力资源部门需要不同的网络访问权限,但 OpenVPN 并没有简化这一过程。
  • 审计要求——当安全部门询问“谁在何时访问了什么?”时,您可能需要花费数小时翻阅日志。
  • 承包商访问权限——本应过期但从未过期的临时用户。

解决方案:两个项目,一个完整系统

OpenVPN 管理器(Web 应用程序)

整个系统的核心。一个基于网页的管理面板,您可以在这里管理所有事项:

基于角色的访问控制的用户管理

三个角色确保一切井然有序:

  • 用户——可以查看和编辑自己的个人资料
  • 管理员——可以创建和管理团队中的用户
  • 管理员——拥有所有权限

非常适合团队负责人需要管理团队的 VPN 访问权限,而又不想麻烦 IT 部门的组织。


基于组的网络访问

定义用户组(例如工程组、人力资源组、财务组),并为每个用户分配网络段。用户继承其所属用户的访问权限。简单、可扩展且可审计。


VPN IP 自动分配

只需配置一次 VPN 网络范围,系统就会自动为新用户分配下一个可用的 IP 地址。从此告别 IP 地址冲突和手动追踪。

会话跟踪与审核

最后,了解您的 VPN 信息:

  • 实时连接状态
  • 用户带宽使用情况
  • 完整的连接历史记录
  • 所有变更的完整审计跟踪


限时访问

需要授予承包商两周的访问权限?设置日期valid_from即可valid_to。访问权限会自动过期。再也不用担心忘记登录了。

OpenVPN客户端(集成脚本)

将你的 OpenVPN 服务器连接到管理器的 Go 二进制文件:

┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ 
│ OpenVPN 服务器 │─────────────▶│ OpenVPN 客户端 │────▶│ OpenVPN 管理器
│ │ │ │ (Go 二进制文件)                           │ │ (Web 应用) │ 
└─────────────────┘ └───────────────────┘ └───────────────────┘ 
                               │ 
                               ▼ 
                        ┌───────────────────┐ 
                        │ nftables/iptables 
                        │ │ (防火墙) │ 
                        └─────────────────┘

四个二进制文件处理所有事情:

BinaryPurpose 功能openvpn-login包括:根据 API 验证用户凭据openvpn-connect;分配 IP 地址;根据组成员身份推送路由openvpn-disconnect;记录会话结束和流量统计信息;openvpn-firewall为每个用户生成 nftables/iptables 规则。

完整安装指南

步骤 1:安装 OpenVPN 管理器

选项 A:DEB 软件包(Debian/Ubuntu)

VERSION="1.0.1" 
wget https://github.com/tldr-it-stepankutaj/openvpn-mng/releases/download/v${VERSION}/openvpn-mng_${VERSION}_linux_amd64.deb 
sudo dpkg -i openvpn-mng_${VERSION}_linux_amd64.deb

选项 B:RPM 软件包(RHEL/AlmaLinux/Rocky)

VERSION="1.0.1" 
wget https://github.com/tldr-it-stepankutaj/openvpn-mng/releases/download/v${VERSION}/openvpn-mng_${VERSION}_linux_amd64.rpm 
sudo dnf install ./openvpn-mng_${VERSION}_linux_amd64.rpm

选项 C:Docker

docker pull tldrit/openvpn-mng:latest

步骤 2:配置数据库

# PostgreSQL 
sudo -u postgres psql 
CREATE USER openvpn WITH PASSWORD 'your-secure-password'; 
CREATE DATABASE openvpn_mng OWNER openvpn; 
\q

步骤 3:配置 OpenVPN 管理器

# 生成密钥
JWT_SECRET=$(openssl rand -hex 32) 
VPN_TOKEN=$(openssl rand -hex 32)
echo "JWT_SECRET: $JWT_SECRET" 
echo "VPN_TOKEN: $VPN_TOKEN"
# 编辑配置文件
sudo nano /etc/openvpn-mng/config.yaml

关键设置:

database:
  type: "postgres"
  host: "localhost"
  password: "your-db-password"
  database: "openvpn_mng"
auth:
  jwt_secret: "your-generated-jwt-secret"
api:
  vpn_token: "your-generated-vpn-token"
vpn:
  network: "10.90.90.0/24"
  server_ip: "10.90.90.1"

步骤 4:启动 OpenVPN 管理器

sudo systemctl enable --now openvpn-mng.service
# 验证
curl http://localhost:8080/

默认登录名:admin/ admin123— 请立即更改!

步骤 5:安装 OpenVPN 客户端

选项 A:DEB 软件包(Debian/Ubuntu)

VERSION="1.0.0" 
wget https://github.com/tldr-it-stepankutaj/openvpn-client/releases/download/v${VERSION}/openvpn-client_${VERSION}_linux_amd64.deb 
sudo dpkg -i openvpn-client_${VERSION}_linux_amd64.deb

选项 B:RPM 软件包(RHEL/AlmaLinux/Rocky)

VERSION="1.0.0" 
wget https://github.com/tldr-it-stepankutaj/openvpn-client/releases/download/v${VERSION}/openvpn-client_${VERSION}_linux_amd64.rpm 
sudo dnf install ./openvpn-client_${VERSION}_linux_amd64.rpm

选项 C:从源代码构建

git clone https://github.com/tldr-it-stepankutaj/openvpn-client.git 
cd openvpn-client 
make build-linux 
sudo make install

步骤 6:配置 OpenVPN 客户端

sudo mkdir -p /etc/openvpn/client 
sudo nano /etc/openvpn/client/config.yaml
api:
  base_url: "http://127.0.0.1:8080"
  token: "your-vpn-token-from-step-3"
  timeout: 10s
openvpn:
  session_dir: "/var/run/openvpn"
firewall:
  type: "nftables"
  nftables:
    rules_file: "/etc/nftables.d/vpn-users.nft"
    reload_command: "/usr/sbin/nft -f /etc/sysconfig/nftables.conf"

步骤 7:配置 OpenVPN 服务器

添加到您的 OpenVPN 服务器配置中:

# VPN network (must match OpenVPN Manager config)
server 10.90.90.0 255.255.255.0
topology subnet
# Authentication via OpenVPN Manager
username-as-common-name
auth-user-pass-verify /usr/bin/openvpn-login via-file
client-connect /usr/bin/openvpn-connect
client-disconnect /usr/bin/openvpn-disconnect
script-security 2

步骤 8:设置防火墙规则定时任务

# 创建初始规则
sudo mkdir -p /etc/nftables.d 
sudo touch /etc/nftables.d/vpn-users.nft 
sudo /usr/bin/openvpn-firewall
# 添加 cron 任务
echo "*/5 * * * * root /usr/bin/openvpn-firewall >> /var/log/openvpn-firewall.log 2>&1" | sudo tee /etc/cron.d/openvpn-firewall

步骤 9:重启 OpenVPN

sudo systemctl restart openvpn@server

这一切是如何协同运作的

  1. 用户使用用户名和密码连接
  2. openvpn-login使用 Manager API 验证凭据
  3. openvpn-connect获取用户的组和网络,然后推送路由
  4. 防火墙规则根据用户的组成员身份限制流量
  5. 会话在管理器数据库中进行跟踪。
  6. 管理员可在网页界面查看实时连接。
  7. openvpn-disconnect 会在用户断开连接时记录流量统计信息。

技术栈

OpenVPN 管理器:

  • Go + Gin 框架
  • GORM(PostgreSQL/MySQL)
  • JWT 身份验证
  • Bootstrap 5 Web UI

OpenVPN客户端:

  • Go
  • nftables/iptables 支持
  • 结构化日志记录(slog)

两者都编译成单个二进制文件,可以部署到任何地方。

接下来是什么?

计划功能:

  • LDAP/Active Directory 集成
  • 双因素身份验证
  • WireGuard 支持
  • 普罗米修斯指标
  • Terraform 提供程序

开始使用

OpenVPN 管理器:

OpenVPN客户端:

这两个项目均采用 Apache 2.0 许可协议。欢迎贡献代码!

如果您厌倦了传统的 VPN 用户管理方式,不妨试试这个方法。如果您觉得它有用,请在 GitHub 上点个星标,非常感谢!

原文:https://medium.com/@stepan_95301/openvpn-manager-a-complete-open-source-solution-for-enterprise-vpn-management-fe214b8f4627