兑换争议取证:五个时钟,哪一个算数
一次兑换里同时跑着五个时钟:你的浏览器、我们的服务器、上游的价格锁、矿工写的区块头、池子的账本。2026-11-06 我们把每个时钟的误差都量了一遍——只有最后一个说了算。
兑换争议本质上是时钟之争,而被引用的那个时钟往往是错的。 9 月 24 日到今天 06:05 UTC,我们的订单表累计 151 笔——123 笔过期、21 笔完成、5 笔失败、2 笔退款——落在 142 个入金地址上。其中只有 23 笔存了截止时间,另外 128 笔从来没有,走的是站内 30 分钟兜底规则。这个比例解释了绝大多数「我按时付了」的争论:六笔单里有五笔根本没有上游截止时间可供申诉;有截止时间的那一笔,是十分钟,不是三十分钟。
第一个时钟是你能看见的那个,它属于你的设备。 订单页从不问服务器「还剩多久」,它拿到服务器给的截止时间,然后每秒减去一次你自己浏览器的 `Date.now()`,同时每 5 秒轮询一次状态。算术是精确的,输入不是。手机快 5 分钟,页面就多显示 5 分钟;笔记本慢 5 分钟,就少显示 5 分钟,而页面无法判断谁对。所以倒计时的截图几乎证明不了什么:它记录的是关于时间的一种意见,出具者正是提出主张的那台设备。
第二个时钟是我们的,也是唯一能摆到你面前的。 订单以毫秒落库;06:04:44 UTC 那一刻,源站系统时钟与 Cloudflare 的 `Date` 响应头落在同一秒内,说明基准没有漂。存了截止时间的 23 笔里,13 笔 ChangeNOW 单从建单到截止是 599.4–599.9 秒(中位 599.9),10 笔 FixedFloat 单中位 599.1 秒——两家互不相干的池子给出同样的十分钟。有一个例外值得点名而不是抹平:一笔 FixedFloat 单存的截止时间与建单时间戳逐毫秒相同,也就是 0 秒窗口,可它仍在 `waiting_deposit` 里躺了 2,402.7 秒,因为没有任何东西会在「有人读这一单」之前改写状态。
第三个时钟是价格锁,它比订单短。 06:06 UTC,100 USDT-TRC20 换 XMR 的报价返回 `validUntil`,距今 119.8 秒。同一个接口在 200、500、1,000、2,000、5,000 USDT 上返回的 `validUntil` 全是 null——不是锁得更短,是没有锁。报价路由还在服务端缓存 8 秒,所以这 8 秒内点两次,看到同一个数字是正常的。把三个常数放在一起读:屏幕上的价格两分钟后失效,由它建出的订单有十分钟入金窗口,而大约 130 USDT 以上根本没有上游价格承诺,只有你按下按钮那一刻重新报的价。 (XMR 换 USDT 退出路线)
第四个时钟是链,它不按你的时间走。 区块时间戳由挖出这个块的人写入,只受两条共识规则约束。比特币:必须大于前 11 块的中位数,且不超过节点时钟 2 小时;莱特币同样是 2 小时;Zcash 更紧,只能高于中位数 90 分钟、相对本地时钟 2 小时;门罗允许超前最近 60 块中位数 2 小时。06:05–06:06 UTC 实测:比特币最新块已经 1,866 秒「旧」,它的时间戳比 11 块中位数高 3,436.8 秒,15 个块的间隔中位 441.5 秒;莱特币最新块 623 秒旧、中位余量 424.5 秒;Zcash 最新块 840 秒旧;门罗最新块 109 秒旧,但比 60 块中位数高 3,847 秒。也就是说,区块时间戳完全可能离币真正移动的时刻差一小时。 (Zcash 与门罗 2026 对比)
第五个时钟是池子的账本,也是唯一说了算的那个。 入账时,上游用的是它自己的到账时间——不是你的截图,不是区块头,也不是我们这行记录。这就是为什么 123 笔过期单里有 90 笔标的是 `local_timeout`:是我们自己的窗口到点关掉的,上游压根没说过期。反过来也成立:11 月 3 日 09:28:17 UTC 建的一笔已完成订单,最后一条记录比它自己的截止时间晚了 259 秒,仍然是 paid;同一天早上另一笔退款单,从建单到 refunded 只用了约 40 秒。所以「迟到」是上游的决定,不是算术结论——你能控制的只有一个输入:广播的那一刻。
如果预计要理论,留四样东西。 第一,发送那一刻从你自己钱包里复制的 txid,加上钱包自己的时间戳——这是你从头到尾唯一拥有的时钟。第二,它被打包的区块高度和那个块的时间戳,能把「网络看见它」的时刻定位到一小时以内;同时注意订单接口只返回截止时间、从不返回建单时间,所以窗口的起点必须你自己留证。第三,建单当时页面上的订单号和入金地址,不要用几小时后的截图。第四,如果争的就是截止时间本身,录屏而不是截图——因为每次轮询都会重读上游的 `validUntil` 并覆盖已存的值,屏幕上那个数字并不保证还是你最初看到的那个。
五条规则,加一个工程上解决不了的边界。 建单第一分钟内截图,趁入金地址和截止时间还同屏。把 txid 和订单号放在同一条消息里发给客服,不要等对方回一句再补。用一个会给自己的广播打时间戳的钱包——「我记得是 06:09 发的」不是证据。区块时间戳按「误差一小时」对待,不要按秒。金额大到报价不再带截止时间时,默认价格会在报价与下单之间移动——这是定价事实,不是时钟事实。边界在这里:没有任何公开来源告诉你池子何时入账。我们能给出 `created_at`、`valid_until`、过期写入时间和区块;上游内部的入账时间永远在它那边,而真正吵起来时,所有人争的就是那个数字。本文数据快照:06:02 UTC 目录 436 个资产、64 条网络;XMR 现货 617.74 美元;100 USDT-TRC20 报 0.14208343 XMR(折 703.8 美元/XMR,属锁价档),1 XMR 报 612.143 USDT。价格每分钟都在动,时钟的结构不动。 (XMR 换 USDT 退出路线)