小王同学 - 2020年2月 https://feelncut.com/2020/02/ 希望通过自我加工,成为有点用的人 EOS 提交交易失败分析 https://feelncut.com/2020/02/02/288.html 2020-02-02T12:53:00+08:00 [TOC] EOS 向节点提交交易时失败,提示 billed CPU time (Y us) is greater than the maximum billable CPU time for the transaction (X us). 本文通过分析源代码来一探这个失败的原因,首先给出结论: - 当前时间窗口内(24小时)用户**最大** CPU 时间 = 全网总 CPU 时间 * 当前用户质押 EOS 数量 / 所有用户质押 EOS 数量 - 当前时间窗口内用户**可用** CPU 时间 = 当前用户**最大** CPU 时间 - 当前用户已经使用 CPU 时间 - 当前用户**已经使用** CPU 时间是实时变化的:(1 - t / 24) * t 时间之前使用的资源大小,直到距离上次 CPU 资源使用 24 小时后(t = 24)完全恢复 - Get Account 接口看到的不是实时可用的资源使用量,而是上一笔交易之后缓存的资源使用量 - 向 RPC 节点提交交易时 RPC 节点会计算出当前交易 CPU 使用量,这个 CPU 使用量和当前 RPC 节点 CPU 使用情况有关,通过系统计时器计算时间,因此,RPC 节点计算出的交易 CPU 使用量不是最终上链时的交易使用量,最终交易时的 CPU 使用量由打包节点决定。 - 因此,当质押 CPU EOS 数量固定时,向 RPC 节点提交交易时,CPU 资源需要满足 交易使用 CPU 资源的大小 [...]