
OpenHuman 内置多链钱包解析非托管密钥托管与 prepare → confirm → execute 转账安全模型【免费下载链接】openhumanOpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.项目地址: https://gitcode.com/GitHub_Trending/op/openhumanOpenHuman 的 Rust 内核内置了一个刻意保持最小化的本地多链加密钱包它管理由单一恢复短语recovery phrase派生出的每链一个账户读取余额并仅对原生币发送和少量代币转账运行严格的prepare → confirm → execute三步流程。本文以 gitbooks/features/wallet.md 为骨架结合仓库源码 src/openhuman/web3/wallet 展开讲解读完你将掌握钱包的密钥托管与加密边界、支持的链与资产范围、完整的上手配置流程、RPC 可覆写机制以及防止 Agent 静默花费资金的引号quote绑定与审批机制。设计定位基础、保守、绝不出网钱包模块的设计哲学可以用三个关键词概括基础basic、非托管non-custodial、本地local。它的职责被严格限定为密钥/账户管理 最原始的上链操作密钥与账户管理onboarding、恢复短语加密存储、每链账户派生原生币发送与少量代币转账ERC-20 / BEP-20 / SPL / TRC-20只读的余额、网络默认值、资产目录、链就绪状态查询。而更高层的 DeFi 能力Swap、跨链桥、通用合约/DApp 调用不属于钱包的 Agent 或 RPC 面它们位于独立的web3模块中并基于钱包提供的 crate 内部原语sign_and_broadcast_evm/sign_and_broadcast_solana构建见 src/openhuman/web3/wallet/README.md 与 src/openhuman/web3/wallet/execution.rs。整个钱包最重要的安全属性是签名与广播完全在核心进程内、由解密后的恢复短语完成私钥永不离开设备、永不穿越网络。钱包模块不发布/订阅任何DomainEvent与聊天的上下文耦合仅通过任务局部的approval::APPROVAL_CHAT_CONTEXT完成见 README Events 一节这进一步缩小了攻击面。支持的链与代币标准设置时每条链恰好派生一个账户。EVM 用一个账户横跨六个网络其余链各自独立。只有下表列出的标准支持转账其他操作Swap、任意合约调用不在钱包范围内。链网络原生币代币标准说明EVMEthereum、Base、Arbitrum、Optimism、Polygon、BNB ChainETH / BNB / POL 等ERC-20BNB Chain 上为 BEP-20六个网络共享同一个Evm账户按请求选择网络默认 Ethereum 主网EIP-1559 / 类型化交易签名Bitcoin主网BTC无P2WPKH原生 SegWit拒绝代币转账余额/广播走 Esplora RESTSolana主网 / devnet取决于 RPCSOLSPLed25519 签名支持原生 SPL 代币转账Tron主网TRXTRC-20TronGrid REST 完成原生 TRC-20 转账源码层面的对应WalletChain枚举定义了Evm / Btc / Solana / Tron四个变体ops_part_01.rs而EvmNetwork枚举defaults.rs将六个网络参数化到同一个WalletChain::Evm上并各自携带chain_idEthereum1、Base8453、Arbitrum42161、Optimism10、Polygon137、BSC56。内置资产目录除原生资产外还包含各链常见稳定币EVM每网络内置 USDCBSC 上为 18 位小数的 BEP-20 USDC/USDTEthereum 主网额外内置 USDT、DAI、WETH见 defaults.rsSolanaUSDCSPL mint 随主网/devnet 集群切换见 defaults.rsTronUSDTTRC-20合约TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t。上手设置与恢复短语setup是一个全有或全无的原子操作它一次性持久化同意标记consent flag、助记词词数、设置来源generated/imported、每链恰好一个派生账户、以及加密后的恢复短语。合法的 BIP-39 助记词词数为12、15、18、21、24该列表硬编码在 ops_part_01.rs 的VALID_MNEMONIC_WORD_COUNTS中并由validate_setup强制校验ops_part_01.rs。validate_setup还会强制以下规则必须显式授予consent_granted: true必须提供非空的加密助记词材料每个账户都必须有非空的地址与派生路径四条链EVM/BTC/Solana/Tron每条必须恰好一个账户。setup是幂等的若钱包已配置且未传force: true会拒绝覆盖并返回wallet is already configured; pass forcetrue to overwriteops_part_01.rs。前端需在覆盖前显式征得用户确认。恢复短语是唯一秘密。钱包将每链账户地址可安全展示与秘密材料分开存储只有加密短语能重建私钥。wallet_statusRPC 返回configured / onboarding_completed / consent_granted / secret_stored / source / mnemonic_word_count / accounts / updated_at_ms等字段见 ops_part_01.rs可安全用于展示。密钥托管与安全边界钱包非托管且本地不存在任何服务端密钥托管。源码将安全模型落实为五条具体机制恢复短语始终加密存储。落盘前先经核心encryption域加密链签名器仅在签名时调用decrypt_secret解密chains/evm.rs。首选存放位置OS 钥匙串keychain。加密短语存放在键wallet.mnemonic下以工作区派生的用户 ID 为作用域wallet_user_id取 workspace 目录父级的最后一段见 ops_part_01.rs访问受钥匙串同意策略门控。降级方案workspace JSON。钥匙串不可用如 headless 环境时加密短语降级写入{workspace_dir}/state/wallet-state.json。加载时若 JSON 中存在秘密而钥匙串可用会被透明迁移进钥匙串并从 JSON 中剥离见 ops_part_01.rs。原子、加锁写入。wallet-state.json通过临时文件 sync_all 目录 fsync persist原子写入并在进程级WALLET_STATE_FILE_LOCK下执行损坏或非法状态文件会被隔离quarantine为…json.corrupted.ts而不是被信任ops_part_01.rs。仅签名时解密。链签名器只在为已确认交易派生密钥时才在核心内解密短语明文密钥从不落盘、从不经网络序列化。关于密钥托管与更广泛的隐私模型可延伸阅读 OS keyring secret storage 与 Privacy security。读取余额与链信息只读面只读接口无需确认包括状态onboarding 状态 安全的每链账户地址wallet_status余额每个账户的原生资产余额。目前只有 EVM 余额是实时读取的Ethereum 主网balances()还将 EVM 账户扇出为 Ethereum/Base/BNB Chain 三行余额见 execution_part_02.rs 与EVM_BALANCE_NETWORKS常量 execution_part_01.rs。BTC、Solana、Tron 会调用各自 provider但出错时回退为 0 余额 ProviderStatus::Missing状态execution_part_02.rs网络默认值 / 支持资产每链 RPC 与浏览器explorerURL、能力标志supports_broadcast/supports_token_transfers/supports_contract_calls与内置资产目录defaults.rs链状态每链就绪状态与当前生效的 RPC URLchain_status见 execution_part_01.rs。RPC 端点可覆写RPC 端点可按链/网络通过OPENHUMAN_WALLET_RPC_*环境变量覆盖映射如下defaults.rs环境变量作用对象默认端点OPENHUMAN_WALLET_RPC_EVMEthereum 主网https://ethereum-rpc.publicnode.comOPENHUMAN_WALLET_RPC_BASEBasehttps://mainnet.base.orgOPENHUMAN_WALLET_RPC_ARBITRUMArbitrumhttps://arb1.arbitrum.io/rpcOPENHUMAN_WALLET_RPC_OPTIMISMOptimismhttps://mainnet.optimism.ioOPENHUMAN_WALLET_RPC_POLYGONPolygonhttps://polygon-rpc.comOPENHUMAN_WALLET_RPC_BSCBNB Chainhttps://bsc-dataseed.binance.orgOPENHUMAN_WALLET_RPC_BTCBitcoinEsplora RESThttps://blockstream.info/apiOPENHUMAN_WALLET_RPC_SOLANASolanahttps://api.mainnet-beta.solana.com主网/https://api.devnet.solana.comdevnetOPENHUMAN_WALLET_RPC_TRONTronTronGrid RESThttps://api.trongrid.ioSolana 集群还可通过OPENHUMAN_SOLANA_CLUSTERdevnet切换至 devnet——该变量同时驱动 RPC 端点与 USDC SPL mint 地址确保 devnet 上的链上转账落到 devnet mintdefaults.rs。日志中的 URL 一律脱敏为 scheme hostrpc.rs避免完整查询串泄露。发送转账prepare → confirm → execute每一次写操作都是显式的两步流程钱包绝不一键发送Preparewallet_prepare_transfer/ RPCprepare_transfer校验金额、目标地址与代币场景的calldata估算费用返回带quoteId的预备报价prepared quote。报价存放在进程内存的QUOTE_STORE中TTL 5 分钟、上限 64 条重启后不保留execution_part_01.rs。prepare_transfer还会做地址格式校验委托tinywallet_bus校验四种链的收件地址execution_part_01.rs、非负整数金额校验execution_part_01.rs、EVM calldata 必须是0x前缀偶数长度十六进制execution_part_01.rs并在 BTC 上拒绝代币转账token transfers are not supported on Bitcoinexecution_part_02.rs。Confirm executeRPCexecute_prepared要求confirmed: true与有效的quoteId。报价在广播前被原子消费因此并发确认不可能双重提交失败时报价被恢复并刷新 TTL保持可重试execution_part_02.rs。execute_prepared的错误处理非常严谨确认标志缺失直接返回execute_prepared requires confirmed: true广播失败时通过store_quote恢复报价并重新计算expires_at_ms now QUOTE_TTL_MS避免网络超时耗尽原 5 分钟预算导致刚失败就过期。报价-所有者绑定quote-owner binding每个报价都绑定到准备它的聊天线程。只有同一所有者才能执行该报价一个泄漏到共享频道的quoteId返回与不存在无法区分的quote … not found错误防止其他会话劫持execution_part_01.rs 与take_quote_forexecution_part_01.rs。实现细节值得注意所有者通过APPROVAL_CHAT_CONTEXT任务局部上下文获取thread_idclient_id来自 Web 聊天的调用会带上 ownerCLI / 直接 JSON-RPC / 后台任务等非聊天调用者为None非聊天调用者只能执行同样以无聊天上下文准备的报价——这有意防止后台流程捡起交互用户的报价这类权限降级owner 检查发生在状态/过期检查之前保证错配时的错误形状与 not-found 字节级一致不构成泄漏quote_id的枚举预言机该机制依赖web_chat::run_chat_task中的内联.await链传播tokio::task_local!若未来工具循环被tokio::spawn脱离上下文而未重新 scopeowner 门禁会静默失效——这是 README Notes / gotchas 中特别标注的维护注意点。转账范围限定为原生发送与上表所列代币标准Bitcoin 拒绝代币转账Swap、跨链桥、通用合约调用在此不可用。交易状态追踪广播后三个只读检查器让 Agent 按哈希跟踪交易全部在 execution_part_02.rstx_status生命周期状态pending / confirmed / failed / not_foundTxState枚举execution_part_01.rs附带确认数与区块号tx_receipt回执详情成功标志、手续费、区块raw字段透传 provider 原始回执lookup_tx按哈希查询原始交易负载。三条链的实现各自独立EVM 走eth_getTransactionReceipt等 JSON-RPCBitcoin 走 Esplora RESTSolana/Tron 走各自 provider最终统一归一化为TxState。Agent 工具与审批安全Agent 通过六个工具触达钱包定义于 tools/工具用途wallet_statusonboarding 状态 账户地址wallet_chain_status每链就绪状态 当前 RPCwallet_prepare_transfer构建经过校验、已估算费用的报价wallet_tx_status按哈希查询交易生命周期状态wallet_tx_receipt按哈希查询交易回执wallet_lookup_tx按哈希查询原始交易注意Agent 没有任何执行转账的工具。Agent 可以准备报价但真正移动资金execute_prepared只通过 RPC 面完成且必须显式确认并通过所有者绑定检查。结合先 prepare 后 confirm流程与每线程报价绑定从机制上杜绝 Agent 静默花费资金见 src/openhuman/web3/wallet/README.md Agent tools 一节。与六个 Agent 工具对应钱包在wallet命名空间下注册了12 个 JSON-RPC 控制器method 形式openhuman.wallet_function见 schemas.rs 与 README RPC / controllers 表格status、setup、balances、network_defaults、supported_assets、encode_erc20_transfer、chain_status、prepare_transfer、execute_prepared、tx_status、tx_receipt、lookup_tx。其中encode_erc20_transfer提供 EVM 的transfer(address,uint256)calldata 编码原语abi.rs供构建 ERC-20 转账报价时使用。因为这些是金融操作应通过 approval gate 呈现给用户让人在资金移动前确认。请把每一次转账都当作高优先级操作对待。测试验证与实现佐证钱包的各类保证在测试中有完整覆盖execution_tests.rsquote_store_round_trips_and_expires验证报价存取、消费与过期语义execute_prepared_requires_confirmed_flag确认标志缺失被拒绝prepare_transfer_rejects_unknown_asset_symbol未知资产符号被拒绝balances_fans_evm_account_into_eth_base_bsc_rowsEVM 单账户扇出三行余额execute_prepared_broadcasts_native_evm_transaction/execute_prepared_broadcasts_erc20_transfer_using_default_token_catalog通过 axum mock RPC 完成原生与 ERC-20 广播全流程execute_prepared_broadcasts_native_evm_on_base_with_chain_id_8453验证链 ID 校验RPC 上报的 chain_id 与预期不符会拒绝见 chains/evm.rsowner 门禁行为通过insert_owned_quote固定 owner 的报价夹具在隔离环境中演练测试第 403-409 行附近。各链实现还有独立的测试文件btc_tests.rs、evm_tests.rs、solana_tests.rs、tron_tests.rs以及 defaults_tests.rs 覆盖网络默认值与资产目录。延伸阅读Approval gatePrivacy securityOS keyring secret storage钱包模块源码与模块文档src/openhuman/web3/wallet/README.md高层 DeFi 模块Swap/桥/合约调用不属于钱包面src/openhuman/web3/README.md【免费下载链接】openhumanOpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.项目地址: https://gitcode.com/GitHub_Trending/op/openhuman创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考