当两条分叉链在同一个高度、同一份累计工作量上打平,节点靠什么决定承认哪一条?默认规则里有一条朴素的偏好:先看到的那条赢,后到的等价块被忽略。preciousblock 就是手动改写这个”先看到优先”偏好的按钮——它把某个块标记成”假设它比其它等价块先收到”,让节点在这一轮里偏向选中它的链。命令定义在 src/rpc/blockchain.cpp。
帮助文本里的三条承诺
源码把语义写得很清楚。第一条:把一个块当作好像是在其它同等工作量的块之前收到的。第二条:后一次调用可以覆盖前一次调用的效果——你改主意见异,再点一次就行。第三条:这个效果不会在重启后保留。三条合起来界定了它的性质:它是运行期、可反复覆盖、且重启清零的临时选链偏好,不是把某条链写进数据库的永久裁决。参数只吃一个块哈希,无返回内容。

它和 invalidateblock 的本质区别
最容易混的是 invalidateblock。两者都影响节点”此刻选哪条链”,但机理相反。invalidateblock 是把某个块及其后代拉黑,逼节点绕开这条分支、去承认另一条;它是排除法。preciousblock 不做任何排除,它只在两条工作量完全相同的链之间调一下”先到先得”的天平:我不说另一条错,我只说这个块我优先认。所以在有明确坏块、可疑块要回避时用 invalidate 语义;在两条都合法、纯粹是等价分叉要选边时用 precious 语义。搞反方向会导致你手动干预了本不该干预的分叉。
什么时候真的需要它
绝大多数节点一辈子用不上它。它的正当场景很窄:节点同时收到两个等价的顶端块,因为网络到达顺序碰巧选了你不希望的那条,你希望在不拉黑任何块的前提下,让这台节点把活动链切到另一条等价分支上,例如配合某个诊断或回滚实验。它是运维在平局局面里的一个手动拨盘,带副作用(会重新组织活动链、触发一次重org式的效果)。
使用边界与风险
因为效果重启即失效,别把它当持久配置,也别指望它替你解决持续的选链分歧。它只在平票(等量工作量)时有意义——如果两条链工作量并不相同,节点本就该按累计工作量最大的那条走,这时手动 precious 一个工作量更低的块,是在和共识主规则较劲,容易制造比原始分叉更麻烦的不一致视图。把它归入”手动选链调平”这一族(和 verifychain、invalidate/reconsider 同族),只在明确知道自己在处理等价分叉、且能在验证后撤销影响时使用,用前在非资金环境演练。
帮助文本承诺的三条语义
源码把行为写得非常克制:第一,把指定块当作好像比其它同等工作量块更早收到;第二,后一次调用可覆盖前一次,反悔就再点一次另一块;第三,效果不跨重启保留。参数只有一个块哈希、无返回值,哈希在索引里查不到直接报错。三条合起来界定了它的量级——一次运行期偏好微调,不写库、不改区块状态。与它最易混淆的是 invalidateblock:拉黑是排除法,该块及其后代被拒绝、节点被迫转向其它分支,适用于确定坏块或可疑分支;precious 是偏好法,不排除任何东西,只在两条工作量完全相等的链之间拨动”先到优先”的默认倾向。所以它只在平局里有意义——两条分支工作量不同时无效甚至有害,那属于和共识主规则较劲,只会给这台节点制造逆序视图。正当场景集中在诊断与演练:节点因消息到达顺序碰巧选中你不希望的活动链,而两条链都合法。用完重启即可回到默认判链,或再次调用调回。本文讨论选链机制,不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。