一、命令行后面藏着一条 HTTP 请求
bitcoin-cli 做的全部工作,是把你的命令组装成一条 JSON-RPC 的 HTTP 请求,发给节点的 RPC 服务端口,再把返回的 JSON 原样打印。理解这一点,开关的意义就清楚了:它们改变的是请求发到哪个地址、参数怎么编码,而不是节点的行为本身。节点端的规则一个字都没变,变的只是你在门口怎么报名字。

二、-rpcwallet:同一条命令送进哪个钱包
一个节点可以同时装载多个钱包,每个钱包在 RPC 服务上对应一个专属端点,形如 http://127.0.0.1:8332/wallet/<钱包名>。-rpcwallet=<钱包名> 就是把请求发往这个带名字的端点;不指定时,命令走默认端点。当节点装载了不止一个钱包,而命令又需要钱包上下文(比如 getbalances、sendtoaddress),不指定钱包就会被节点拒绝,提示你指明目标。所以排障时看到”命令不认识”多半是路由问题:钱包名要和 bitcoind 启动参数 -wallet= 完全一致,大小写和下划线都不能差。这个名字还要钱包当前处于已装载状态——磁盘上有钱包目录不等于它在服务,用 listwallets 看一眼比凭记忆猜快得多。
三、-named:把参数名写进命令
RPC 参数是按位置排列的,中间留空位要靠连续的空字符串占位,抄写时错位一位就是静默的错单。-named 开关让你改用”参数名=值”的写法,比如 bitcoin-cli -named createwallet wallet_name=审计专用 avoid_reuse=true load_on_startup=true,想跳过的参数直接不写,由节点按文档默认值补齐。官方文档里所有”具名参数”示例用的就是这种写法。脚本里尤其值得坚持:位置参数在版本升级中可能被插入新项,具名参数对顺序变化更耐受。
四、-stdin 家族:让口令不进历史记录
-stdin 让 cli 从标准输入按行读取剩余参数,读完为止;-stdinrpcpass 和 -stdinwalletpassphrase 分别把第一行输入当作 RPC 口令、钱包口令。官方帮助文本明确写着这条路”推荐用于口令等敏感信息”。原因很实际:写在命令行里的口令会进入 shell 历史记录,执行期间还会出现在操作系统的进程列表里,同机其他进程一眼可见。用管道喂口令(例如 echo 后接管道)在多数 shell 里仍会留痕,正式做法是交互式输入或从权限收紧的文件重定向。
五、-rpcwait:跟”节点还没醒”和解
节点启动后要先生成 Cookie 鉴权文件、装载钱包,RPC 服务才就绪。脚本开机自启时最常见的失败就是跑得太早。-rpcwait 让 cli 在收到”服务未就绪”类错误时反复重试而不是立即报错退出,-rpcwaittimeout=<秒> 控制最多等多个节点启动完成、0 表示不限。两者配合 systemd 或登录脚本,比”睡十秒再试一次”的土办法更可靠,因为等待的判据是节点真实状态而不是猜的秒数。
六、哪些事这些开关管不着
最后划清边界:以上开关都只影响请求怎么发,不改变任何共识规则或钱包行为;它们也不提供任何加密通道——RPC 连接默认只监听本机回环地址,跨机器调用属于另一套要谨慎评估的配置。cli 另有一个不走远程调用的本地面板 -netinfo,直接读本机日志聚合对端连接表,断网时也能看连接状况,适合做故障现场的第一手取证。命令行与节点端各管一半,弄清这条分界线,大多数”命令时灵时不灵”的困惑就有了答案。
补充:一次典型排班的写法
把几个开关拼起来看一个真实场景:为两个钱包各导出一次余额并落到日志。正确写法是给每个钱包各发一条带 -rpcwallet= 的命令,参数用 -named 写全,脚本里不出现任何口令——RPC 鉴权交给 Cookie 文件自动完成。错误写法是把两条命令都用默认端点跑,指望节点替你猜钱包,或图省事把 RPC 口令写死进命令行。前者在单钱包节点碰巧能跑,多钱包后静默出错;后者等于把钥匙挂在必经之路上。命令行的每一条参数都值得用”谁在读它”的视角复查一遍,这个习惯的收益远大于记忆任何单个开关。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。