Cosmos SDK 密钥环(Keyring)完整指南:后端选型、配置与密钥管理实战
区块链【免费下载链接】cosmos-sdkFramework for building performant, customizable blockchains with native interoperability项目地址https://gitcode.com/gh_mirrors/co/cosmos-sdk点击查看免费下载本指南以 Cosmos SDK 官方文档《Setting up the keyring》为骨架系统讲解 SDK v0.38.0 之后引入的新版密钥环keyring的存储后端os、file、pass、kwallet、keyctl、test、memory及其适用场景并结合当前仓库源码crypto/keyring/keyring.go、client/keys/add.go剖析底层实现。读完本文你将掌握如何在运行节点前配置验证人密钥、通过keys子命令添加/查询/删除/导入导出密钥、用环境变量与client.toml切换后端并理解不同后端在加密强度与适用环境上的取舍。keyring 是什么为什么运行节点前必须先配置它密钥环keyring是 Cosmos SDK 应用持有的私钥/公钥对的统一存储与访问层。所有需要与节点交互的签名动作——例如验证人在出块时对区块签名、用户在发送交易时对消息签名——都必须先通过 keyring 取得对应私钥。以最典型的场景为例运行区块链节点前必须先配置好验证人密钥validator key否则节点无法正确签名区块。私钥可以存放在多种位置这些位置统称为后端backend例如普通文件或操作系统自带的凭据存储服务。从 v0.38.0 版本开始Cosmos SDK 引入了全新的 keyring 实现提供了一套安全地管理加密密钥的命令集合并支持多种存储后端需要注意的是部分后端并非在所有操作系统上可用例如keyctl仅支持 Linux。在源码层面keyring 的所有后端常量定义于 crypto/keyring/keyring.goconst ( BackendFile file BackendOS os BackendKWallet kwallet BackendPass pass BackendTest test BackendMemory memory )keyctl后端常量仅存在于 Linux 专属文件 crypto/keyring/keyring_linux.go 中这正对应部分后端并非在所有操作系统上可用的说法。可用后端总览后端存储位置是否加密是否需要密码适用环境os操作系统凭据子系统Keychain、Credentials Management API、libsecret/kwallet/keyctl是由系统策略决定有桌面环境的日常使用默认值file应用配置目录内的加密文件是每次访问均需输入无头headless服务器、脚本化操作passgpg加密文件由pass工具管理是依赖 gpg-agent 缓存无头服务器kwalletKDE Wallet Manager是由 KDE 钱包策略决定KDE 桌面环境keyctlLinux 内核密钥保留服务内存是无受内核权限控制Linux 平台仅限test应用配置目录下keyring-test子目录否明文无仅测试禁止生产memory进程内存是仅在内存中无仅测试/瞬时使用进程退出即丢失后端分发逻辑可在 crypto/keyring/keyring.go 的newKeyringGeneric函数中看到它针对每个后端调用keyring.Open构造底层存储未知后端名则返回ErrUnknownBackend错误。os后端默认选项与操作系统集成os后端依赖操作系统特定的凭据子系统来安全地处理密钥存储典型的系统凭据组件会按照用户密码策略负责密码提示、私钥存储与用户会话管理。各主流操作系统的密码管理器对应关系如下macOSKeychain钥匙串WindowsCredentials Management API凭据管理 APIGNU/LinuxlibsecretGNOME 生态kwalletKDE 生态keyctlLinux 内核密钥管理以 GNOME 为默认桌面环境的发行版通常自带 Seahorse它实际上是libsecret的一个便捷前端KDE 系发行版则常配套 KDE Wallet Manager是kwallet的客户端。keyctl则是一个利用 Linux 内核安全密钥管理系统、把密钥安全保存在内存中的后端。os是默认后端因为操作系统自带的凭据管理器面向用户最常见的使用习惯而设计能够在不牺牲安全性的前提下提供舒适的使用体验。这一点在代码中也有直接体现默认后端常量定义于 client/flags/flags.goDefaultKeyringBackend keyring.BackendOS同时 client/config/config.go 中client.toml的默认值同样为os。在源码实现上os后端配置crypto/keyring/keyring.go设置了KeychainTrustApplication: true即允许应用信任自身的钥匙串条目。对于无头headless环境——例如远程服务器、CI 流水线——推荐使用file和pass后端因为这两个后端不依赖图形化的桌面凭据组件。file后端加密文件存储与脚本化密码输入file后端与 v0.38.1 之前使用的 keybase 实现更为接近它把密钥环以加密形式存储在应用配置目录内具体是home/keyring-file子目录见 crypto/keyring/keyring.go 中newFileBackendKeyringConfig的FileDir设置。该后端每次访问 keyring 都会请求密码而一条命令内部可能触发多次访问从而出现多次密码提示。如果使用 bash 脚本以file后端执行命令可以采用如下格式一次性应答多次提示# 假设 KEYPASSWD 已在环境中设置 $ gaiacli config keyring-backend file # 使用 file 后端 $ (echo $KEYPASSWD; echo $KEYPASSWD) | gaiacli keys add me # 多次提示两行各应答一次 $ echo $KEYPASSWD | gaiacli keys show me # 单次提示注意gaiacli是 GaiaCosmos Hub二进制的历史示例名称。使用 Cosmos SDK 构建自己的应用时请把二进制名替换为你自己的可执行文件本仓库的测试/教学应用为simd。提示首次向空 keyring 添加密钥时系统会要求输入两次密码进行确认。该逻辑由 crypto/keyring/keyring.go 的newRealPrompt实现首次设置时会生成 bcrypt 密码哈希写入keyhash文件后续访问则用bcrypt.CompareHashAndPassword校验输入密码错误最多允许尝试 3 次maxPassphraseEntryAttempts 3见 crypto/keyring/keyring.go超过即返回ErrMaxPassPhraseAttempts。pass后端GPG 加密的密码仓库pass后端借助 pass 工具管理磁盘上密钥敏感数据与元数据的加密。密钥被存放在应用专属目录内的gpg 加密文件中。pass适用于大多数 UNIX 系操作系统和 GNU/Linux 发行版安装方式请查阅其手册。pass使用 GnuPG 进行加密。gpg在执行时会自动唤起gpg-agent守护进程由其负责 GnuPG 凭据的缓存。如需调整凭据 TTL、口令短语过期等缓存参数请查阅gpg-agent手册页。密码仓库在首次使用前必须初始化pass init GPG_KEY_ID将GPG_KEY_ID替换为你的 GPG 密钥 ID——可以使用个人 GPG 密钥也可以专门为加密该密码仓库另配一把密钥。源码实现上pass后端在 crypto/keyring/keyring.go 中通过PassPrefix: keyring-%spassKeyringPrefix前缀中填入应用名把各应用的数据隔离在不同pass目录下。kwallet后端KDE 桌面集成kwallet后端使用KDE Wallet Manager它预装于以 KDE 为默认桌面环境的 GNU/Linux 发行版中。其详细 API 信息可查阅 KWallet API 文档。实现上crypto/keyring/keyring.go该后端将ServiceName固定为kdewallet并把应用名作为KWalletAppID传入。keyctl后端Linux 内核密钥保留服务Kernel Key Retention Service内核密钥保留服务是相对较新加入 Linux 内核的安全组件允许把密码、私钥、认证令牌等敏感加密数据安全地保存在内存中。keyctl后端仅限 Linux 平台使用。其实现位于 crypto/keyring/keyring_linux.go默认密钥作用域scope为processkeyctlDefaultScope见 crypto/keyring/keyring_linux.go并可通过KeyctlScopeUser、KeyctlScopeUserSession、KeyctlScopeSession、KeyctlScopeProcess、KeyctlScopeThread等选项调整为其他内核密钥作用域。test与memory后端仅供测试test后端是file后端的无密码变体密钥以明文形式存储于磁盘home/keyring-test子目录密码函数固定返回test见 crypto/keyring/keyring.go。memory后端将密钥保存在内存中程序退出后密钥立即删除对应 crypto/keyring/keyring.go 中的NewInMemory底层使用keyring.NewArrayKeyring。两者都仅供测试目的使用严禁用于生产环境。此外client/context.go 的NewKeyringFromBackend在Simulate模拟/预估交易模式下会强制把后端切换为memory从而保证模拟执行不触碰真实密钥。通过环境变量设置后端除了在每条命令后追加--keyring-backend标志还可以用环境变量全局指定后端其命名规则为BINNAME_KEYRING_BACKEND二进制名大写、连字符替换为下划线。例如若二进制名为gaia-v5则export GAIA_V5_KEYRING_BACKENDpass若使用本仓库的simd二进制则对应SIMD_KEYRING_BACKEND。--keyring-backend标志的取值在白名单内os|file|kwallet|pass|test|memory定义于 client/flags/flags.go 的AddKeyringFlags同一函数还提供了--keyring-dir标志用于覆盖默认的home目录作为 keyring 存储位置。这些标志也可持久化写入client.toml配置文件见 client/config/config.go 的KeyringBackend字段与 client/config/toml.go。向 keyring 添加密钥keys add使用 Cosmos SDK 开发的应用都会自带keys子命令树。本教程使用simdCLI——一个基于 Cosmos SDK 构建、用于测试和教学的应用对应 simapp 目录。前提请确保你能构建自己的二进制并把下文代码片段中的simd替换为你自己的二进制名。simd keys查看keys命令的完整帮助simd keys [command] --help查看某个子命令的详细说明。创建新密钥使用add子命令并传入key_name参数。本教程全程使用test后端并将新密钥命名为my_validator该密钥将在后续章节中作为验证人密钥使用$ simd keys add my_validator --keyring-backend test # 将生成的地址存入变量供后续使用 MY_VALIDATOR_ADDRESS$(simd keys show my_validator -a --keyring-backend test)这条命令会完成以下工作生成一条全新的 24 词助记词mnemonic。源码中熵大小为 256 位mnemonicEntropySize 256见 client/keys/add.gokeyring 内部defaultEntropySize同样为 256见 crypto/keyring/types.go对应 BIP-39 的 24 个英文单词将密钥持久化到指定后端本例为test输出密钥对的地址、公钥等信息。如果该密钥对将用于持有价值资产代币务必把助记词抄写在安全的地方——它是你忘记密码后恢复账户的唯一凭据。keys add还支持大量实用标志完整定义见 client/keys/add.go标志说明--algo/--key-type签名算法默认secp256k1也支持ed25519等--recover从已有助记词恢复密钥而非新建--interactive/-i交互式提示输入 BIP39 口令与助记词--no-backup不打印助记词防止他人窥屏--hd-path手动指定 BIP32 HD 派生路径覆盖 BIP44 配置--coin-typeHD 派生的 coin type默认取 types/config.go 中 SDK 配置值通常为 118--accountHD 派生账户号≤ 2147483647--indexHD 派生地址索引≤ 2147483647--multisig用若干已存密钥名构造 legacy 多签公钥如--multisig k1,k2,k3--multisig-thresholdK-of-N 多签所需最少签名数--nosort多签密钥不按地址排序按给定顺序取用--pubkey/--pubkey-base64以 JSON / base64 形式导入任意公钥保存为 offline 密钥--ledger在 Ledger 硬件设备上保存本地引用--dry-run生成/恢复密钥但不写入本地存储--source从文件导入助记词需与--recover或--interactive联用--output输出格式text或json--hd-path未指定时代码会用hd.CreateHDPath(coinType, account, index)生成默认 BIP44 路径client/keys/add.go。签名算法默认secp256k1可选ed25519默认情况下keyring 生成secp256k1密钥对也可通过--algo ed25519创建ed25519密钥。同一个 keyring 可以同时持有两种类型的密钥Cosmos SDK 的x/auth模块原生支持这两种公钥算法。从当前仓库的 crypto/hd/algo.go 可以看到更完整的算法族secp256k1、ed25519、bls12_381、multi以及 NIST ML-DSA-65FIPS 204抗量子签名方案ml_dsa_65。其中ed25519与bls12_381目前不用于终端用户钱包/硬件密钥ml_dsa_65支持软件 keyring 生成账户密钥但不支持 Ledger 硬件钱包。密钥环默认支持列表SupportedAlgos: {hd.Secp256k1, hd.MlDsa65}在 crypto/keyring/keyring.go 中初始化。密钥管理的完整命令面keys命令树注册于 client/keys/root.go除add外还包括keys list列出 keyring 中全部密钥keys show按名称或地址查询密钥信息支持-a仅输出地址、-p仅输出公钥、--bech acc|val|cons切换 bech32 前缀编码、--qrcode以二维码显示地址、--device在 Ledger 设备上显示地址等标志详见 client/keys/show.gokeys delete删除密钥keys rename重命名密钥内部通过导出/删除/导入完成见 crypto/keyring/keyring.gokeys export/keys import以 ASCII armor 格式导出/导入口令加密的私钥、公钥keys import-hex导入 hex 编码的私钥支持0x前缀见 crypto/keyring/keyring.gokeys parse解析 bech32 地址字符串keys mnemonic生成随机助记词keys migrate执行旧版密钥格式迁移keys list-key-types列出支持的密钥类型。源码层面的实现细节每条密钥实际写入两条记录writeRecordcrypto/keyring/keyring.go会为每个密钥同时写入两个条目键uid.info数据为序列化后的 protobuf 密钥记录Record键地址hex.address数据为密钥名。这样设计是为了既能按名称也能按地址查询密钥对应Key与KeyByAddress两个方法KeyByAddress先通过地址索引取回密钥名再读取.info条目crypto/keyring/keyring.go。从 amino 到 protobuf 的自动迁移Migrator接口crypto/keyring/keyring.go与migrate函数crypto/keyring/keyring.go实现了旧版 amino 序列化密钥到新 protobuf 格式的自动转换读取条目后先尝试 protobuf 解码失败则回退到 amino 解码转换成功后把新格式写回 keyring 并打印Successfully migrated key name.。这意味着旧版本创建的文件型 keyring 在新版本中打开时会自动完成格式升级无需手动操作。Keyring接口统一能力所有后端最终都封装为实现了 crypto/keyring/keyring.go 中Keyring接口的keystoreBackend返回后端名、List/Key/KeyByAddress查询、Delete/Rename管理、NewMnemonic/NewAccount/SaveLedgerKey/SaveOfflineKey/SaveMultisig生成与导入、Sign/SignByAddress签名、Import*/Export*导入导出以及MigrateAll迁移。上层 CLI如client/keys只依赖该接口因此切换后端对用户命令完全透明。小结与选择建议日常开发机 / 桌面环境使用默认的os后端借助系统凭据管理器获得顺手且安全的使用体验服务器 / 无头环境优先file加密、可控、脚本友好或passGPG 加密 gpg-agent 缓存KDE 桌面可选kwalletLinux 服务器可选keyctl内核内存存储本地开发测试 / 自动化测试可使用test明文磁盘或memory进程内、退出即失在一条命令内可通过--keyring-backend指定后端全局可用BINNAME_KEYRING_BACKEND环境变量或 client.toml 中的keyring-backend配置项持久化选择。配置好 keyring 后即可进入下一步参考 运行节点指南 启动你的 Cosmos SDK 节点并在启动前用本文的方法完成验证人密钥的生成与配置。赞分享区块链【免费下载链接】cosmos-sdkFramework for building performant, customizable blockchains with native interoperability项目地址https://gitcode.com/gh_mirrors/co/cosmos-sdk点击查看免费下载相关推荐Cosmos SDK 密钥环(Keyring)配置与使用指南Cosmos SDK 密钥环 Keyring 配置与使用指南 密钥环概述 在Cosmos SDK构建的区块链应用中密钥环 Keyring 是管理公私钥对的核心区块链Kohya Trainer 完全指南从零开始掌握 Stable Diffusion 微调技术Kohya Trainer 完全指南从零开始掌握 Stable Diffusion 微调技术 Kohya Trainer 是一个专为 Stable DiffuVercel AI SDK终极配置指南环境变量与API密钥安全最佳实践 ️Vercel AI SDK终极配置指南环境变量与API密钥安全最佳实践 ️ Vercel AI SDK是一个强大的TypeScript AI工具包帮助开人工智能AI 应用AI Agent工具调用MCP Clients上一篇Ant Design Form.List 动态表单嵌套字段实战基于 field.name 构建可扩展的动态表单下一篇CANN ops-nn Tanh梯度算子创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Flask博客开发实战:从项目结构到部署避坑指南

Flask博客开发实战:从项目结构到部署避坑指南

简介:这是一份基于Python Flask框架搭建简易个人博客网站的完整源码与学习资料包。内容覆盖应用初始化、路由视图、Jinja2模板渲染、SQLAlchemy数据库操作以及用户登录认证等核心知识点,适合Web开发初学者和希望系统学习Flask实践的人群。资源共19个文件…

2026/10/12 1:44:57 阅读更多 →
汇编上机实验全攻略:从Debug单步调试到子程序设计

汇编上机实验全攻略:从Debug单步调试到子程序设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:44:57 阅读更多 →
kgateway 策略状态与合并上报:基于 Attached 条件与 MergeOrigins 元数据的诊断体系

kgateway 策略状态与合并上报:基于 Attached 条件与 MergeOrigins 元数据的诊断体系

API网关云原生微服务 【免费下载链接】kgateway The Cloud-Native API Gateway and AI Gateway 项目地址: https://gitcode.com/gh_mirrors/kg/kgateway 点击查看 免费下载 kgateway(The Cloud-Native API Gateway and AI Gateway)的策略 CR…

2026/10/12 1:44:57 阅读更多 →

最新新闻

open-code-review 代码评审实战:从设计思路到落地流程的完整指南

open-code-review 代码评审实战:从设计思路到落地流程的完整指南

1. 从标题说起:open-code-review 到底在解决什么问题第一次看到 open-code-review 这个标题,我脑子里蹦出来的不是某个具体工具,而是一整套工作流。代码评审这件事,但凡在团队里写过几年代码的人都懂——它既是质量守门员&#xf…

2026/10/12 7:59:36 阅读更多 →
open-code-review:构建可度量、可追溯的代码评审工程实践

open-code-review:构建可度量、可追溯的代码评审工程实践

1. 项目缘起与核心定位第一次听到“open-code-review”这个名字,我的直觉是:这大概率是一个把代码评审流程开放化、工具化的项目。事实也确实如此。它不是一个单纯的代码托管平台,也不是一个只服务于某个团队的内部脚本,而是一套围…

2026/10/12 7:59:36 阅读更多 →
Web开发避坑指南:盘点那些“看起来很香”却容易后悔的技术路线

Web开发避坑指南:盘点那些“看起来很香”却容易后悔的技术路线

我入行Web开发差不多八年,踩过的坑比我写过的接口还多。如果非要总结这八年最大的教训,就一句话:市面上很多“看起来很香”的Web技术,学完大概率会后悔。后悔的不是技术本身没用,而是当时的我把时间花错了地方。你肯定…

2026/10/12 7:59:36 阅读更多 →
AnyPS5串流方案:跨平台主机游戏低延迟传输技术解析

AnyPS5串流方案:跨平台主机游戏低延迟传输技术解析

1. 从“AnyPS5”这个标题说起:它到底想解决什么问题 第一次看到“AnyPS5”这个标题,我脑子里冒出来的第一个念头是:这大概率不是一个官方项目,而是一个带着强烈个人色彩的工具型命名。为什么这么说?因为“Any”这个前缀…

2026/10/12 7:59:36 阅读更多 →
Cursor完全使用指南:从入门到精通的AI编程助手与TaoToken配置实践

Cursor完全使用指南:从入门到精通的AI编程助手与TaoToken配置实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 7:59:36 阅读更多 →
微信点餐小程序全栈开发实战:从Spring Boot后端到扫码支付

微信点餐小程序全栈开发实战:从Spring Boot后端到扫码支付

1. 项目概述“微信点餐管理系统”这几个字,这两年我见得太多了。从大作业到毕业设计,从餐饮店老板私活到小程序外包项目,凡是涉及“扫码点餐”的,几乎都绕不开这套东西。它本质上就是一套把传统纸质菜单、服务员点单、收银台结算全…

2026/10/12 7:58:35 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →