十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

EOS cleos wallet unlock 命令完全指南:解锁钱包的原理、用法与源码解析

EOS cleos wallet unlock 命令完全指南:解锁钱包的原理、用法与源码解析 区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载本篇指南聚焦于 EOS 开源智能合约平台中cleos wallet unlock命令的完整使用与底层实现。该命令用于将 keosd 钱包守护进程中处于锁定状态的钱包解锁使其私钥可用于交易签名。读完本文你将掌握解锁命令的完整语法与交互式用法、密码验证与密钥解密的底层机制、常见异常的处理方式以及通过--unlock-timeout等参数安全管理解锁状态的最佳实践。命令概述解锁钱包是交易签名的前提在 EOS 生态中钱包Wallet由 keosd 守护进程统一管理负责安全存储私钥。钱包默认处于锁定状态锁定状态下 keosd 无法读取私钥、无法为交易签名。cleos wallet unlock的作用就是向 keosd 提供创建钱包时生成的密码验证通过后将钱包内加密存储的私钥解密加载到内存使后续cleos push transaction等签名操作可以正常进行。该命令的官方定义位于 unlock.mdUnlocks a wallet解锁一个钱包其关键特征是无位置参数Positionals: None所有输入都通过选项Options提供必须提供密码密码来自cleos wallet create创建钱包时的输出输出固定格式成功时输出Unlocked: wallet-name。完整语法与参数说明cleos wallet unlock的语法如下cleos wallet unlock [OPTIONS]选项参数表选项类型必填说明-n, --nameTEXT否要解锁的钱包名称默认钱包名为default--passwordTEXT否钱包创建cleos wallet create时返回的密码该命令没有位置参数。从 CLI 定义源码 main.cpp 可以看到// unlock wallet string wallet_pw; auto unlockWallet wallet-add_subcommand(unlock, localized(Unlock wallet)); unlockWallet-add_option(-n,--name, wallet_name, localized(The name of the wallet to unlock)); unlockWallet-add_option(--password, wallet_pw, localized(The password returned by wallet create))-expected(0, 1); unlockWallet-callback([wallet_name, wallet_pw] { prompt_for_wallet_password(wallet_pw, wallet_name); fc::variants vs {fc::variant(wallet_name), fc::variant(wallet_pw)}; call(wallet_url, wallet_unlock, vs); std::cout localized(Unlocked: ${wallet_name}, (wallet_name, wallet_name)) std::endl; });这段代码揭示了三个重要细节--password是可选选项expected(0, 1)当命令行未显式给出密码时cleos 会转入交互式输入默认钱包名wallet_name在命令解析中带有默认值default因此-n未指定时解锁的是名为default的钱包最终调用链cleos 通过 HTTP 调用 keosd 的wallet_unlockRPC 端点详见 wallet_api_plugin.cpp成功后才打印Unlocked: name。前置条件钱包必须已经创建解锁操作面向的是已经存在的钱包文件。钱包创建时 keosd 会生成一个强随机密码并把私钥加密后写入钱包文件。相关流程见 how-to-create-a-wallet.md 与 create.mdcleos wallet create -n second-wallet创建成功后会输出类似如下的密码务必安全保存keosd 不会以明文再次提供Creating wallet: second-wallet Save password to use in the future to unlock this wallet. Without password imported keys will not be retrievable. PW5Ji6JUrLjhKAVn68nmacLxwhvtqUAV18J7iycZppsPKeoGGgBEw从wallet_manager::create的实现wallet_manager.cpp可以看到创建流程会生成密码、初始化soft_wallet、设置密码并立即保存钱包文件最终将密码作为唯一返回值交还用户。这意味着解锁钱包所必需的密码只能来自创建时刻的输出一旦丢失将无法解锁也无法取回钱包中的私钥。实战用法用法一显式指定钱包名与密码官方示例以下命令解锁名为second-wallet的钱包示例出自 unlock.mdcleos wallet unlock -n second-wallet --password PW5Ji6JUrLjhKAVn68nmacLxwhvtqUAV18J7iycZppsPKeoGGgBEw输出Unlocked: second-wallet用法二交互式输入密码推荐不带--password选项时cleos 会提示输入密码cleos wallet unlock -n second-wallet password:输入密码后回车即完成解锁输出同样为Unlocked: second-wallet。交互模式的实现位于 main.cpp 的prompt_for_wallet_passwordvoid prompt_for_wallet_password(string pw, const string name) { if(pw.size() 0 name ! SecureEnclave) { std::cout localized(password: ); fc::set_console_echo(false); // 关闭终端回显 std::getline( std::cin, pw, \n ); fc::set_console_echo(true); } }这里有两个值得注意的细节输入过程中终端关闭了回显密码不会显示在屏幕上这是明文传递密码时的更安全替代方案特殊钱包SecureEnclavemacOS 安全隔区钱包见 how-to-attach-a-yubihsm-hard-wallet.md不会走交互式密码提示因为它由系统安全硬件托管。用法三解锁默认钱包省略-n时解锁名为default的钱包cleos wallet unlock --password PW5Ji6JUrLjhKAVn68nmacLxwhvtqUAV18J7iycZppsPKeoGGgBEw解锁后验证解锁成功后可通过cleos wallet list确认状态——已解锁钱包名后会带*标记Wallets: [ second-wallet * ]该标记逻辑在wallet_manager::list_walletswallet_manager.cpp中实现is_locked()为假时追加 *。输出与错误场景解读成功输出Unlocked: second-wallet密码错误Error 3120006: Invalid password for wallet: second-wallet该异常由soft_wallet::unlock抛出。从源码wallet.cpp看密码验证过程为void soft_wallet::unlock(string password) { try { FC_ASSERT(password.size() 0); auto pw fc::sha512::hash(password.c_str(), password.size()); vectorchar decrypted fc::aes_decrypt(pw, my-_wallet.cipher_keys); auto pk fc::raw::unpackplain_keys(decrypted); FC_ASSERT(pk.checksum pw); my-_keys std::move(pk.keys); my-_checksum pk.checksum; } EOS_RETHROW_EXCEPTIONS(chain::wallet_invalid_password_exception, ...) }即对输入密码做 SHA-512 哈希作为 AES 密钥解密钱包文件中的cipher_keys密文再反序列化为明文密钥并校验校验和checksum。任何一步不匹配都会抛出wallet_invalid_password_exception错误码 3120006。注意FC_ASSERT(password.size() 0)意味着空密码会被直接拒绝。钱包已解锁Error 3120008: Wallet is already unlocked: second-wallet重复解锁已解锁的钱包会抛出wallet_unlocked_exception对应wallet_manager::unlockwallet_manager.cpp中的检查逻辑。钱包不存在当指定名称的钱包尚未被 keosd 加载未执行过cleos wallet open时wallet_manager::unlock会自动调用open()尝试加载钱包文件wallet_manager.cppL177-L179void wallet_manager::unlock(const std::string name, const std::string password) { check_timeout(); if (wallets.count(name) 0) { open( name ); // 自动打开钱包文件 } auto w wallets.at(name); if (!w-is_locked()) { EOS_THROW(chain::wallet_unlocked_exception, Wallet is already unlocked: ${w}, (w, name)); return; } w-unlock(password); }若钱包文件本身不存在则open阶段会抛出wallet_nonexistent_exceptionUnable to open file。这意味着解锁命令通常无需先手动open但理解open与unlock的分工前者加载文件、后者解密密钥有助于排查问题参见 open.md。底层原理从 cleos 到 keosd 的完整调用链解锁操作的完整链路可以概括为cleos 解析参数-n/--name与--password被收集若密码为空则交互式提示main.cppHTTP RPC 调用cleos 将[wallet_name, wallet_pw]打包为fc::variants调用 keosd 的wallet_unlock接口wallet_api_plugin.cppCALL_WITH_400(wallet, wallet_mgr, unlock, INVOKE_V_R_R(wallet_mgr, unlock, std::string, std::string), 200),keosd 侧校验与解密wallet_manager::unlock执行超时检查、钱包加载与状态检查随后委托soft_wallet::unlock完成 SHA-512 哈希 → AES 解密 → 校验和验证 → 私钥装载wallet.cpp结果回传成功则 keosd 返回 200cleos 打印Unlocked: name失败则抛出对应异常并由 cleos 展示错误码。从代码结构看钱包抽象层定义于 wallet_api.hppunlock(password)是纯虚接口实际实现有三种软件钱包soft_walletwallet.cpp、macOS 安全隔区钱包se_walletse_wallet.cpp与 YubiHSM 硬件钱包yubihsm_walletyubihsm_wallet.cpp。普通场景下解锁的是软件钱包其unlock语义为解密内存中的密钥而硬件钱包的解锁通常只是校验 PIN/口令以启用硬件签名能力。安全要点解锁状态的生命周期管理解锁后私钥以明文形式驻留在 keosd 进程内存中因此 keosd 提供了自动重新锁定机制。相关配置定义在 wallet_plugin.cppkeosd 配置项默认值说明wallet-dir.钱包文件存放目录绝对路径或相对应用数据目录的路径unlock-timeout900钱包解锁后的超时秒数默认 900 秒即 15 分钟钱包在指定秒数无活动后自动锁定。活动定义为任意钱包命令如list-walletsyubihsm-urlhttp://localhost:12345YubiHSM 连接器地址使用硬件钱包时生效yubihsm-authkey无启用 YubiHSM 支持时使用的 Authkey 编号unlock-timeout的校验与生效逻辑wallet_plugin.cppif (options.count(unlock-timeout)) { auto timeout options.at(unlock-timeout).asint64_t(); EOS_ASSERT(timeout 0, chain::invalid_lock_timeout_exception, Please specify a positive timeout ${t}, (t, timeout)); std::chrono::seconds t(timeout); wallet_manager_ptr-set_timeout(t); }底层定时检查在wallet_manager的check_timeout中执行wallet_manager.cpp每次钱包操作都会比较当前时间与超时阈值一旦超时则调用lock_all()将全部钱包重新锁定。据此给出安全实践建议优先使用交互式输入而非--password明文参数--password会出现在 shell 历史与进程列表中ps可见存在泄露风险合理设置unlock-timeout生产环境中可缩短超时如--unlock-timeout 120减少私钥驻留内存的窗口开发环境保持默认 900 秒即可任务结束后手动锁定使用cleos wallet lock -n name或cleos wallet lock_all立即锁定参见 lock.md 与 lock_all.md妥善保管创建密码密码仅在cleos wallet create时输出一次丢失后钱包无法解锁、私钥无法恢复钱包文件目录权限钱包文件默认扩展名.wallet包含 AES 加密的密钥数据应通过wallet-dir指向受保护目录。常见问题排查Q1解锁时报Wallet is already unlocked说明钱包当前已是解锁状态cleos wallet list会显示带*的钱包名。可先cleos wallet lock -n name再重新解锁。Q2提示Invalid password密码与创建时不匹配。注意密码以PW5...开头且区分大小写建议直接复制创建时的输出。Q3解锁后签名仍报错解锁只是让 keosd 可以读取私钥签名还需要钱包中已导入对应账户的私钥。请用cleos wallet keys查看已解锁钱包的公钥用cleos wallet list确认钱包处于解锁状态若缺少密钥需执行cleos wallet import见 import.md 与 how-to-import-a-key.md。Q4如何查看钱包当前是锁定还是解锁状态执行cleos wallet list钱包名后带*表示已解锁list_wallets源码见 wallet_manager.cpp。Q5需要解锁的密钥可用于哪些操作解锁后 keosd 即可用钱包内私钥为交易签名例如cleos push transaction、cleos multisig等需要签名的命令同时cleos wallet private_keys可以明文导出私钥见 private_keys.md因此解锁状态下的钱包是敏感对象。延伸阅读钱包生命周期完整操作创建 create.md、打开 open.md、锁定 lock.md 与 lock_all.md、查看列表 list.md密钥管理创建密钥对 create_key.md、导入私钥 import.md、查看公钥 keys.md、导出私钥 private_keys.mdkeosd 使用与安全10_usage.md、20_security.md、钱包规范 35_wallet-specification.md钱包命令总览wallet 命令索引源码入口CLI 定义 programs/cleos/main.cpp、钱包管理 plugins/wallet_plugin/wallet_manager.cpp、软件钱包实现 plugins/wallet_plugin/wallet.cpp、keosd 插件配置 plugins/wallet_plugin/wallet_plugin.cpp赞分享区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载相关推荐t3code 仓库中 Effect CLI 的 CliConfig 服务作用域化定制内置全局标志t3code 仓库中 Effect CLI 的 CliConfig 服务作用域化定制内置全局标志 本篇技术指南聚焦于 t3code 仓库内 effect sm区块链使用 keosd 创建钱包EOS 项目 cleos wallet create 完整实战指南使用 keosd 创建钱包EOS 项目 cleos wallet create 完整实战指南 导读 本文以 EOS 开源仓库 eo/eos 官方文档 ho区块链拔掉Windows AI的刺RemoveWindowsAI彻底清理指南拔掉Windows AI的刺RemoveWindowsAI彻底清理指南 任务管理器里那个偷偷吃 CPU 的 Copilot 进程是不是又烦到你了Remov区块链上一篇MAA明日方舟助手快速上手一键长草与自动化任务完整指南下一篇终极指南如何免费无限重置Navicat Mac版试用期创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表