协议演进 / 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(解答)。握手顺序被小幅改动:
- 连接方可以在
version消息之前先发一个solution; - 若该解答满足本地节点的要求,就给予连接;若不满足(未知、错误等),本地节点发一个新的
challenge并关闭连接; - 若连接方没有先交解答、而该连接又被标记为需要 POW,本地节点同样发
challenge并关闭连接。
注意这套流程是“发完挑战就断开”:解不解、解完是否重连,都由收到挑战的节点自行决定——它也可以丢弃挑战,去找别的对等节点,或者等对方空出免费槽位。
4.3 挑战里有什么
一份挑战由四部分组成:POW 规范(一个或多个可串联的 POW 算法标识符及各自参数)、用途标识符、过期时间(UNIX 时间戳),以及让发出方日后能验证挑战真伪的签名。用量标识符目前只有 1 号:connect(建立对等连接)。
防自我 DoS 的细节很关键:节点生成挑战后签名、发出、随即丢弃,自己并不保存未解挑战。收到解答时才验签,并把已解挑战的哈希连同过期时间存入一张已解名单(每次插入时清理过期项)。原文解释:若节点要跟踪所有未解挑战,攻击者可以靠海量索取挑战把节点内存耗尽——挑战机制本身反而成了 DoS 入口。签名加丢弃,使节点只需保存“已被解出且未过期”的那一小部分。
4.4 两种 POW 算法
原文定义了两个 POW 标识符:
- 1 号 sha256:常规思路——把 nonce 填入给定数据,使其哈希满足目标值(target,以类似区块 nBits 的紧凑形式给出);另有一种 nonce 长度为零的“大 nonce”模式,整段输入本身就是尝试,解不出就只能换输入,它用于充当串联中后一级算法的前置层。
- 2 号 cuckoo-cycle:在大型随机图中找小环的图论工作量证明。原文强调它是 memory-hard(吃内存)的,这会大幅提高制造专用硬件的复杂度与成本,正适合抗 DoS 场景;在原文给定的参数(sizeshift 28)下,单次求解约需 150G 时钟周期量级与约 48M 内存。
多个 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 状态,这套机制并未成为网络的实际规则。
七、延伸
- 阅读版:https://bips.dev/154
- 官方原文:https://github.com/bitcoin/bips/blob/master/bip-0154.mediawiki
- 相关:原文未列前后任或依赖 BIP;其参考实现与测试向量见官方原文的 Reference implementation 与 Test vectors 两节
- 仓库总目录:https://github.com/bitcoin/bips
