你知道:两个比特币区块之间的预期时间平均是\(10\)分钟。 现在您正在进行一项重要的比特币交易,并急切地等待它是否以及何时出现在下一个区块中:
e50bfacc95975a4e7545d83d8954645f
由于您没有检查前一个区块何时完成,您实际上预计平均等待时间为\( \frac{t}{2} = \frac{10}{2} = 5 \)分钟。 \(5\)长时间过去后,检查最后一个块何时实际完成:
e50bfacc95975a4e7545d83d8954645f
最后一个区块在\(7\)分钟前已经完成。 既然知道了这些信息,预计时间从\(5\)分钟变成了总共\(10\)分钟。 这意味着:在大约\(3\)分钟内,它可能会到此为止。 你一遍又一遍地发出命令。 等等。 再过\(10\)分钟后,您会觉得有些不对劲。
但后来你记住了 等待悖论:
如果公交车平均每\(t\)分钟运行一次,随机到达公交车站的等待时间不对应\(\frac{t}{2}\)分钟,而是在指数分布的情况下距离\(t\) 。
比特币区块的出现是一个泊松过程,因此呈指数分布。 由于泊松过程是无记忆的,因此下一个区块也平均在\(10\)分钟内完成。 这总是适用的——不管我们已经等了多久。 无记忆的性质在时间上前后适用。
怎么可能?
为此,我们考虑以下两个语句:
- A) 两个区块之间的实际平均等待时间是\(10\)分钟,而不是\(20\)分钟。
- B) 如果选择一个随机时间点,我们预计前一个区块\(10\)分钟过去,下一个区块\(10\)分钟。 所以我们可以预计块之间的等待时间为\(20\)分钟。
我们检查这两个陈述。
为此,我们首先将相关数据,特别是区块完成的时间提取到一个 TXT 文件中(使用基于bitcoind的本地运行的完整节点执行):
e50bfacc95975a4e7545d83d8954645f
这为我们提供了以下文本文件,我们现在进一步处理并存储在/time.txt 中。 以下Rust程序与/Cargo.toml文件一起用于此目的:
e50bfacc95975a4e7545d83d8954645f
文件/src/main.rs包含实际的测试逻辑:
e50bfacc95975a4e7545d83d8954645f
我们安装依赖项,构建程序并启动它:
e50bfacc95975a4e7545d83d8954645f
事实上,当我们分析输出时,这两个陈述都是正确的:
e50bfacc95975a4e7545d83d8954645f
这也可以直观地解释如下:如果出块时间变化很大,则具体的等待时间会发生变化——如果我们在随机的时间点进行交易,那么我们最终在一个区间内的概率更高等待时间超过 10 分钟是因为这些间隔也因为更长的时间而在时间线上占用更多空间。