排查比特币节点的网络问题时,bitcoin-cli getpeerinfo 是最常被敲下的一条命令:它返回一个数组,每个元素对应一台当前连着的对端,塞了几十个字段。麻烦也在这里——身份、流量、时钟、同步进度四类信息混在同一个对象里,字段名又都短,读错一格就可能得出完全相反的结论。本文按比特币核心 v31.0 源码里该命令的字段定义,把这份档案分格拆开。
身份与来路:这台对端是谁
id 是本机给连接编的流水号,只在本次运行内有效。addr 是对端的地址加端口;addrbind 是本机这条连接绑定的本地地址;addrlocal 则是对端在握手时自报的”我看到的我的公网地址”——注意它是对方说的,不是你验证出来的,伪造成本为零。network 标注这条连接走的网络(ipv4、ipv6、onion、i2p 等)。如果配置过 -asmap,还会多出一个 mapped_as 字段,显示按 ASN 映射表解析出的自治系统号,它是节点给对端分组 Diversify 的依据之一。
version 是对端自报的协议版本号,subver 是它的用户代理字符串。这两个值都由对方自己填写,只作参考。inbound 区分连接方向:true 表示对方连进来。connection_type 是更诚实的一格,它记录的是这台对端在你连接池里的岗位类型,由本机自己判定,与自报无关。permissions 数组列出你授予这台对端的特殊权限,比如 noban、relay 等。

流量与时间:这条线一直在干什么
bytessent 与 bytesrecv 是连接建立以来的总量。想知道流量被哪类消息吃掉,看 bytessent_per_msg 和 bytesrecv_per_msg 两个按消息类型聚合的字典:源码注释写明,没出现在字典里的类型意味着零字节,而且只有已知类型会作为键出现。时间侧有一排字段:conntime 是连接建立时刻,lastsend、lastrecv 是最后收发时刻,last_transaction、last_block 分别记录从这台对端收到最后一笔有效交易和最后一个区块的时间。时钟层面 timeoffset 显示本机与对端报时的偏差秒数。
活性探测:三格 ping 的分工
pingtime 是最近一次往返时延,minping 是历史上观察到的最小值,pingwait 则只在有未应答的探测时非零——它表示本机已经发出 ping、还没等到 pong 的等待时长。排查”连接看着在、实际卡死”的场景时,pingwait 持续偏大配合 peertimeout 的超时机制一起看,比只看 pingtime 有用。
同步与中继进度:链与交易的视角
synced_headers 和 synced_blocks 分别是这台对端与你共同的最新区块头高度和区块高度,两者都可能是负一,表示还没有公认的公共高度。inflight 数组列出你正在向这台对端索取的区块高度,空数组加上同步高度落后,通常说明该换对端而不是换硬盘。startingheight 从 v31 起默认不再返回,只有传 -deprecatedrpc=startingheight 才保留,脚本读它前先确认版本。
交易中继面有三格值得关注。relaytxes 说的是本机是否向这台对端转发交易;minfeefilter 是对端通过 feefilter 消息声明的费率下限,低于它的交易本机不会为它向这头喇叭;addr_relay_enabled 表示这条连接是否参与地址中继,配合 addr_processed(处理过的地址总数)与 addr_rate_limited(因限速被丢弃的数量)可以量化地址限速阀的工作情况。紧凑块侧还有 bip152_hb_to 与 bip152_hb_from,标记双向的高带宽压缩块伙伴。v31 的内存池改成簇结构后,档案里多了两格新的:last_inv_sequence 是该对端最近一次 inv 通告对应的内存池序列号,inv_to_send 则是你排队等向它公告的交易条数——发现某台对端 inv_to_send 长期高企,说明通告队列在它身上消化不动。
三条实用读法
第一,交易广播不出去时按这个顺序看:relaytxes 是否关着、minfeefilter 是否高于你的费率、inv_to_send 是否堆积,三格全正常才轮到怀疑费率估算本身。第二,同步停滞时对比 synced_headers、synced_blocks 与本机高度,再查 inflight 是否有进有出。第三,这台对端值不值得信任,看 connection_type、permissions 与 addrlocal 的组合,别拿 subver 当身份。
一个字段表的保质期问题
对端档案的字段集合是三块内容里最活跃的部分:v31 刚刚因为簇内存池上线了通告队列的两格读数,又因为弃用纪律收回了 startingheight 的默认输出;往前数几版,连接岗位类型、地址限速计数也都是后来加的。跨版本运行的监控脚本,最稳的写法不是背字段清单,而是把每格都按”可缺失”处理:读到就用、缺了就跳过,再配一条字段集合变化的告警,这样升级节点那天,仪表盘会先于报警群告诉你哪里变了。
风险提示:本文以比特币核心 v31.0 源码为基准,字段集合与默认行为可能随版本调整,请以你实际运行版本的 RPC 帮助与源码为准。内容为技术说明,不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。