协议演进 / BIP/比特币改进提案 / BIP-154

BIP-154 经由对等节点指定挑战的速率限制

连接槽位紧张时,要求新入站对等节点先解一道由对方指定的工作量证明挑战,以抬高女巫与洪泛攻击的成本。本 BIP 目前处于已关闭状态。

一、档案卡

档案卡
编号BIP-154
标题Rate Limiting via peer specified challenges
作者Karl-Johan Alm <[email protected]>
指定日期2017-04-12
层级Peer Services(对等服务)
类型Specification(规范类)
状态Closed(已关闭)
阅读版https://bips.dev/154
官方原文https://github.com/bitcoin/bips/blob/master/bip-0154.mediawiki

二、放在哪一族

对等网络的抗拒绝服务(anti-DoS)与连接管理一族。它不处理交易、区块或地址的传播格式,只处理一件事:当一个节点的入站连接名额成为稀缺资源时,凭什么决定谁能占用。

原文文件头没有 Replaces、Requires 等关系字段,也没有指定前后任文档;它的自洽性很强——挑战的用途标识符(Purpose Identifier)目前只定义了“建立对等连接”一种,原文预想未来可为布隆过滤等同样有 DoS 风险的操作再增加用途,但那属于设想,并未在本 BIP 中定义。

同族的参照是节点既有的连接上限与驱逐逻辑:BIP-154 是在那套逻辑之上加一道“付费插队”的门,而不是替换它。

三、它要解决什么

原文 Motivation 给出的前提是:比特币网络的连接数有上限(原文写作入站与出站合计最多 125)。用一批傀儡节点把连接打满既 trivial 又便宜,后果有二:

网络处在这种受压状态时,就容易进一步遭受女巫攻击(Sybil attack)等后续攻击。

设想的对策是:受压时,节点仍可接纳新连接,但要求来访对等节点先完成某种工作量证明(proof of work),以证明自己不是在简单地刷连接。攻击者此时必须为“免费槽位之外”的每一个连接真实付出算力,女巫攻击的成本被大幅抬高。

但这里有一个关键约束:不能直接套用比特币区块所用的双 SHA256 工作量证明。因为攻击者可用专用硬件(ASIC 等 SPH)极大加速求解;若为了抵消这种加速而提高证明权重,普通节点在通用硬件(桌面电脑等 GPH)上又要付出不可接受的代价。因此原文另行引入对专用硬件不那么敏感的工作量证明算法,并说明:此事不涉及共识,将来可以再增加其他 POW 算法。

四、规则本身

4.1 两种槽位:免费与付费

支持本机制的节点设定两个上限:连接总数(入站上限由此减去出站与 feeler 连接数得出),以及 POW 连接槽位数——即入站连接中有多少个名额必须凭工作量证明换取。其余名额即“免费连接槽位”,照旧先来先得。

4.2 握手流程:先发挑战,再断开

节点须能处理两种新消息:challenge(挑战)与 solution(解答)。握手顺序被小幅改动:

注意这套流程是“发完挑战就断开”:解不解、解完是否重连,都由收到挑战的节点自行决定——它也可以丢弃挑战,去找别的对等节点,或者等对方空出免费槽位。

4.3 挑战里有什么

一份挑战由四部分组成:POW 规范(一个或多个可串联的 POW 算法标识符及各自参数)、用途标识符、过期时间(UNIX 时间戳),以及让发出方日后能验证挑战真伪的签名。用量标识符目前只有 1 号:connect(建立对等连接)。

防自我 DoS 的细节很关键:节点生成挑战后签名、发出、随即丢弃,自己并不保存未解挑战。收到解答时才验签,并把已解挑战的哈希连同过期时间存入一张已解名单(每次插入时清理过期项)。原文解释:若节点要跟踪所有未解挑战,攻击者可以靠海量索取挑战把节点内存耗尽——挑战机制本身反而成了 DoS 入口。签名加丢弃,使节点只需保存“已被解出且未过期”的那一小部分。

4.4 两种 POW 算法

原文定义了两个 POW 标识符:

多个 POW 可以串联(pow-count 大于 1):后一级的输出被拼到前一级的输入上,原文给出的典型组合是 SHA256(cuckoo-cycle(…))——先解布谷鸟循环,再对结果作 SHA256 并要求小于目标值。

4.5 难度随压力浮动,成本可预先估算

挑战不是一律同难。节点按本地连接占用估算“压力”(pressure,0 到 1),难度随压力上升:原文示例中,SHA256(cuckoo-cycle) 组合在压力 0 时的预期求解时间约 45 秒,压力 1.0 时升到约 11 分 55 秒。

收到挑战的一方要能判断“这题值不值得解”:原文给出一套按各算法成功概率与工作量参数估算期望耗时的方法(并取每秒周期数 1.7e9 作固定近似)。若预计解完时挑战已过期,或预计耗时超过按对端价值设定的阈值(白名单或 -addnode 的节点阈值更高),应立即丢弃挑战。发出方则给过期时间留足余量:原文公式为当前时间加 600×(1+pressure) 秒,即最弱挑战 10 分钟过期,最难的 20 分钟。

向后兼容:不支持本机制的对等节点会忽略 challenge 消息并被断开,效果等同于正常撞上连接上限。原文附有参考实现链接与完整的测试向量(包括布谷鸟循环与串联组合的样例挑战、解答及序列化示例)。

五、谁必须动

普通持币人:无直接动作。不改变交易、地址与确认规则。

全节点(连接策略):本 BIP 的实现主体。需划分免费与 POW 槽位、生成并签名挑战、验签并维护已解名单、按压力设定难度;作为连接方时,需能评估挑战成本并决定解题、换对端还是等待。

钱包开发者:一般不涉及;只有自带完整 P2P 连接逻辑的实现才需要处理 challenge/solution 消息。

矿工与共识层:完全不动。这里的“工作量证明”只是连接层的一次性门票,与挖矿的工作量证明、难度调整和区块有效性没有任何关系。

六、现在算不算数,以及一个常见误读

状态为 Closed(已关闭)。按现行 BIP 状态体系,这意味着该提案已被关闭,不再是有效的现行规范——它没有走到 Deployed(已部署)。因此今天连接比特币节点时,不会遇到按 BIP-154 发来的 POW 挑战;节点抗连接洪泛靠的是各实现自身的连接管理与驱逐策略,而不是这套挑战协议。读它的价值在于看清一个具体方案:如何让“稀缺连接名额”按算力成本分配,以及为什么选算法时必须考虑专用硬件的不对称优势。

常见误读:

“BIP-154 是给比特币再加一种挖矿算法,节点要先‘挖矿’才能联网,等于改了共识。”

不对。它借用了工作量证明这个工具,但用途完全不同:挑战由单个节点为单次连接临时出题、签名、限时,与全网共识无关;解出挑战不产生区块、不产生奖励、不改变任何交易或区块的有效性。何况该 BIP 已是 Closed 状态,这套机制并未成为网络的实际规则。

七、延伸

本页内容整理自 bitcoin/bips 仓库与 bips.dev,事实已与仓库核对;解读仅供学习参考。