原因分析:
2012.1.21, 更换 bitcoind.
版本 0.3.24 (with 0001-bitcoin-4diff.patch) 到 0.5.99(built from git)
注意到 patch 后 hub mode 的存在有助于更快的获取新 block, 但这不是最后一根稻草.
---
协议和 debug.log 的分析:
https://en.bitcoin.it/wiki/Protocol_specification#inv新 block 的发现者要广播 inv 消息, 说明自己发现了一个 block (tx 同).
(但收到 inv 消息的客户端只知道有 block 出现, 不知 block 的内容)
客户端广播 getdata 消息获取所有未知的 inv.
获取之后检测其正确性, 并处理新 block.
问题出在 getdata 不成功之时.
The code attempts to limit redundant requests to every 2 minutes for the same block by using a map called mapAlreadyAskedFor to delay the message if necessary.[6]
---
https://en.bitcoin.it/wiki/Satoshi_Client_Block_Exchange修复: 暂时将重试时间从 120s 改为 10s.
(但对普通 tx 不应使用本项, 需要再调整. 判断为 Block 类型则改为 5s 或更低.)
src/net.h:
// Each retry is 2 minutes after the last
- nRequestTime = std::max(nRequestTime + 2 * 60 * 1000000, nNow);
+ nRequestTime = std::max(nRequestTime + 10 * 1000000, nNow);