ZooBC 维基
交易

有效期与时间戳

每笔 ZooBC 交易都在其签名字节中携带创建它的时刻,以 Unix 秒计。这个时间戳开启一个有效窗口:区块只能在窗口内打包该交易,窗口过后交易即告失效,必须重新签名。这个窗口保护的是签名者。在繁忙时刻未能进入区块的付款不会滞留数天、然后让签名者措手不及;它只是过期,签名者可以重新决定。

默认窗口:一小时

默认情况下,区块可以在交易时间戳之后 3,600 秒内打包它:即一小时,按每 15 秒一个区块计为 240 个区块。超过之后,节点会拒绝它,返回的消息以“...sign it again”(请重新签名)结尾。

窗口还有一个前沿。时间戳超前 3,600 秒以上的交易同样会被拒绝,并附带检查签名者时钟的提示。这能发现时钟不准的设备。

从交易时间戳开始的时间轴:一小时以内的绿色区段表示区块可以打包它,其后是红色区域,另有一条延伸到 24 小时的虚线区段表示版本 3
从交易时间戳开始的时间轴:一小时以内的绿色区段表示区块可以打包它,其后是红色区域,另有一条延伸到 24 小时的虚线区段表示版本 3

选择窗口:版本 3

版本 3 交易紧接在手续费和存续字段之后携带一个 4 字节的到期字段,以秒为单位声明自己的窗口:

  • 0 表示默认的一小时;
  • 更小的值会缩短窗口,适用于必须尽快完成、否则干脆不做的付款;
  • 允许的最大值是 86,400 秒,即一天;更大的值会被拒绝。

版本 1 或 2 的交易没有到期字段,如果仍然声明了有效期,就会被拒绝。无论哪个版本,最多超前未来一小时的限制都依然适用。

当收集签名需要时间时,更长的窗口很有帮助:例如在硬件钱包上,或在多重签名账户的参与方之间。

交易池和链如何跟上

两条配套规则让长达一天的窗口变得安全:

  • 节点的交易池按每笔交易自己声明的窗口来保留它;
  • 每条链都把交易 id 保留至少 25 小时:即最长窗口加上一小时的未来容差。

由于节点会拒绝已经确认过的 id(见 签署交易),一笔交易在仍然有效时永远不可能被重放。

从时间戳开始的标尺,在 1 小时(默认值)、24 小时(上限)和 25 小时(id 的保留时长)处有刻度,24 小时之后为红色区域
从时间戳开始的标尺,在 1 小时(默认值)、24 小时(上限)和 25 小时(id 的保留时长)处有刻度,24 小时之后为红色区域

区块中的时间

区块也按相同的窗口来检查,因此每个节点都会得出相同的结论:

  • 区块的时间戳晚于某笔交易的时间戳加其窗口时,该区块无效;
  • 区块携带的交易时间戳比区块晚 3,600 秒以上时,该区块同样无效。

有些结算会逐个区块自动发生:托管的截止期限、流动支付的完成、定时转账的到期、市场上挂单的过期,以及手续费投票的各个阶段。它们读取的是前一个区块的时间戳,而不是本区块自己的时间戳。因此出块者无法把自己的区块时间戳稍微提前,从而把某笔付款拉进该区块。

区块在时间上如何间隔,见 区块与时间。

另见