作者:李火华 / 来源:白话区块链
9 月 14 日,一款名为“EOSPlay”的 DApp 游戏遭遇了新型随机数攻击,一共损失了数万个 EOS。
或许很多人对「随机数攻击」这个词已经司空见惯了,因为在 DApp 遭遇黑客攻击的事件中,随机数攻击占了很大一部分,很多 DApp 的随机数被黑客破解了。
你或许会问,随机数不是随机的吗?随机意味着不可预测,为什么还会被黑客破解呢?
这还得从随机数说起。
随机数可以分为真随机数和伪随机数。真随机数需要同时满足随机性、不可预测性、不可重现性,而伪随机数只需要满足随机性,或者是随机性和不可预测性即可。
真随机数只存在于物理世界中,一般需要通过物理手段(包括量子过程)获得,比如我们日常见到的抛硬币、掷骰子,生成的随机数就是真随机数。但是,抛硬币、掷骰子这种随机数生成方法的缺点非常明显,那就是耗时、耗力,而且也无法满足现代的计算机世界对随机数的需求。
因为效率的缘故,现代的计算机软件主要依赖伪随机数。最早的伪随机数生成器由 20 世纪最重要的数学家之一冯·诺依曼创造,通过一个确定的随机数种子,由确定的算法生成伪随机数序列。现在的主流计算机编程语言,默认的是将 1997 年发明的梅森旋转算法作为生成伪随机数的方法。
伪随机数最大的缺陷是,只要种子不变,生成的伪随机数序列也不会变。换句话说,只要你能拿到种子,你就可以破解随机数。
计算机生成伪随机数的过程,或多或少与这台计算机的物理状态或运算状态有关。也就是说,同一套随机数算法,不同的计算机,或是同一台计算机在不同的时刻,生成的随机数是不一样的。
然而,这种传统的计算机伪随机数生成方法虽然足够安全,却并不适用于区块链。区块链是一个分布式的系统,同一个 DApp 在不同的节点上运行,采用的随机数必须要一致,这样才能让各个节点进行验证。所以,DApp 的随机数来源,不能是运行这个 DApp 的计算机自动生成的,因为这样的话,不同的节点计算机运行的结果就不一样了。